我怎样才能减less某些Ansible任务的冗长,不泄漏密码到系统日志?

有时我想使用Ansible的lineinfileblockinfile模块将密码写入某个configuration文件。 如果我这样做,整个行或块,包括密码,结束了我的syslog

由于我不认为syslog是一个安全的地方存储我的密码,我怎么能告诉Ansible不要泄漏我的密码到syslog ? 我希望有办法做到这一点,否则我会认为这是Ansible的一个很大的安全问题。

您可以使用以下ad-hoc命令重现它:

 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系统上的Ansible Ubuntu PPA的 Ansible 2.0.0.2。

no_log 属性隐藏syslog中的数据。 它可以应用于单个任务

 - name: secret task shell: /usr/bin/do_something --value={{ secret_value }} no_log: True 

或剧本:

 - hosts: all no_log: True 

debugging在激活时是不可能的,因此build议仅将其用于单个任务。 此function从Ansible版本1.5起可用 。 正如1.5版本的发布公告所述:

现在,任务也可以采用“no_log = True”选项来阻止敏感任务触发系统日志。 (看起来像密码的参数已被过滤)

在大多数情况下应该过滤密码。

我开发了一个callback插件来隐藏默认输出的密码,它parsing包含密码的密钥的输出字典,对于它们中的每一个,它都用********replace值。

在文件夹./plugins/callback中创build一个名为protect_data.py的文件添加下面的代码:

 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 ,…),则必须对其执行相同的操作