ときどき、Ansibleのlineinfile
またはblockinfile
モジュールを使用して、構成ファイルにパスワードを書き込みたいと思います。そうすると、行全体またはブロック(パスワードを含む)がsyslog
になります。
私はsyslog
をパスワードを保存する安全な場所とは考えていません。パスワードをsyslog
に漏らさないようにAnsibleに指示するにはどうすればよいですか?これを行う方法があるといいのですが、そうでない場合、これはAnsibleの大きなセキュリティ問題であると考えます。
たとえば、次のアドホックコマンドを使用してそれを再現できます。
ansible localhost -m blockinfile -a 'dest=/tmp/ansible_password_leak create=yes block="Password = {{password}}"' -e 'password=secret'
これがsyslog
になるところです:
ansible-blockinfile: Invoked with directory_mode=None force=None remote_src=None insertafter=None owner=None follow=False marker=# {mark} ANSIBLE MANAGED BLOCK group=None insertbefore=None create=True setype=None content=None serole=None state=present dest=/tmp/ansible_password_leak selevel=None regexp=None validate=None src=None seuser=None delimiter=None mode=None backup=False block=Password = secret
この例では、Debian "Jessie" 8システムで official Ansible Ubuntu PPA のAnsible 2.0.0.2を使用しました。
デフォルト出力のパスワードを非表示にするコールバックプラグインを開発しました。出力辞書でpasswordを含むキーを解析し、それぞれについて、値を********に置き換えます。
フォルダにprotect_data.py
という名前のファイルを作成./ plugins/callback addこのコードを追加:
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
import os, collections
class CallbackModule(CallbackModule_default):
CALLBACK_VERSION = 2.0
CALLBACK_TYPE = 'stdout'
CALLBACK_NAME = 'protect_data'
def __init__(self, display=None):
super(CallbackModule, self).__init__(display)
def hide_password(self, result):
ret = {}
for key, value in result.iteritems():
if isinstance(value, collections.Mapping):
ret[key] = self.hide_password(value)
else:
if "password" in key:
ret[key] = "********"
else:
ret[key] = value
return ret
def _dump_results(self, result, indent=None, sort_keys=True, keep_invocation=False):
return super(CallbackModule, self)._dump_results(self.hide_password(result), indent, sort_keys, keep_invocation)
ファイル内ansible.cfg:
stdout_callback
で行のコメントを外し、このプラグイン名に値を設定します(stdout_callback=protect_data
)callback_plugins
と設定値./plugins/callback
で行のコメントを外します出力はこのプラグインに対してのみ変更されます。別のプラグインを使用して出力(
logentries
、...)を表示する場合は、それを使用して同じことを行う必要があります
no_log
attribute は、syslog内のデータを非表示にします。単一のタスクに適用できます
- name: secret task
Shell: /usr/bin/do_something --value={{ secret_value }}
no_log: True
またはプレイブック:
- hosts: all
no_log: True
アクティブ化されている場合、デバッグは実際には不可能であるため、単一のタスクにのみ使用することをお勧めします。この機能は Ansible のバージョン1.5以降で使用できます。 1.5リリースのリリース発表で述べたように、
また、タスクで「no_log = True」オプションを使用して、機密タスクがsyslogに到達しないようにすることができます。 (パスワードのように見えるパラメーターは既にフィルターされています)
ほとんどの場合、パスワードはフィルタリングする必要があります。