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

cla*_*aus 30 security ansible

我正在设置 MySQL 服务器并希望 Ansiblemysql-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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*son 40

要防止在系统日志或其他中记录具有机密信息的任务,请在no_log: true任务上设置:

- name: secret stuff
  command: "echo {{secret_root_password}} | sudo su -"
  no_log: true
Run Code Online (Sandbox Code Playgroud)

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

有关更多详细信息,请参阅Ansible 常见问题解答。它可以应用于整个剧本,但是输出会因“审查! ”消息而变得有点讨厌。

  • 除其他外,这就是这个答案所说的 http://serverfault.com/a/682823/9517 (2认同)
  • 您可能还想设置 `diff: no` (2认同)

cla*_*aus 10

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

github 上的用户 bcoca 指出,可以no_log: true在任务中使用设置密码的指令来防止日志记录。这是一种解决方法,在修复错误之前对我有用。

  • 原来我有一个旧版本的ansible!修复(在 ubuntu 上):`sudo apt-add-repository ppa:ansible/ansible`、`sudo apt-get update`、`sudo apt-get install ansible` (2认同)

The*_*ROS 5

有一个比 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 != ""
Run Code Online (Sandbox Code Playgroud)

如您所见,您需要添加:

ignore_errors: true
no_log: true
Run Code Online (Sandbox Code Playgroud)

然后使用 regex_replace 输出该命令的结果,其中:

USER_VAR - 登录变量

PASSWORD_VAR - 密码变量

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