Як я можу зменшити багатослів’я певних завдань, що відповідають питанням, щоб не просочувати паролі в syslog?


12

Іноді я хотів би використовувати Ansible's 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 чутливі завдання. (Параметри, схожі на паролі, вже відфільтровані)

паролі повинні фільтруватися в більшості випадків.


Це ефективно приховує паролі, syslogале одночасно вимикає вихід журналу в консольний вихід. Чи є спосіб змінити це?
aef

Мені шкода. Я знайшов мало інформації на цю тему. Я б запропонував встановити атрибут лише для завдань і лише після того, як ви налагодили свою гру. Як цитується, Ansible вже повинен фільтрувати параметри, схожі на паролі. То, може, це помилка. Знову не знаю, як Ansible визначає, чи є параметр паролем. Можливо, це помилка / відсутність функції приховувати password = XXX.
Генрік Пінгель

Звідки у вас склалося враження, що паролі повинні бути приховані за замовчуванням у Ansible? Це згадується десь у документації?
афе

Остання цитата моєї відповіді (Параметри, схожі на паролі, вже відфільтровані). Але я не знайшов іншого джерела для цієї функціональності
Генрік Пінгель,

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 замість цього усуне проблему.


Це не дає відповіді на запитання. Коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію ; натомість надайте відповіді, які не потребують уточнення від запитувача . - З огляду
пташенята

1
Сейф допомагає шифрувати дані в спокої, але коли паролі використовуються, вони можуть легко з’являтися у файлах журналів.
Костянтин Суворов

@chicks Це схоже на неправильну відповідь , а не на невідповідь .
Майкл Хемптон

Я не бачив цього варіанту в інструментах огляду. Оскільки це більше схоже на коментар, ніж на відповідь, я відчуваю, що я впорався з цим розумно.
пташенята

Мій прапор був також відхилений, і я до сих пір не розумію , як вище пропозиція є відповіддю про те , як зменшити анзібль багатослівність. Це максимум коментар, який пропонує іншу ідею, звичайно не відповідь на питання.
Патрік Мевзек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.