ฉันจะลดความละเอียดของงาน Ansible บางอย่างเพื่อไม่ให้รหัสผ่านรั่วไหลลงใน syslog ได้อย่างไร?


12

บางครั้งฉันต้องการใช้ Ansible lineinfileหรือblockinfileโมดูลเพื่อเขียนรหัสผ่านลงในไฟล์การกำหนดค่าบางอย่าง syslogถ้าผมทำเช่นนั้นทั้งบรรทัดหรือบล็อกรหัสผ่านรวมสิ้นสุดลงในของฉัน

เนื่องจากฉันไม่คิดว่าsyslogจะเป็นสถานที่ที่ปลอดภัยในการจัดเก็บรหัสผ่านไว้ฉันจะบอกได้อย่างไรว่า Ansible จะไม่รั่วรหัสผ่านของฉันsyslog? ฉันหวังว่าจะมีวิธีการทำเช่นนี้มิฉะนั้นฉันจะถือว่านี่เป็นปัญหาด้านความปลอดภัยขนาดใหญ่ใน Ansible

คุณสามารถทำซ้ำตัวอย่างเช่นด้วยคำสั่ง ad-hoc นี้:

ansible localhost -m blockinfile -a 'dest=/tmp/ansible_password_leak create=yes block="Password = {{password}}"' -e 'password=secret'

นี่คือสิ่งที่เกิดขึ้นในsyslog:

ansible-blockinfile: Invoked with directory_mode=None force=None remote_src=None insertafter=None owner=None follow=False marker=# {mark} ANSIBLE MANAGED BLOCK group=None insertbefore=None create=True setype=None content=None serole=None state=present dest=/tmp/ansible_password_leak selevel=None regexp=None validate=None src=None seuser=None delimiter=None mode=None backup=False block=Password = secret

สำหรับตัวอย่างที่ฉันใช้ Ansible 2.0.0.2 จากAnsible Ubuntu PPA อย่างเป็นทางการในระบบ Debian "Jessie" 8

คำตอบ:


3

no_log แอตทริบิวต์ข้อมูลที่ซ่อนอยู่ใน syslog มันสามารถนำไปใช้กับงานเดียว

- name: secret task
  shell: /usr/bin/do_something --value={{ secret_value }}
  no_log: True

หรือ playbook:

- hosts: all
  no_log: True

การดีบักไม่สามารถทำได้เมื่อเปิดใช้งานดังนั้นจึงขอแนะนำให้ใช้สำหรับงานเดียวเท่านั้น คุณลักษณะนี้สามารถใช้ได้ตั้งแต่รุ่น 1.5 ของเบิ้ล ตามที่ระบุไว้ในประกาศประชาสัมพันธ์สำหรับรุ่น 1.5:

ตอนนี้งานยังสามารถใช้ตัวเลือก "no_log = True" เพื่อป้องกันงานที่มีความละเอียดอ่อนจากการกดปุ่ม syslog (พารามิเตอร์ที่ดูเหมือนรหัสผ่านถูกกรองแล้ว)

รหัสผ่านควรถูกกรองในกรณีส่วนใหญ่


สิ่งนี้ซ่อนรหัสผ่านได้อย่างมีประสิทธิภาพsyslogแต่จะปิดใช้งานเอาต์พุตการบันทึกในเอาต์พุตคอนโซลในเวลาเดียวกัน มีวิธีใดที่จะเปลี่ยนแปลงสิ่งนั้น?
aef

ฉันขอโทษ. ฉันพบข้อมูลเล็กน้อยในหัวข้อนี้ ฉันขอแนะนำให้ตั้งค่าคุณลักษณะเฉพาะสำหรับงานและเมื่อคุณดีบั๊กการเล่นของคุณเท่านั้น ตามที่อ้างถึง Ansible ควรกรองพารามิเตอร์ที่มีลักษณะเหมือนรหัสผ่านแล้ว ดังนั้นอาจเป็นข้อผิดพลาด อีกครั้งฉันไม่รู้ว่า Ansible พิจารณาว่าพารามิเตอร์เป็นรหัสผ่านหรือไม่ บางทีมันอาจจะเป็นข้อผิดพลาด / password = XXXหายไปคุณสมบัติในการซ่อน
Henrik Pingel

คุณได้รับความประทับใจว่ารหัสผ่านควรถูกซ่อนไว้โดยค่าเริ่มต้นใน Ansible หรือไม่ สิ่งนี้ได้กล่าวถึงในเอกสารหรือไม่?
aef

คำพูดสุดท้ายในคำตอบของฉัน (พารามิเตอร์ที่ดูเหมือนว่ารหัสผ่านถูกกรองแล้ว) แต่ฉันไม่ได้พบแหล่งข้อมูลอื่นสำหรับฟังก์ชันนั้น
Henrik Pingel

3

ฉันพัฒนาปลั๊กอินโทรกลับเพื่อซ่อนรหัสผ่านสำหรับเอาท์พุทเริ่มต้นมันแยกวิเคราะห์พจนานุกรมสำหรับคีย์ที่มีรหัสผ่านสำหรับแต่ละรายการมันจะแทนที่ค่าด้วย ********

สร้างไฟล์ชื่อprotect_data.pyในโฟลเดอร์. / plugins/callbackเพิ่มเพิ่มรหัสนี้:

from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
import os, collections

class CallbackModule(CallbackModule_default):
    CALLBACK_VERSION = 2.0
    CALLBACK_TYPE = 'stdout'
    CALLBACK_NAME = 'protect_data'

    def __init__(self, display=None):
        super(CallbackModule, self).__init__(display)

    def hide_password(self, result):
        ret = {}
        for key, value in result.iteritems():
            if isinstance(value, collections.Mapping):
                ret[key] = self.hide_password(value)
            else:
                if "password" in key:
                    ret[key] = "********"
                else:
                    ret[key] = value
        return ret

    def _dump_results(self, result, indent=None, sort_keys=True, keep_invocation=False):
        return super(CallbackModule, self)._dump_results(self.hide_password(result), indent, sort_keys, keep_invocation)

ในไฟล์ansible.cfg :

  • uncomment บรรทัดด้วยstdout_callbackและตั้งชื่อปลั๊กอินนี้ค่า ( stdout_callback=protect_data)
  • บรรทัด uncomment ด้วยcallback_pluginsและตั้งค่า./plugins/callback

เอาต์พุตถูกแก้ไขสำหรับปลั๊กอินนี้เท่านั้นหากคุณใช้ปลั๊กอินอื่นเพื่อแสดงเอาต์พุต ( logentries, ... ) คุณต้องทำเช่นเดียวกันกับปลั๊กอินนี้


โอ้วววมันยอดเยี่ยม อย่างไรก็ตามสิ่งนี้ต้องการให้ฉันตั้งค่า dict ด้วยชื่อรหัสผ่านสำหรับทุกสิ่งที่มีความลับ ฉันจะรักธงเมตาเพื่อระบุว่าตัวแปรมีความลับแทน แต่ขอบคุณ! คำถามอื่น ๆ : สิ่งนี้ยังปกปิดความลับในผลลัพธ์ด้วยansible-playbook --diff(การเปลี่ยนแปลง diff file) หรือไม่?
gertvdijk

ฉันไม่รู้ฉันไม่เคยลอง
Nelson G.

-3

บางคนอาจแนะนำว่าการใช้ Vault แทนจะเป็นการขจัดปัญหา


สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม เมื่อคุณมีเพียงพอชื่อเสียงคุณจะสามารถที่จะแสดงความคิดเห็นในโพสต์ใด ๆ ; แทนที่จะให้คำตอบที่ไม่จำเป็นต้องชี้แจงจากผู้ถาม - จากการตรวจสอบ
ลูกไก่

1
ห้องนิรภัยช่วยในการเข้ารหัสข้อมูลที่เหลือ แต่เมื่อมีการใช้รหัสผ่านพวกเขาสามารถปรากฏในไฟล์บันทึกได้อย่างง่ายดาย
Konstantin Suvorov

@chicks ลักษณะนี้เหมือนคำตอบที่ผิดไม่ได้ไม่ใช่คำตอบ
Michael Hampton

ฉันไม่เห็นตัวเลือกนั้นในเครื่องมือตรวจสอบ เนื่องจากนี่เป็นความคิดเห็นมากกว่าคำตอบฉันรู้สึกเหมือนฉันจัดการสิ่งนี้อย่างสมเหตุสมผล
ลูกไก่

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