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がログファイルにクリアテキストのパスワードを書き込めないようにするにはどうすればよいですか?
観察された動作は、debconfモジュールのバグのようです。 バグレポート を提出しました。
Githubのユーザーbcocaは、パスワードを設定するタスクでno_log: true
ディレクティブを使用してロギングを防止できることを指摘しました。これは回避策であり、バグが修正されるまで機能します。
機密情報を含むタスクがsyslogまたはその他のログに記録されないようにするには、タスクでno_log:trueを設定します。
- name: secret stuff
command: "echo {{secret_root_password}} | Sudo su -"
no_log: true
タスクの実行は記録されますが、詳細はほとんどありません。また、使用するモジュールはno_logをサポートする必要があるため、カスタムモジュールをテストします。
詳細は Ansible FAQ を参照してください。プレイブック全体に適用できますが、「censored!」で出力が少し厄介になります。メッセージ。
単に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-パスワード変数
このアプローチでは、パスワードとログインを非表示にするだけでなく、操作の出力も取得します
Ansibleバージョンを1.6.1にアップグレードして解決しました
Sudo pip install ansible==1.6.1
Ansible docs に従って:
log_path
存在し、
ansible.cfg
で構成されている場合、Ansibleは指定された場所での実行に関する情報をログに記録します。 Ansibleを実行しているユーザーがログファイルに対する権限を持っていることを確認してください:log_path=/var/log/ansible.log
この動作はデフォルトではオンになっていません。この設定がない場合、ansibleは、管理対象マシンのsyslogに呼び出されたモジュール引数を記録することに注意してください。パスワード引数は除外されます。
制御ノードでlog_path
を設定するような音は、宛先ノードにログがあるnotになります。
これは、このスレッドからのTheDESTROSの回答への追加です。
wrapper-script.sh.j2
echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
- 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
モジュールを使用して、小さなラッパースクリプトをその場で作成できます。
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
を銀行のパスワードとして。
プレイブックの 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