ansibleがログファイルにパスワードを書き込むのを止めるにはどうすればよいですか?


22

MySQLサーバーをセットアップしていmysql-rootますが、インストール中にAnsibleにパスワードを設定させたいです。

インターネットの助けを借りて、私はこの解決策を思いつきました。

- 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_pwdAnsible 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

機密情報を含むタスクがsyslogなどに記録されないようにするには、タスクで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モジュールのバグのようです。バグレポートを提出しました。

githubのユーザーbcocaはno_log: true、パスワードを設定するタスクでディレクティブを使用してロギングを防止できると指摘しました。これは回避策であり、バグが修正されるまで動作します。


そのディレクティブを使用するとエラーが発生します。 ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh

2
私は古いバージョンのansibleを持っていることがわかりました!(Ubuntuの上に)固定する:sudo apt-add-repository ppa:ansible/ansiblesudo apt-get updatesudo 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

2

Ansible docsに従って:

log_path

で設定されている場合ansible.cfg、Ansibleは指定された場所での実行に関する情報をログに記録します。Ansibleを実行しているユーザーがログファイルに対する権限を持っていることを確認してください。

log_path=/var/log/ansible.log 

この動作はデフォルトではオンになっていません。ansibleは、この設定なしで、管理対象マシンのsyslogに呼び出されるモジュール引数を記録することに注意してください。パスワード引数は除外されます。

log_pathコントロールノードに設定するような音は、宛先ノードにログを持たないことになります。


実際、ローカルディレクトリにansible.cfgがあり、そこでansibleを呼び出してlog_pathを設定しています。ローカルログは、新しい実行後に正常に作成されます(ログは機能します)。これは(あなたが指摘したドキュメントがそれを約束しているとしても)リモートホストがログに記録することを妨げません。また、「パスワード引数は除外されます」という文は100%真実ではないようです。これはバグ(または2つ)ですか?
クラウス

2
@claus「パスワード引数を除外」は、パスワード引数が明示的なモジュールにのみ適用されます。パスワードことと思われる引数知るansibleための方法はありませんれていないなどのdebconf、シェル、生、などの一般的なコマンドと希望
Droopy4096

最初のプレイブックで右にスクロールしてください。と言うvtype='password'。それは十分に明白な私見ですか?ログメッセージもdebconfモジュールによって作成されると想定しています。
クラウス

これは間違っています。ドキュメントには、「この設定関係なく、 ansibleは管理対象マシンのsyslogに呼び出されたモジュール引数を記録することに注意してください」と正確に記述する必要があります。
8

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-パスワード変数

このアプローチでは、パスワードとログインを非表示にするだけでなく、操作の出力も取得します


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にシークレットがある場合、注意すべき点は1つだけです。外部テンプレートを回避したい場合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は、銀行のパスワードとして持っているようなものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.