ฉันจะหยุด Ansible จากการเขียนรหัสผ่านไปยังล็อกไฟล์ได้อย่างไร


22

ฉันกำลังตั้งค่าเซิร์ฟเวอร์ MySQL และต้องการให้ Ansible ตั้งmysql-rootรหัสผ่านระหว่างการติดตั้ง

ด้วยความช่วยเหลือของอินเทอร์เน็ตฉันมาด้วยวิธีนี้:

- name: Set MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
  apt: pkg=mysql-server state=latest

mysql_root_pwdเป็นตัวแปรที่โหลดจาก Ansible Vault สิ่งนี้ทำงานได้ดี แต่ตอนนี้บนเซิร์ฟเวอร์มีหลายบรรทัดในบันทึก:

Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None

ฉันจะหยุด Ansible จากการเขียนรหัสผ่านข้อความธรรมดาไปยังไฟล์บันทึกได้อย่างไร

คำตอบ:


28

ในการป้องกันไม่ให้งานที่มีข้อมูลลับถูกบันทึกใน syslog หรืออื่น ๆ ให้ตั้ง no_log: true กับงาน:

- name: secret stuff
  command: "echo {{secret_root_password}} | sudo su -"
  no_log: true

การทำงานของงานจะยังคงถูกบันทึกไว้ แต่มีรายละเอียดเล็กน้อย นอกจากนี้โมดูลที่ใช้จะต้องรองรับ no_log ดังนั้นทดสอบโมดูลที่กำหนดเอง

ดูคำถามที่พบบ่อย Ansibleสำหรับรายละเอียดเพิ่มเติม สามารถนำไปใช้กับเพลย์บุ๊คทั้งเล่มได้ แต่เอาต์พุตจะน่ารังเกียจเล็กน้อยด้วย "เซ็นเซอร์!" ข้อความ


2
เหนือสิ่งอื่นใดนั่นคือสิ่งที่คำตอบนี้บอกว่าserverfault.com/a/682823/9517
9517 รองรับ GoFundMonica

9

พฤติกรรมที่สังเกตได้ดูเหมือนจะเป็นข้อบกพร่องในโมดูล debconf ผมยื่นรายงานข้อผิดพลาด

ผู้ใช้ bcoca ที่ github ชี้ให้เห็นว่าสามารถใช้no_log: trueคำสั่งในงานที่ตั้งรหัสผ่านเพื่อป้องกันการเข้าสู่ระบบ นี่เป็นวิธีแก้ปัญหาที่ใช้งานได้สำหรับฉันจนกว่าข้อผิดพลาดจะได้รับการแก้ไข


ฉันได้รับข้อผิดพลาดเมื่อฉันใช้คำสั่งนั้น .. มีความคิดว่าฉันทำผิดอะไร? ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh

2
ปรากฎว่าฉันมีรุ่นเก่าของ ansible! ในการแก้ไขปัญหา (บน Ubuntu): sudo apt-add-repository ppa:ansible/ansible, sudo apt-get update,sudo apt-get install ansible
Bouke Versteegh

ปัญหาเดียวกันสำหรับฉัน แต่ฉันไม่สามารถทำให้ n_log: จริงเพื่อทำงานตามที่คาดไว้ Ansible เวอร์ชันของฉันคือ 1.7.2 ของคุณคืออะไร
jmcollin92

@ jmcollin92 ฉันใช้ 2.1 ในปัจจุบัน มีคำแนะนำที่นี่เกี่ยวกับวิธีการติดตั้งเวอร์ชันล่าสุดจากแหล่งที่มา ฉันใช้สิ่งที่น่าเชื่อถือว่ายังคงเป็นผู้ใหญ่
ซานตาคลอส


2

ตามเอกสาร Ansible :

log_path

หากมีและกำหนดค่าไว้ansible.cfgAnsible จะบันทึกข้อมูลเกี่ยวกับการดำเนินการที่สถานที่ที่กำหนด ตรวจสอบให้แน่ใจว่าผู้ใช้ที่เรียกใช้ Ansible มีสิทธิ์ในล็อกไฟล์:

log_path=/var/log/ansible.log 

พฤติกรรมนี้ไม่ได้เปิดอยู่ตามค่าเริ่มต้น โปรดทราบว่าจะไม่บันทึกการโต้แย้งโมดูลที่เรียกว่า syslog ของเครื่องที่จัดการโดยไม่มีการตั้งค่านี้ ไม่รวมอาร์กิวเมนต์ของรหัสผ่าน

เสียงเหมือนการตั้งค่าlog_pathบนโหนดควบคุมของคุณจะทำให้ไม่มีการบันทึกบนโหนดปลายทาง


จริงๆแล้วฉันมี ansible.cfg ใน dir ในพื้นที่ของฉันที่ฉันเรียกว่า ansible โดยตั้งค่า log_path โลคัลล็อกถูกสร้างเป็นไรและอัพโทเดตหลังจากการเรียกใช้ใหม่ (การบันทึกทำงาน) สิ่งนี้ไม่ได้ (แม้ว่าเอกสารที่คุณระบุไว้จะสัญญา) ป้องกันไม่ให้โฮสต์ระยะไกลเข้าสู่ระบบ นอกจากนี้คำสั่ง "อาร์กิวเมนต์รหัสผ่านจะถูกแยกออก" ดูเหมือนว่าจะไม่จริง 100% ใช่ไหม นี่เป็นข้อบกพร่อง (หรือแม้แต่สอง)
ซานตาคลอส

2
@claus "อาร์กิวเมนต์ของรหัสผ่านที่ถูกคัดออกมา" ใช้เฉพาะกับโมดูลที่อาร์กิวเมนต์ของรหัสผ่านนั้นชัดเจน ไม่มีทางที่จะรู้ได้ว่าอาร์กิวเมนต์ใดที่จะเป็นรหัสผ่านและจะไม่มีคำสั่งทั่วไปเช่น debconf, shell, raw, ฯลฯ
Droopy4096

กรุณาเลื่อนไปทางขวาใน playbook เริ่มต้นของฉัน vtype='password'มันบอกว่า ควรชัดเจนเพียงพอหรือไม่ ฉันถือว่าข้อความบันทึกถูกสร้างขึ้นโดยโมดูล debconf
ซานตาคลอส

สิ่งนี้ไม่ถูกต้อง เอกสารควรพูดอย่างแม่นยำมากขึ้น "โปรดทราบว่าจะไม่คำนึงถึงการตั้งค่านี้บันทึกอาร์กิวเมนต์ของโมดูลที่เรียกไปยัง syslog ของเครื่องที่จัดการ"
59

2

มีวิธีที่ดีกว่าเพียงแค่ no_log: จริง

- name: write in string variables login and password
  set_fact:
    temp_user: "{{ USER_VAR }}"
    temp_pass: "{{ PASSWORD_VAR }}"


- name: Your operation with password in output
  shell: '/opt/hello.sh'
  ignore_errors: True
  no_log: True
  register: myregister

- debug:
    msg: '{{ myregister.stderr | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stderr != ""

- debug:
    msg: '{{ myregister.stdout | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stdout != ""

- fail:
    msg: "error shell /opt/hello.sh"
  when: myregister.stderr != ""

อย่างที่คุณเห็นคุณต้องเพิ่ม:

ignore_errors: true
no_log: true

จากนั้นสร้างผลลัพธ์ของผลลัพธ์ของคำสั่งด้วย regex_replace โดยที่:

USER_VAR - ตัวแปรการเข้าสู่ระบบ

PASSWORD_VAR - ตัวแปรรหัสผ่าน

ด้วยวิธีการนี้คุณจะไม่เพียง แต่ซ่อนรหัสผ่านและการเข้าสู่ระบบ แต่ยังได้ผลลัพธ์ของการทำงานของคุณ


1

นี่คือส่วนเสริมของคำตอบของ TheDESTROS จากกระทู้นี้:

  1. เขียนเทมเพลตซึ่งหุ้มคำสั่งด้วยความลับ:

เสื้อคลุม-script.sh.j2

echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
  1. เรียกใช้สคริปต์ตัวตัดและลบออกทันที:
- name: create template
  template:
    src: wrapper-script.sh.j2
    dest: /tmp/wrapper-script.sh
    mode: 0700
  no_log: True
- name: invoke command with secret and remove it
  shell: /tmp/wrapper-script.sh; rm -f /tmp/wrapper-script.sh

คุณต้องใช้รหัสน้อยกว่านี้เล็กน้อยและคุณสามารถใช้คำสั่งในบันทึกของคุณได้หรือไม่ มี caveeat เพียงหนึ่งเท่านั้นหากความลับอยู่ในคำสั่ง stdout หากคุณต้องการหลีกเลี่ยงเท็มเพลตภายนอกcopyโมดูลที่มีพารามิเตอร์contentอาจช่วยในการเขียนสคริปต์ wrapper ขนาดเล็กได้ทันที


1

no_log: trueวิธีการที่จะถูกนำมาใช้เป็นครั้งสุดท้ายในรีสอร์ทถ้าความพยายามอื่น ๆ ล้มเหลวเพราะมันจะทำให้การดำเนินงานมีความทึบทั้งหมดและคุณจะมีเงื่อนงำเมื่อมันล้มเหลวไม่มี

แนวทางปฏิบัติด้านความปลอดภัยแนะนำให้ให้ข้อมูลประจำตัวจาก stdin หรือเมื่อไม่สามารถใช้ไฟล์ข้อมูลรับรอง (หรือแม้แต่ executables)

นี่คือตัวอย่างเกี่ยวกับวิธีการเข้าสู่ระบบ Podman ที่ปลอดภัยโดยหลีกเลี่ยงการเปิดเผยรหัสผ่าน:

- name: secured login
  become: true
  command: >
    podman login --username={{ user }} --password-stdin ...
  args:
    stdin: "{{ secret }}"
  register: result

ด้วยวิธีนี้ความลับจะไม่ถูกเปิดเผยresultแต่คุณจะยังสามารถเห็นผลลัพธ์ของคำสั่งได้

เครื่องมือส่วนใหญ่ที่จำเป็นต้องเข้าสู่ระบบจะใช้หนึ่งในวิธีการที่ปลอดภัยมากขึ้นดังกล่าว การใช้ข้อมูลประจำตัวใน CLI เป็นรหัสเหมือนมี123456เป็นรหัสผ่านธนาคารของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.