Bagaimana saya bisa mengurangi verbositas tugas-tugas tertentu untuk tidak membocorkan kata sandi ke syslog?

11

Terkadang saya ingin menggunakan modul Ansible lineinfileatau blockinfileuntuk menulis kata sandi ke beberapa file konfigurasi. Jika saya melakukannya, seluruh baris atau blokir, termasuk kata sandi, berakhir di blog saya syslog.

Karena saya tidak menganggap syslogsebagai tempat yang aman untuk menyimpan kata sandi saya, bagaimana saya dapat memberitahu Ansible untuk tidak membocorkan kata sandi saya syslog? Saya harap ada cara untuk melakukan ini, kalau tidak saya akan menganggap ini sebagai masalah keamanan besar di Ansible.

Anda dapat mereproduksinya misalnya dengan perintah ad-hoc ini:

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

Inilah yang akhirnya 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

Sebagai contoh saya menggunakan Ansible 2.0.0.2 dari PPA Ubuntu Ansible resmi pada sistem Debian "Jessie" 8.

aef
sumber

Jawaban:

3

The no_log atribut menyembunyikan data dalam syslog. Itu dapat diterapkan pada satu tugas

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

atau buku pedoman:

- hosts: all
  no_log: True

Debugging tidak benar-benar mungkin ketika diaktifkan sehingga disarankan untuk menggunakannya hanya untuk satu tugas. Fitur ini tersedia sejak versi 1.5 dari Ansible . Sebagaimana dinyatakan dalam pengumuman rilis untuk rilis 1.5:

Tugas juga sekarang dapat mengambil opsi "no_log = True" untuk mencegah tugas-tugas sensitif dari memukul syslog. (Parameter yang tampak seperti kata sandi sudah difilter)

kata sandi harus disaring dalam banyak kasus.

Henrik Pingel
sumber
Ini secara efektif menyembunyikan kata sandi dari syslogtetapi itu menonaktifkan output logging di output konsol pada saat yang sama. Apakah ada cara untuk mengubahnya?
aef
Maafkan saya. Saya menemukan sedikit informasi tentang topik ini. Saya akan menyarankan untuk mengatur atribut hanya untuk tugas dan hanya sekali Anda men-debug permainan Anda. Seperti yang dikutip Ansible seharusnya sudah memfilter parameter yang terlihat seperti kata sandi. Jadi mungkin itu adalah bug. Sekali lagi saya tidak tahu bagaimana Ansible menentukan apakah suatu parameter adalah kata sandi. Mungkin itu adalah fitur bug / hilang untuk disembunyikan password = XXX.
Henrik Pingel
Dari mana Anda mendapatkan kesan bahwa kata sandi seharusnya disembunyikan secara default di Ansible? Apakah ini disebutkan di suatu tempat dalam dokumentasi?
aef
Kutipan terakhir dalam jawaban saya (Parameter yang tampak seperti kata sandi sudah difilter). Tapi saya belum menemukan sumber lain untuk fungsi itu
Henrik Pingel
3

Saya mengembangkan sebuah plugin panggilan balik untuk menyembunyikan kata sandi untuk keluaran default, ini menguraikan kamus untuk kunci yang berisi kata sandi , untuk masing-masing kata sandi itu menggantikan nilai dengan ********.

Buat file bernama protect_data.pydi folder ./plugins/callback tambahkan tambahkan kode ini:

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)

Dalam file ansible.cfg :

  • batalkan komentar baris dengan stdout_callbackdan tetapkan nilai nama plugin ini ( stdout_callback=protect_data)
  • batalkan komentar baris dengan callback_pluginsdan set nilai./plugins/callback

Output hanya dimodifikasi untuk plugin ini, jika Anda menggunakan plugin lain untuk menampilkan output ( logentries, ...), Anda harus melakukan hal yang sama dengannya

Nelson G.
sumber
Oh, wow, itu brilian. Namun, ini mengharuskan saya untuk menetapkan dict dengan nama kunci 'kata sandi' untuk semua yang mengandung rahasia. Saya akan menyukai bendera meta untuk menunjukkan bahwa variabel berisi rahasia, tetapi terima kasih! Lainnya T: apakah ini juga menyembunyikan rahasia dalam keluaran dengan ansible-playbook --diff(perubahan file berbeda)?
gertvdijk
Saya tidak tahu, saya tidak pernah mencoba
Nelson G.
-3

Orang mungkin menyarankan bahwa menggunakan Vault sebagai gantinya akan meniadakan masalah.

pengguna19151
sumber
Ini tidak memberikan jawaban untuk pertanyaan itu. Setelah Anda memiliki reputasi yang cukup, Anda dapat mengomentari setiap pos ; alih-alih, berikan jawaban yang tidak memerlukan klarifikasi dari penanya . - Dari Ulasan
chicks
1
Vault membantu mengenkripsi data saat istirahat, tetapi ketika kata sandi digunakan, mereka dapat dengan mudah muncul dalam file log.
Konstantin Suvorov
@chicks Ini sepertinya jawaban yang salah , bukan bukan jawaban .
Michael Hampton
Saya tidak melihat opsi itu di alat ulasan. Karena ini lebih seperti komentar daripada jawaban, saya merasa seperti saya menangani ini dengan wajar.
anak ayam
Bendera saya juga ditolak, dan saya masih tidak melihat bagaimana kalimat di atas adalah jawaban tentang bagaimana mengurangi Anonim . Paling-paling itu adalah komentar yang menyarankan ide lain, tentu saja bukan jawaban untuk pertanyaan itu.
Patrick Mevzek