Як я можу зупинити відповідальність від написання паролів до журналів?


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- це змінна, завантажена з Сейфу для відповідей. Це працює добре, але зараз на сервері є багато рядків у журналі:

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

Щоб запобігти входу задачі з конфіденційною інформацією в syslog або інше, встановіть no_log: true у завданні:

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

Виконання завдання все одно буде записано в журнал, але з невеликими деталями. Також використовуваний модуль повинен підтримувати no_log, тому протестуйте спеціальні модулі.

Див анзібль довідка для отримання додаткової інформації. Його можна застосувати до цілої книги, однак вихід "стає цензурним"! повідомлення.


2
Крім усього іншого, про це йдеться у відповіді serverfault.com/a/682823/9517
user9517 підтримує GoFundMonica

Напевно, ви також хочете встановитиdiff: no
DylanYoung

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: вірно працювати так, як очікувалося. Моя відповідна версія - 1.7.2. Що твоє?
jmcollin92

@ jmcollin92 Я зараз використовую 2.1. Існує керівництво тут про те , як встановити останню версію від джерела. Я використовую це як підсилювальне ще дозріває.
Клаус

Напевно, ви також хочете встановитиdiff: no
DylanYoung

2

Я вирішив, оновивши версію Ansible до 1.6.1

sudo pip install ansible==1.6.1

2

Відповідно до документів Ansible :

log_path

Якщо він присутній та налаштований ansible.cfg, Ansible буде записувати інформацію про страти у визначеному місці. Переконайтеся, що користувач, який працює у програмі Ansible, має права доступу до журналу:

log_path=/var/log/ansible.log 

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

Звуки , як установка log_pathна ваш вузлі управління приведуть НЕ мають журнали на вузлах призначення.


Насправді у мене є ansible.cfg в моєму місцевому реєстрі, куди я називаю ansible, встановлюючи log_path. Локальний журнал створюється добре і оновляється після нового запуску (журнал працює). Це не дозволяє (навіть якщо документ, на який ви вказали, обіцяє це), не заважає віддаленому хосту входити в систему. Також твердження "Аргументи пароля виключені" не здається 100% правдивим? Це помилка (чи навіть дві)?
Клаус

2
@claus "Аргументи пароля вилучені" стосується лише модулів, де аргумент пароля є явним. Ні в якому разі не можна відповідальним дізнатися, який аргумент буде паролем, а який не з такими загальними командами, як debconf, shell, raw тощо.
Droopy4096,

Будь ласка, прокрутіть праворуч у моїй початковій книзі. Це говорить vtype='password'. Це повинно бути явним IMHO? Я припускаю, що повідомлення журналу також створюється модулем debconf.
Клаус

Це неправильно. Документація повинна більш точно сказати "Зауважте, що ansible буде, незалежно від цього параметра , записувати аргументи модуля, викликані в системний журнал керованих машин."
аугурар

2

Є кращий спосіб, ніж просто no_log: Правда

- 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 - змінна пароля

При такому підході ви не тільки приховатимете паролі та логіни, але й отримаєте результат своєї операції


1

Це доповнення до відповіді TheDESTROS з цієї теми:

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

wrapper-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 або коли це неможливо, використовуючи файли облікових даних (або навіть виконувані файли).

Ось приклад того, як здійснити захищений логін підмена, уникаючи відкриття пароля:

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

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

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

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