Jak mogę zmniejszyć poziom szczegółowości niektórych zadań Ansible, aby nie wprowadzać haseł do syslog?

12

Czasami chciałbym użyć Ansible's lineinfilelub blockinfilemodułów do napisania hasła do jakiegoś pliku konfiguracyjnego. Jeśli to zrobię, cała linia lub blok, łącznie z hasłem, trafi do mojego syslog.

Ponieważ nie uważam syslogza bezpieczne miejsce do przechowywania haseł, w jaki sposób mogę powiedzieć Ansible, aby nie ujawniał mojego hasła syslog? Mam nadzieję, że jest na to sposób, w przeciwnym razie uważałbym to za duży problem bezpieczeństwa w Ansible.

Możesz go odtworzyć na przykład za pomocą tego polecenia ad-hoc:

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

Oto, co kończy się w 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

Na przykład użyłem Ansible 2.0.0.2 z oficjalnego Ansible Ubuntu PPA w systemie Debian „Jessie” 8.

aef
źródło

Odpowiedzi:

3

Do no_log atrybutów danych ukrywa się w syslog. Można go zastosować do pojedynczego zadania

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

lub podręcznik:

- hosts: all
  no_log: True

Debugowanie nie jest tak naprawdę możliwe po aktywacji, dlatego zaleca się używanie go tylko do pojedynczych zadań. Ta funkcja jest dostępna od wersji 1.5 Ansible . Jak podano w ogłoszeniu o wydaniu wersji 1.5:

Zadania mogą teraz również przyjmować opcję „no_log = True”, aby zapobiec trafianiu syslog do poufnych zadań. (Parametry wyglądające jak hasła zostały już odfiltrowane)

hasła powinny być filtrowane w większości przypadków.

Henrik Pingel
źródło
To skutecznie ukrywa hasła, syslogale jednocześnie wyłącza rejestrowanie danych wyjściowych konsoli. Czy można to zmienić?
aef
Przepraszam. Znalazłem niewiele informacji na ten temat. Proponuję ustawić atrybut tylko dla zadań i tylko po debugowaniu gry. Jak cytowano, Ansible powinien już filtrować parametry, które wyglądają jak hasła. Więc może to jest błąd. Znów nie wiem, w jaki sposób Ansible określa, czy parametr jest hasłem. Może to ukrywanie błędu / brakującej funkcji password = XXX.
Henrik Pingel
Skąd masz wrażenie, że hasła powinny być domyślnie ukryte w Ansible? Czy wspomniano o tym gdzieś w dokumentacji?
aef
Ostatni cytat w mojej odpowiedzi (parametry wyglądające jak hasła zostały już odfiltrowane). Ale nie znalazłem żadnego innego źródła dla tej funkcjonalności
Henrik Pingel
3

Opracowałem wtyczkę zwrotną do ukrywania haseł do domyślnych danych wyjściowych, parsuje ona wyjściowy słownik dla klucza zawierającego hasło , dla każdego z nich zamienia wartość na ********.

Utwórz plik o nazwie protect_data.pyw folderze ./plugins/callback dodaj dodaj ten kod:

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)

W pliku ansible.cfg :

  • odkomentuj linię stdout_callbacki ustaw tę nazwę wtyczki na wartość ( stdout_callback=protect_data)
  • odkomentuj callback_pluginsi ustaw wartość./plugins/callback

Dane wyjściowe są modyfikowane tylko dla tej wtyczki, jeśli używasz innej wtyczki do wyświetlania danych wyjściowych ( logentries, ...), musisz zrobić to samo z nią

Nelson G.
źródło
Och, wow, to wspaniale. Wymaga to jednak ustawienia dykta z nazwą klucza „hasło” dla wszystkiego, co zawiera sekret. Wolałbym meta flagę wskazującą, że zmienna zawiera sekret zamiast tego, ale dzięki! Inne pytanie: czy to również maskuje tajemnice wyjściowe za pomocą ansible-playbook --diff(zmiany różnic plików)?
gertvdijk
Nie wiem, nigdy nie próbowałem
Nelson G.
-3

Ktoś mógłby zasugerować, że zamiast tego korzystanie z Vault rozwiązałoby problem.

użytkownik19151
źródło
To nie daje odpowiedzi na pytanie. Gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować dowolny post ; zamiast tego podaj odpowiedzi, które nie wymagają wyjaśnienia od pytającego . - Z recenzji
pisklęta
1
Vault pomaga szyfrować dane w spoczynku, ale gdy używane są hasła, mogą łatwo pojawić się w plikach dziennika.
Konstantin Suworow
@ laski To wygląda na złą odpowiedź , a nie brak odpowiedzi .
Michael Hampton
Nie widziałem tej opcji w narzędziach do recenzji. Ponieważ jest to bardziej komentarz niż odpowiedź, wydaje mi się, że poradziłem sobie z tym rozsądnie.
pisklęta
Moja flaga również została odrzucona i nadal nie widzę, jak powyższe zdanie jest odpowiedzią na temat tego, jak zmniejszyć Szczegółowość . Jest to co najwyżej komentarz sugerujący inny pomysł, a na pewno nie odpowiedź na pytanie.
Patrick Mevzek,