Como posso reduzir a verbosidade de determinadas tarefas Ansible para não vazar senhas no syslog?

11

Às vezes eu gostaria de usar o Ansible lineinfileou os blockinfilemódulos para escrever uma senha em algum arquivo de configuração. Se fizer isso, toda a linha ou bloco, incluindo a senha, terminará no meu syslog.

Como não considero syslogum local seguro para armazenar minhas senhas, como posso dizer ao Ansible para não vazar minha senha syslog? Espero que exista uma maneira de fazer isso, caso contrário, consideraria esse um grande problema de segurança no Ansible.

Você pode reproduzi-lo, por exemplo, com este comando ad-hoc:

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

Aqui está o que acaba em 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

Por exemplo, usei o Ansible 2.0.0.2 do PPA oficial do Ansible Ubuntu em um sistema Debian "Jessie" 8.

aef
fonte

Respostas:

3

O no_log atributo oculta dados no syslog. Pode ser aplicado a uma única tarefa

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

ou o manual:

- hosts: all
  no_log: True

A depuração não é realmente possível quando ativada, portanto, é recomendável usá-la apenas para tarefas únicas. Este recurso está disponível desde a versão 1.5 do Ansible . Conforme declarado no anúncio do release 1.5:

Agora, as tarefas também podem usar a opção "no_log = True" para impedir que tarefas confidenciais atinjam o syslog. (Parâmetros que pareciam senhas já foram filtrados)

senhas devem ser filtradas na maioria dos casos.

Henrik Pingel
fonte
Isso oculta efetivamente as senhas, syslogmas desativa a saída de log na saída do console ao mesmo tempo. Existe alguma maneira de mudar isso?
aef
Eu sinto Muito. Encontrei pouca informação sobre esse tópico. Eu sugeriria definir o atributo apenas para tarefas e somente depois que você depurar seu jogo. Como citado, o Ansible já deve filtrar parâmetros que se parecem com senhas. Então talvez seja um bug. Novamente, não sei como o Ansible determina se um parâmetro é uma senha. Talvez seja um bug / recurso ausente para ocultar password = XXX.
Henrik Pingel
Onde você teve a impressão de que as senhas deveriam estar ocultas por padrão no Ansible? Isso é mencionado em algum lugar da documentação?
aef
Última citação na minha resposta (parâmetros que pareciam senhas já foram filtrados). Mas eu não encontrei qualquer outra fonte para essa funcionalidade
Henrik Pingel
3

Desenvolvi um plug-in de retorno de chamada para ocultar senhas para saídas padrão; ele analisa o dicionário de saída da chave que contém a senha ; para cada uma delas, substitui o valor por ********.

Crie um arquivo nomeado protect_data.pyna pasta ./plugins/callback add adicione este código:

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)

No arquivo ansible.cfg :

  • descomente a linha stdout_callbacke defina esse nome de plugin como value ( stdout_callback=protect_data)
  • linha de descomentário callback_pluginse valor definido./plugins/callback

A saída é modificada apenas para este plug-in, se você usar outro plug-in para exibir a saída ( logentries, ...), precisará fazer o mesmo com ele

Nelson G.
fonte
Uau, isso é brilhante. No entanto, isso exige que eu defina um ditado com o nome da chave 'senha' para tudo o que contém um segredo. Eu adoraria uma meta flag para indicar que uma variável contém um segredo, mas obrigado! Outro P: isso também oculta os segredos na saída com ansible-playbook --diff(alterações no diff do arquivo)?
precisa saber é o seguinte
Eu não sei, eu nunca tentei
Nelson G.
-3

Pode-se sugerir que o uso do Vault evitaria o problema.

user19151
fonte
Isso não fornece uma resposta para a pergunta. Depois de ter reputação suficiente, você poderá comentar qualquer postagem ; em vez disso, forneça respostas que não exijam esclarecimentos do solicitante . - Da avaliação
chicks
1
O Vault ajuda a criptografar dados em repouso, mas quando as senhas estão em uso, elas podem aparecer facilmente nos arquivos de log.
Konstantin Suvorov
@chicks Parece uma resposta errada , não uma resposta não .
Michael Hampton
Eu não vi essa opção nas ferramentas de revisão. Como isso é mais um comentário do que uma resposta, sinto que lidei com isso razoavelmente.
pintainhos
Minha bandeira também foi recusada e ainda não vejo como a frase acima é uma resposta sobre como reduzir a verbosidade Ansible . É no máximo um comentário sugerindo outra idéia, certamente não uma resposta para a pergunta.
Patrick Mevzek