web-dev-qa-db-ja.com

ansibleがログファイルにパスワードを書き込むのをどのように停止できますか?

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がログファイルにクリアテキストのパスワードを書き込めないようにするにはどうすればよいですか?

22
claus

観察された動作は、debconfモジュールのバグのようです。 バグレポート を提出しました。

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

9
claus

機密情報を含むタスクがsyslogまたはその他のログに記録されないようにするには、タスクでno_log:trueを設定します。

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

タスクの実行は記録されますが、詳細はほとんどありません。また、使用するモジュールはno_logをサポートする必要があるため、カスタムモジュールをテストします。

詳細は Ansible FAQ を参照してください。プレイブック全体に適用できますが、「censored!」で出力が少し厄介になります。メッセージ。

31
Bill Carlson

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

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

3
TheDESTROS

Ansibleバージョンを1.6.1にアップグレードして解決しました

Sudo pip install ansible==1.6.1
2
0x3bfc

Ansible docs に従って:

log_path

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

log_path=/var/log/ansible.log 

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

制御ノードでlog_pathを設定するような音は、宛先ノードにログがあるnotになります。

2
Droopy4096

これは、このスレッドからの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から、または資格情報ファイル(または実行可能ファイル)を使用できない場合に資格情報を提供することをお勧めします。

パスワードの公開を回避することにより、安全なpodmanログインを実行する方法の例を次に示します。

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

これにより、シークレットはresultで公開されませんが、コマンドの出力を表示することはできます。

ログインを必要とするほとんどのツールは、前述のより安全な方法の1つを実装しています。コードでCLIの資格情報を使用することは、123456を銀行のパスワードとして。

1
sorin

プレイブックの environment 引数は、秘密を隠しておくのに適しています。 -vvvvを使用しても、シークレットは出力されません。プレイ全体で利用可能です。

- hosts: control_Host
  gather_facts: no
  become: no
  environment:
    PASSWORD: "{{ password }}"
  tasks:

   - local_action: "Shell ./foobar.sh ${PASSWORD}"

   - local_action: "Shell echo ${PASSWORD}"

出力:

ansible-playbook -i ... playbooks/demo.yml -v

PLAY [control_Host] *********************************************************************************

TASK [Shell] *********************************************************************************
changed: [localhost -> localhost] => {
    "changed": true,
    "cmd": "./foobar.sh ${PASSWORD}",
    "delta": "0:00:00.013467",
    "end": "2020-04-03 17:42:03.950534",
    "rc": 0,
    "start": "2020-04-03 17:42:03.937067"
}

TASK [Shell] *********************************************************************************
changed: [localhost -> localhost] => {
    "changed": true,
    "cmd": "echo ${PASSWORD}",
    "delta": "0:00:00.005925",
    "end": "2020-04-03 17:42:04.319085",
    "rc": 0,
    "start": "2020-04-03 17:42:04.313160"
}

STDOUT:

my_secret_password
0
selle