Как я могу запретить ansible записывать пароли в лог-файлы?

22

Я настраиваю сервер MySQL и хочу, чтобы Ansible установил mysql-rootпароль во время установки.

С помощью Интернета я придумал это решение:

- name: Set MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
  apt: pkg=mysql-server state=latest

mysql_root_pwdпеременная, загружаемая из Ansible Vault. Это работает нормально, но теперь на сервере есть много строк в журнале:

Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None

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

клауса
источник

Ответы:

28

Чтобы предотвратить регистрацию задачи с конфиденциальной информацией, в системном журнале или другом, установите no_log: true для задачи:

- name: secret stuff
  command: "echo {{secret_root_password}} | sudo su -"
  no_log: true

Выполнение задачи будет по-прежнему регистрироваться, но с небольшими деталями. Кроме того, используемый модуль должен поддерживать no_log, поэтому тестируйте пользовательские модули.

Смотрите Ansible FAQ для более подробной информации. Это может быть применено ко всей пьесе, однако результат становится немного неприятным с «цензурой!» Сообщения.

Билл Карлсон
источник
2
Помимо всего прочего, этот ответ говорит serverfault.com/a/682823/9517
user9517 поддерживает GoFundMonica
9

Наблюдаемое поведение кажется ошибкой в ​​модуле debconf. Я подал отчет об ошибке .

Пользователь bcoca на github указал, что no_log: trueдиректива может использоваться в задачах, которые устанавливают пароли, чтобы предотвратить ведение журнала. Это обходной путь, который работает для меня, пока ошибка не будет исправлена.

клауса
источник
Я получаю сообщение об ошибке, когда использую эту директиву. Есть идеи, что я делаю неправильно? ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh
2
Оказывается, у меня была старая версия ansible! Чтобы исправить (на убунту): sudo apt-add-repository ppa:ansible/ansible, sudo apt-get update,sudo apt-get install ansible
Bouke Versteegh
Та же проблема для меня, но я не могу заставить n_log: true работать так, как ожидалось. Моя Ansible версия 1.7.2. Что твое ?
jmcollin92
@ jmcollin92 Я сейчас использую 2.1. Существует руководство здесь о том , как установить последнюю версию от источника. Я использую это, поскольку ansible все еще созревает.
Клаус
2

Я решил обновить версию Ansible до 1.6.1

sudo pip install ansible==1.6.1
0x3bfc
источник
2

Согласно Ansible документам :

log_path

Если он присутствует и настроен ansible.cfg, Ansible будет регистрировать информацию о казнях в указанном месте. Убедитесь, что у пользователя, работающего с Ansible, есть права доступа к файлу журнала:

log_path=/var/log/ansible.log 

Это поведение не включено по умолчанию. Обратите внимание, что ansible без этой настройки будет записывать аргументы модуля, вызываемые в системном журнале управляемых машин. Аргументы пароля исключены.

Похоже, что установка log_pathна вашем контрольном узле приведет к тому, что на целевых узлах не будет журналов.

Droopy4096
источник
На самом деле у меня есть ansible.cfg в моем локальном каталоге, где я вызываю ansible и задаю log_path. Локальный журнал создается правильно и обновляется после нового запуска (ведение журнала работает). Это не (даже если документ, который вы указали, обещает) не препятствует удаленному хосту регистрироваться. Кроме того, утверждение «Аргументы паролей исключены», похоже, не на 100% верно? Это ошибка (или даже две)?
Клаус
2
@claus «аргументы пароля исключены» применяется только к модулям, где аргумент пароля является явным. Для ansible нет никакого способа узнать, какой аргумент будет паролем, а какой - нет с общими командами, такими как debconf, shell, raw и т. Д.
Droopy4096
Пожалуйста, прокрутите вправо в моей начальной книге. Это говорит vtype='password'. Это должно быть достаточно явно ИМХО? Я предполагаю, что сообщение журнала также создается модулем debconf.
Клаус
Это неверно В документации должно быть более точно сказано: «Обратите внимание, что ansible будет, независимо от этого параметра , записывать аргументы модуля, вызываемые в системном журнале управляемых машин».
Авгурар
2

Существует лучший способ, чем просто no_log: True

- name: write in string variables login and password
  set_fact:
    temp_user: "{{ USER_VAR }}"
    temp_pass: "{{ PASSWORD_VAR }}"


- name: Your operation with password in output
  shell: '/opt/hello.sh'
  ignore_errors: True
  no_log: True
  register: myregister

- debug:
    msg: '{{ myregister.stderr | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stderr != ""

- debug:
    msg: '{{ myregister.stdout | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stdout != ""

- fail:
    msg: "error shell /opt/hello.sh"
  when: myregister.stderr != ""

Как видите, вам нужно добавить:

ignore_errors: true
no_log: true

А затем сделайте вывод результата команды с помощью regex_replace, где:

USER_VAR - переменная входа

PASSWORD_VAR - переменная пароля

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

TheDESTROS
источник
1

Это дополнение к ответу TheDESTROS из этой темы:

  1. напишите шаблон, который обернет команду секретом:

обертка-script.sh.j2

echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
  1. Вызовите скрипт-обертку и удалите его сразу:
- name: create template
  template:
    src: wrapper-script.sh.j2
    dest: /tmp/wrapper-script.sh
    mode: 0700
  no_log: True
- name: invoke command with secret and remove it
  shell: /tmp/wrapper-script.sh; rm -f /tmp/wrapper-script.sh

Вам нужно немного меньше кода и вы можете выводить команды из ваших журналов. Предусмотрено только одно предупреждение, если секрет находится в командах stdout. Если вы хотите избежать внешнего шаблона, copyмодуль с параметром contentможет помочь написать небольшой скрипт-оболочку на лету.

Кристиан Кайзер
источник
1

Этот no_log: trueподход следует использовать в качестве последнего средства, если другие попытки потерпят неудачу, потому что это сделает выполнение задачи полностью непрозрачным, и у вас не будет никакой подсказки, когда она потерпит неудачу.

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

Вот пример того, как выполнить безопасный вход в систему podman, не раскрывая пароль:

- name: secured login
  become: true
  command: >
    podman login --username={{ user }} --password-stdin ...
  args:
    stdin: "{{ secret }}"
  register: result

При этом секрет не будет раскрыт, resultно вы все равно сможете увидеть вывод команды.

Большинство инструментов, требующих входа, реализуют один из упомянутых более безопасных подходов. Использование учетных данных для CLI в коде похоже 123456на пароль вашего банка.

Сорин
источник