Como posso reduzir o detalhamento de certas tarefas Ansible para não vazar senhas no syslog?

9

Às vezes, gostaria de usar os módulos lineinfile ou blockinfile do Ansible para gravar uma senha em algum arquivo de configuração. Se eu fizer isso, toda a linha ou bloco, senha incluída, acaba no meu syslog .

Como eu não considero syslog como um local seguro para armazenar minhas senhas, como posso dizer ao Ansible para não vazar minha senha em syslog ? Espero que haja uma maneira de fazer isso, caso contrário, considero isso 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

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

    
por aef 08.02.2016 / 23:38

3 respostas

3

O atributo no_log attribute 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, por isso é recomendado usá-la apenas para tarefas únicas. Esse recurso está disponível desde a versão 1.5 do Ansible . Conforme declarado no anúncio de lançamento da versão 1.5:

Tasks also can now take a "no_log=True" option to prevent sensitive tasks from hitting syslog. (Parameters that looked like passwords were already filtered)

as senhas devem ser filtradas na maioria dos casos.

    
por 09.02.2016 / 09:25
2

Eu desenvolvi um plugin de callback para esconder as senhas das saídas padrão, ele analisa o dicionário de saída para a chave que contém senha , para cada um deles, substitui o valor por ********.

Crie um arquivo chamado protect_data.py na 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 com stdout_callback e defina esse nome de plug-in como um valor ( stdout_callback=protect_data )
  • descomente a linha com callback_plugins e defina o valor ./plugins/callback

Output is only modified for this plugin, if you use another plugin to display output (logentries, ...), you have to do the same with it

    
por 17.10.2016 / 13:43
-2

Alguém poderia sugerir que o uso do Vault poderia evitar o problema.

    
por 16.02.2018 / 02:16