Come posso ridurre la verbosità di alcune attività Ansible per non far passare le password in syslog?


11

A volte vorrei usare Ansible lineinfileo i blockinfilemoduli per scrivere una password in un file di configurazione. Se lo faccio, l'intera riga o blocco, inclusa la password, finisce nel mio syslog.

Dato che non considero syslogun posto sicuro in cui archiviare le mie password, come posso dire ad Ansible di non perdere la mia password syslog? Spero che ci sia un modo per farlo, altrimenti lo considero un grosso problema di sicurezza in Ansible.

Puoi riprodurlo ad esempio con questo comando ad-hoc:

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

Ecco cosa finisce in 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

Per l'esempio ho usato Ansible 2.0.0.2 dal PPA Ansible Ubuntu ufficiale su un sistema Debian "Jessie" 8.

Risposte:


3

L' no_log attributo nasconde i dati in syslog. Può essere applicato a una singola attività

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

o il playbook:

- hosts: all
  no_log: True

Il debug non è realmente possibile quando attivato, quindi si consiglia di utilizzarlo solo per singole attività. Questa funzione è disponibile dalla versione 1.5 di Ansible . Come indicato nell'annuncio di rilascio per la versione 1.5:

Le attività ora possono anche prendere un'opzione "no_log = True" per impedire alle attività sensibili di colpire syslog. (I parametri che sembravano password erano già filtrati)

le password dovrebbero essere filtrate nella maggior parte dei casi.


Ciò nasconde efficacemente le password syslogma disabilita contemporaneamente l'output di registrazione nell'output della console. C'è un modo per cambiarlo?
aef

Mi dispiace. Ho trovato poche informazioni su questo argomento. Suggerirei di impostare l'attributo solo per le attività e solo dopo aver eseguito il debug del gioco. Come detto Ansible dovrebbe già filtrare i parametri che sembrano password. Quindi forse è un bug. Ancora una volta non so come Ansible determini se un parametro è una password. Forse è un bug / funzionalità mancante da nascondere password = XXX.
Henrik Pingel,

Dove hai avuto l'impressione che le password dovrebbero essere nascoste per impostazione predefinita in Ansible? Questo è menzionato da qualche parte nella documentazione?
aef

Ultima citazione nella mia risposta (i parametri che sembravano password erano già filtrati). Ma non ho trovato nessun'altra fonte per quella funzionalità
Henrik Pingel,

3

Ho sviluppato un plug-in di callback per nascondere le password per gli output predefiniti, analizza il dizionario di output per la chiave che contiene la password , per ognuno di essi, sostituisce il valore con ********.

Crea un file denominato protect_data.pynella cartella ./plugins/callback aggiungi aggiungi questo codice:

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)

Nel file ansible.cfg :

  • linea di commento con stdout_callbacke impostare questo nome di plugin un valore ( stdout_callback=protect_data)
  • riga di commento con callback_pluginse impostare valore./plugins/callback

L'output viene modificato solo per questo plug-in, se si utilizza un altro plug-in per visualizzare l'output ( logentries, ...), è necessario fare lo stesso con esso


Oh, wow, è geniale. Tuttavia, ciò richiede che imposti un comando con nome chiave "password" per tutto ciò che contiene un segreto. Mi sarebbe piaciuto un meta flag per indicare che una variabile contiene invece un segreto, ma grazie! Altro D: questo maschera anche i segreti dell'output con ansible-playbook --diff(modifiche alla differenza del file)?
gertvdijk,

Non lo so, non ci ho mai provato
Nelson G.

-3

Si potrebbe suggerire che l'utilizzo di Vault invece ovvierebbe al problema.


Questo non fornisce una risposta alla domanda. Una volta che hai una reputazione sufficiente , sarai in grado di commentare qualsiasi post ; fornire invece risposte che non richiedono chiarimenti da parte del richiedente . - Dalla recensione
pulcini,

1
Vault aiuta a crittografare i dati inattivi, ma quando vengono utilizzate le password, possono apparire facilmente nei file di registro.
Konstantin Suvorov,

@chicks Sembra una risposta sbagliata , non una non risposta .
Michael Hampton,

Non ho visto questa opzione negli strumenti di revisione. Dato che è più un commento che una risposta, mi sembra di averlo gestito in modo ragionevole.
pulcini,

Anche la mia bandiera è stata rifiutata e ancora non vedo come la frase sopra sia una risposta su come ridurre la verbosità di Ansible . È al massimo un commento che suggerisce un'altra idea, certamente non una risposta alla domanda.
Patrick Mevzek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.