Şifreleri syslog'a sızdırmamak için bazı Ansible görevlerinin ayrıntı düzeyini nasıl azaltabilirim?


12

Bazen bazı yapılandırma dosyalarına şifre yazmak için Ansible'ın lineinfileveya blockinfilemodüllerinin kullanılmasını isterim . Bunu yaparsam, tüm satır veya blok, şifre dahil, benim içinde biter syslog.

syslogŞifreleri saklamak için güvenli bir yer olarak düşünmediğim için Ansible'a şifremi sızdırmadığını nasıl söyleyebilirim syslog? Umarım bunu yapmanın bir yolu vardır, aksi takdirde bunu Ansible'da büyük bir güvenlik sorunu olarak görürüm.

Örneğin bu ad-hoc komutuyla çoğaltabilirsiniz:

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

İşte sonuç 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

Örnek için Debian "Jessie" 8 sisteminde resmi Ansible Ubuntu PPA'sından Ansible 2.0.0.2 kullandım .

Yanıtlar:


3

no_log Nitelik syslog gizler verileri. Tek bir göreve uygulanabilir

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

ya da oyun kitabını:

- hosts: all
  no_log: True

Hata ayıklama etkinleştirildiğinde gerçekten mümkün değildir, bu nedenle yalnızca tek görevler için kullanılması önerilir. Bu özellik, Ansible'ın 1.5 sürümünden beri kullanılabilir . 1.5 sürümüne ilişkin sürüm duyurusunda belirtildiği gibi:

Görevler artık hassas görevlerin syslog'a çarpmasını önlemek için "no_log = True" seçeneğini de alabilir. (Parola gibi görünen parametreler zaten filtrelenmiştir)

şifreler çoğu durumda filtrelenmelidir.


Bu, şifreleri etkili bir şekilde gizler, syslogancak konsol çıkışındaki günlük çıktısını aynı anda devre dışı bırakır. Bunu değiştirmenin bir yolu var mı?
aef

Üzgünüm. Bu konuda çok az bilgi buldum. Özelliği yalnızca görevler için ve oyununuzda hata ayıkladıktan sonra ayarlamanızı öneririm. Belirtildiği gibi Ansible zaten parolalara benzeyen parametreleri filtrelemelidir. Yani belki bir hatadır. Yine Ansible'ın bir parametrenin şifre olup olmadığını nasıl belirlediğini bilmiyorum. Belki de gizlemek için bir hata / eksik özelliktir password = XXX.
Henrik Pingel

Ansible'da şifrelerin varsayılan olarak gizlenmesi gerektiği izlenimini nereden aldınız? Bu belgede bir yerde mi bahsediliyor?
aef

Cevabımdaki son alıntı (Şifreye benzeyen parametreler zaten filtrelendi). Ama bu işlevsellik için başka bir kaynak bulamadım
Henrik Pingel

3

Varsayılan çıktılar için şifreleri gizlemek için bir geri arama eklentisi geliştirdim, şifre içeren anahtar için çıkış sözlüğünü ayrıştırdı , her biri için değeri ******** ile değiştirdi.

./Plugins/callback add protect_data.pyklasöründe bir dosya oluşturun bu kodu ekleyin:

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 dosyasında :

  • uncomment line ile stdout_callbackbu eklenti adını bir değer ( stdout_callback=protect_data)
  • callback_pluginsve set değeri ile birlikte bırakma satırı./plugins/callback

Çıktı yalnızca bu eklenti için değiştirilir, çıktıyı ( logentries, ...) görüntülemek için başka bir eklenti kullanırsanız , bununla aynı şeyi yapmanız gerekir


Oh, vay be, bu harika. Ancak, bu, sır içeren her şey için 'şifre' anahtar adı ile bir diksiyon belirlememi gerektirir. Ben bir değişken yerine bir sır içeriyor belirtmek için bir meta bayrak isterdi, ama teşekkürler! Diğer S: çıktıdaki sırları da ansible-playbook --diff(dosya farkı değişiklikleri) maskeliyor mu?
gertvdijk

Bilmiyorum, hiç denemedim
Nelson G.

-3

Bunun yerine Apps Kasası'nı kullanmanın sorunu çözeceği söylenebilir.


Bu soruya bir cevap sağlamaz. Yeterli bir üne sahip olduğunuzda , herhangi bir yazı hakkında yorum yapabilirsiniz ; bunun yerine askerden açıklama gerektirmeyen cevaplar verin . - Yorumdan
Civciv

1
Apps Kasası beklemedeki verilerin şifrelenmesine yardımcı olur, ancak şifreler kullanımdayken günlük dosyalarında kolayca görünebilirler.
Konstantin Suvorov

@chicks bir benzeri bu görünüyor yanlış cevap değil, bir sigara cevap .
Michael Hampton

İnceleme araçlarında bu seçeneği görmedim. Bu bir cevaptan çok bir yorum gibi olduğundan, bunu makul bir şekilde ele aldığımı hissediyorum.
civcivler

Bayrağım da reddedildi ve hala yukarıdaki cümlenin Ansible ayrıntı düzeyini nasıl azaltacağına dair bir cevap olduğunu göremiyorum . En fazla başka bir fikir öneren bir yorumdur, kesinlikle sorunun cevabı değildir.
Patrick Mevzek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.