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.

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.


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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.