Wie kann ich die Ausführlichkeit bestimmter Ansible-Aufgaben reduzieren, um keine Passwörter in das Syslog zu übertragen?

11

Manchmal möchte ich Ansible's lineinfileoder blockinfileModule verwenden, um ein Passwort in eine Konfigurationsdatei zu schreiben. Wenn ich das tue, landet die ganze Zeile oder der gesamte Block, einschließlich des Passworts, in meinem syslog.

Wie syslogkann ich Ansible anweisen, mein Passwort nicht zu verlieren, da ich es nicht als sicheren Ort für die Speicherung meiner Passwörter betrachte syslog? Ich hoffe, es gibt einen Weg, dies zu tun, sonst würde ich dies als ein großes Sicherheitsproblem in Ansible betrachten.

Sie können es beispielsweise mit diesem Ad-hoc-Befehl reproduzieren:

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

Folgendes endet 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

Für das Beispiel habe ich Ansible 2.0.0.2 von der offiziellen Ansible Ubuntu PPA auf einem Debian "Jessie" 8-System verwendet.

aef
quelle

Antworten:

3

Das no_log Attribut verbirgt Daten in Syslog. Es kann auf eine einzelne Aufgabe angewendet werden

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

oder das Spielbuch:

- hosts: all
  no_log: True

Das Debuggen ist bei Aktivierung nicht wirklich möglich, daher wird empfohlen, es nur für einzelne Aufgaben zu verwenden. Diese Funktion ist seit Version 1.5 von Ansible verfügbar . Wie in der Release-Ankündigung für das 1.5-Release angegeben:

Aufgaben können jetzt auch die Option "no_log = True" verwenden, um zu verhindern, dass vertrauliche Aufgaben auf das Syslog treffen. (Parameter, die wie Passwörter aussahen, wurden bereits gefiltert)

Passwörter sollten in den meisten Fällen gefiltert werden.

Henrik Pingel
quelle
Dadurch werden die Kennwörter effektiv syslogausgeblendet, gleichzeitig wird jedoch die Protokollierungsausgabe in der Konsolenausgabe deaktiviert. Gibt es eine Möglichkeit, das zu ändern?
Aef
Es tut mir Leid. Ich habe wenig Informationen zu diesem Thema gefunden. Ich würde vorschlagen, das Attribut nur für Aufgaben und nur nach dem Debuggen Ihres Spiels festzulegen. Wie bereits erwähnt, sollte Ansible bereits Parameter filtern, die wie Kennwörter aussehen. Vielleicht ist es ein Fehler. Wieder weiß ich nicht, wie Ansible feststellt, ob ein Parameter ein Passwort ist. Vielleicht ist es ein Fehler / eine fehlende Funktion zum Ausblenden password = XXX.
Henrik Pingel
Woher haben Sie den Eindruck, dass Passwörter in Ansible standardmäßig ausgeblendet werden sollen? Wird dies irgendwo in der Dokumentation erwähnt?
Aef
Letztes Zitat in meiner Antwort (Parameter, die wie Passwörter aussahen, wurden bereits gefiltert). Aber ich habe keine andere Quelle für diese Funktionalität gefunden
Henrik Pingel
3

Ich habe ein Callback-Plugin entwickelt, um Passwörter für Standardausgaben auszublenden. Es analysiert das Ausgabewörterbuch nach Schlüsseln, die ein Passwort enthalten . Für jedes von ihnen wird der Wert durch ******** ersetzt.

Erstellen Sie eine Datei mit dem Namen protect_data.pyin Ordner ./plugins/callback diesen Code hinzufügen hinzuzufügen:

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)

In der Datei ansible.cfg :

  • Kommentar entfernen mit stdout_callbackund setzen Sie diesen Plugin-Namen auf einen Wert ( stdout_callback=protect_data)
  • Kommentarzeile mit callback_pluginsund Wert einstellen./plugins/callback

Die Ausgabe wird nur für dieses Plugin geändert. Wenn Sie ein anderes Plugin zum Anzeigen der Ausgabe ( logentries, ...) verwenden, müssen Sie dasselbe damit tun

Nelson G.
quelle
Oh, wow, das ist großartig. Dies erfordert jedoch, dass ich für alles, was ein Geheimnis enthält, ein Diktat mit dem Schlüsselnamen 'Passwort' festlege. Ich hätte gerne ein Meta-Flag verwendet, um anzuzeigen, dass eine Variable stattdessen ein Geheimnis enthält, aber danke! Sonstiges F: Maskiert dies auch die Geheimnisse in der Ausgabe mit ansible-playbook --diff(Datei-Diff-Änderungen)?
Gertvdijk
Ich weiß nicht, ich habe es nie versucht
Nelson G.
-3

Man könnte vorschlagen, dass die Verwendung von Vault das Problem umgehen würde.

user19151
quelle
Dies gibt keine Antwort auf die Frage. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren . Geben Sie stattdessen Antworten, die nicht vom Fragesteller geklärt werden müssen . - Von der Überprüfung
Küken
1
Vault hilft beim Verschlüsseln von Daten in Ruhe. Wenn jedoch Kennwörter verwendet werden, können diese problemlos in Protokolldateien angezeigt werden.
Konstantin Suworow
@chicks Dies sieht nach einer falschen Antwort aus , nicht nach einer Nichtantwort .
Michael Hampton
Ich habe diese Option in den Überprüfungstools nicht gesehen. Da dies eher ein Kommentar als eine Antwort ist, habe ich das Gefühl, dass ich vernünftig damit umgegangen bin.
Küken
Meine Flagge wurde ebenfalls abgelehnt, und ich sehe immer noch nicht, wie der obige Satz eine Antwort darauf ist, wie man die Ansible- Ausführlichkeit verringert . Es ist höchstens ein Kommentar, der eine andere Idee vorschlägt, sicherlich keine Antwort auf die Frage.
Patrick Mevzek