Как я могу уменьшить многословность некоторых задач Ansible, чтобы не пропускать пароли в системный журнал?

11

Иногда я хотел бы использовать Ansible lineinfileили blockinfileмодули для записи пароля в какой-либо файл конфигурации. Если я это сделаю, вся строка или блок, включая пароль, останутся в моем syslog.

Поскольку я не считаю syslogбезопасным место для хранения своих паролей, как я могу сказать Ansible, чтобы они не пропускали мой пароль syslog? Я надеюсь, что есть способ сделать это, иначе я бы счел это большой проблемой безопасности в Ansible.

Вы можете воспроизвести это, например, с помощью этой специальной команды:

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

Вот что заканчивается 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

В качестве примера я использовал Ansible 2.0.0.2 из официального PPA Ansible Ubuntu в системе Debian "Jessie" 8.

Американские экспедиционные войска
источник

Ответы:

3

В no_log атрибутах скрывают данные в системном журнале. Может применяться к одной задаче

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

или пьесу:

- hosts: all
  no_log: True

Отладка на самом деле невозможна при активации, поэтому рекомендуется использовать ее только для отдельных задач. Эта функция доступна начиная с версии 1.5 Ansible . Как указано в объявлении о выпуске версии 1.5:

Задачи также теперь могут использовать параметр «no_log = True», чтобы предотвратить попадание чувствительных задач в системный журнал. (Параметры, которые выглядели как пароли, уже отфильтрованы)

пароли должны быть отфильтрованы в большинстве случаев.

Хенрик Пингел
источник
Это эффективно скрывает пароли, syslogно в то же время отключает вывод журналов в вывод консоли. Есть ли способ изменить это?
AEF
Мне жаль. Я нашел мало информации по этой теме. Я бы предложил установить атрибут только для задач и только после того, как вы отладили свою игру. Как уже упоминалось, Ansible уже должен фильтровать параметры, похожие на пароли. Так что, возможно, это ошибка. Опять же, я не знаю, как Ansible определяет, является ли параметр паролем. Может быть, это ошибка / отсутствует функция, чтобы скрыть password = XXX.
Хенрик Пингел,
Откуда у вас сложилось впечатление, что пароли по умолчанию должны быть скрыты в Ansible? Это упомянуто где-то в документации?
AEF
Последняя цитата в моем ответе (параметры, которые выглядели как пароли, уже отфильтрованы). Но я не нашел другого источника для этой функциональности
Хенрик Пингел,
3

Я разработал плагин обратного вызова, чтобы скрыть пароли для выводов по умолчанию, он анализирует словарь вывода для ключа, который содержит пароль , для каждого из них он заменяет значение на ********.

Создайте файл с именем protect_data.pyв папке ./plugins/callback добавить добавить этот код:

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)

В файле ansible.cfg :

  • раскомментируйте строку stdout_callbackи установите для этого имени плагина значение ( stdout_callback=protect_data)
  • раскомментируйте строку с callback_pluginsи установите значение./plugins/callback

Выход изменяется только для этого плагина, если вы используете другой плагин для отображения вывода ( logentries, ...), вы должны сделать то же самое с ним

Нельсон Г.
источник
О, это замечательно. Однако для этого требуется, чтобы я установил диктант с ключевым словом «пароль» для всего, что содержит секрет. Я бы любил мета-флаг, чтобы указать, что переменная содержит секрет, но спасибо! Другой вопрос: это также маскирует секреты в выходных данных ansible-playbook --diff(изменения в файлах)?
gertvdijk
Я не знаю, я никогда не пробовал
Нельсон Дж
-3

Можно предположить, что использование Vault вместо этого устранит проблему.

user19151
источник
Это не дает ответа на вопрос. Как только у вас будет достаточно репутации, вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют уточнения от автора . - Из обзора
птенцы
1
Vault помогает шифровать данные в состоянии покоя, но когда пароли используются, они могут легко появиться в файлах журнала.
Константин Суворов
@ chicks Это похоже на неправильный ответ , а не на отсутствие ответа .
Майкл Хэмптон
Я не видел эту опцию в инструментах обзора. Поскольку это больше похоже на комментарий, чем на ответ, я чувствую, что справился с этим разумно.
птенцы
Мой флаг также был отклонен, и я до сих пор не вижу, как вышеприведенное предложение является ответом о том, как уменьшить Ansible многословие. Это в лучшем случае комментарий, предлагающий другую идею, конечно, не ответ на вопрос.
Патрик Мевзек