如何减少某些Ansible任务的冗长性,以免将密码泄漏到syslog中?


11

有时我想使用Ansible lineinfileblockinfile模块将密码写入某些配置文件。如果这样做,整个行或块(包括密码)都将出现在我的syslog

由于我不认为syslog将密码存储在安全的地方,我如何告诉Ansible不要将密码泄漏到其中syslog?我希望有办法做到这一点,否则我会认为这是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系统上使用了来自官方Ansible Ubuntu PPA的 Ansible 2.0.0.2 。

Answers:


3

no_log 属性将数据隐藏在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但同时禁用了控制台输出中的日志记录输出。有什么办法可以改变吗?
aef 2016年

对不起。我没有找到有关此主题的信息。我建议只为任务设置属性,并且仅在调试播放后设置属性。如前所述,Ansible应该已经过滤了看起来像密码的参数。所以也许这是一个错误。同样,我不知道Ansible如何确定参数是否为密码。可能是隐藏的错误/缺失功能password = XXX
亨里克·平格尔'16

您从哪里得到的印象是应该在Ansible中默认隐藏密码?文档中是否提到了这一点?
aef

我的答案中的最后一个引号(看起来像密码的参数已被过滤)。但是我还没有找到该功能的任何其他来源
Henrik Pingel

3

我开发了一个回调插件来隐藏默认输出的密码,它为包含密码的键解析输出字典,对于每个密码,它都用********替换值。

创建一个protect_data.py在文件夹./plugins/callback中添加的文件,添加以下代码:

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


哦,哇,真是太好了。但是,这要求我为包含秘密的所有内容设置一个键名为“ password”的字典。我本来希望使用meta标志来指示变量包含秘密,但是谢谢!其他问:这是否还会掩盖输出中的秘密ansible-playbook --diff(文件差异更改)?
gertvdijk

我不知道,我从未尝试过
Nelson G.

-3

有人建议改用Vault可以解决此问题。


这不能为问题提供答案。一旦您拥有足够的声誉,您就可以在任何帖子中发表评论;而是提供不需要问询者澄清的答案。- 评论
小鸡

1
保管箱有助于加密静态数据,但使用密码时,密码可以轻松显示在日志文件中。
康斯坦丁·苏沃洛夫'18

@chicks这看起来像是错误的答案,而不是非答案
迈克尔·汉普顿

我没有在查看工具中看到该选项。因为这更像是评论而不是答案,所以我觉得自己处理得很合理。
小鸡

我的旗帜也被拒绝,我仍然看不到上面的句子是如何减少Ansible冗长的答案。这最多不过是一条暗示着另一个想法的评论,当然不是对这个问题的答案。
Patrick Mevzek '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.