如何阻止ansible将密码写入日志文件?


22

我正在设置一个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将明文密码写入日志文件?

Answers:


28

为了防止带有机密信息的任务被记录在syslog或其他日志中,请在任务上设置no_log:true:

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

任务的运行仍将被记录,但细节很少。另外,使用的模块必须支持no_log,因此请测试自定义模块。

有关更多详细信息,请参见Ansible FAQ。可以将其应用于整个剧本,但是在“审查!”的情况下,输出会有点讨厌。消息。


2
这个答案说的就是其他东西serverfault.com/a/682823/9517
user9517支持GoFundMonica

9

观察到的行为似乎是debconf模块中的错误。我提交了错误报告

github上的bcoca用户指出,可以no_log: true在任务中使用该指令(设置密码)来防止登录。这是一个解决方法,对我一直有效,直到修复了该错误。


使用该指令时出现错误。任何想法我做错了吗? ERROR: no_log is not a legal parameter in an Ansible task or handler
Bouke Versteegh

2
原来我有旧版本的ansible!要修复(ubuntu上): ,,sudo apt-add-repository ppa:ansible/ansiblesudo apt-get updatesudo apt-get install ansible
Bouke Versteegh

对我来说同样的问题,但是我无法使n_log:true可以正常工作。我的Ansible版本是1.7.2。你是什​​么人?
jmcollin92 2013年

@ jmcollin92我目前使用2.1。有一个指南这里如何从源代码安装最新版本。我认为这仍然很成熟。
克劳斯,2016年

2

我通过将Ansible版本升级到1.6.1解决了

sudo pip install ansible==1.6.1

2

根据Ansible docs

log_path

如果存在并在中进行配置ansible.cfg,Ansible将在指定位置记录有关执行的信息。确保运行Ansible的用户对日志文件具有权限:

log_path=/var/log/ansible.log 

默认情况下,此行为未启用。请注意,如果没有此设置,ansible将记录被调用到受管计算机系统日志的模块参数。密码参数不包括在内。

听起来像log_path在控制节点上进行设置将导致目标节点上没有日志。


实际上,我在本地目录中有一个ansible.cfg,在这里我称之为ansible,设置了log_path。新运行(记录正常)后,将正确创建本地日志并进行更新。这(即使您指出的文档答应了它)也不会阻止远程主机进行日志记录。另外,“密码参数被排除”的说法似乎不是100%正确吗?这是一个错误(甚至两个)吗?
claus 2015年

2
@claus“排除的密码参数”仅适用于密码参数明确的模块。有没有办法让ansible知道哪个说法是密码,这将不喜欢的debconf,贝壳,原材料等通用命令
Droopy4096

请在我的初始剧本中滚动到右侧。它说vtype='password'。恕我直言,这应该足够明确吗?我假设日志消息也是由debconf模块创建的。
克劳斯,2016年

这是不正确的。文档应该更准确地说:“请注意,无论此设置如何,ansible都会记录被调用到受管计算机syslog的模块参数。”
augurar

2

有一种比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-密码变量

通过这种方法,您不仅可以隐藏密码和登录名,还可以获取操作的输出


1

这是该线程对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中包含秘密,则只有一个警告。如果要避免使用外部模板,则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但是您仍然可以看到命令的输出。

大多数需要登录的工具的确实现了上述更为安全的方法之一。在代码中使用CLI在CLI中使用凭据就像拥有123456您的银行密码一样。

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.