Ansible使用Bitwarden存储Vault密码

  Bitwarden(Vaultwarden) 提供了命令行版本的客户端, 利用 Ansible 的 vault_password_file, 我们可以很方便的在使用 ansible-vault 时调用 Bitwarden 里的密码。

配置 bitwarden-cli

  这里仅以 macOS 为例,其他的操作系统直接参考官方文档即可: 安装bitwarden-cli|官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 安装
brew install bitwarden-cli

# 配置server地址
bw config server https://xxx.xxx

# 登录
bw login

# 登录完成后可以查看一下状态
bw status

# 正常来说, 即使是登录了, `bw` 每次执行可能也都会要求输入主密码, 这时候你可以使用如下命令让当前shell会话免密码:
export BW_SESSION=$(bw unlock --raw)

# 测试创建一个密码item # 参考 https://bitwarden.com/help/cli/#create
bw get template item | jq ".name=\"Ansible-test-alliot-blog\" | .login=$(bw get template item.login | jq '.username="alliot" | .password="password123"')" | bw encode | bw create item

# 获取这个密码
bw get password Ansible-test-alliot-blog

配置 Ansible

  通过上一步的配置,我们已经可以在终端通过 bw 命令创建和获取密码了, 在 Ansible 这边,我们测试使用 ansible-vault 来加密一个文件,并将密码存储到 Bitwarden, 随后使用 Bitwarden 密码来完成对加密文件的解密。
  首先我们在当前项目路径或是家目录创建一个 ansible.cfg。(具体在哪里创建取决于你想要的作用域, 优先级参考 Ansible官方文档: config) ,我这里直接以家目录为例。 vim ~/.ansible.cfg 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[defaults]
nocows = 1
host_key_checking = False
inventory = inventory/inventory.ini
ansible_ssh_user = root
interpreter_python = auto_silent
stdout_callback = debug


# 支持脚本执行获得密码 <<<======= 新增这行即可
vault_password_file = ~/vault-pass.sh


[ssh_connection]
pipelining =True
ssh_args=-o ControlMaster=auto -o ControlPersist=60s

  在配置文件中, 指定 ~/vault-pass.shvault_password_file, 该脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

set -e

# 需要先安装bitwarden-cli
# brew install bitwarden-cli
# bw config server https://xx.xxx
# bw login # 登录
# bw sync # sync密钥
# bw logout # 退出
# export BW_SESSION=$(bw unlock --raw)
bw get password "Ansible-test-alliot-blog"

  别忘了赋予它可执行权限: chmod +x ~/vault-pass.sh

使用 Ansible-vault

  假设我现在有一个文件需要使用 ansible-vault 加密: alliot-blog.yaml, 我们可以直接使用 ansible-vault 命令行执行:

1
2
ansible-vault encrypt alliot-blog.yaml
New Vault password:

  这是默认 ansible-vault 配置提示的交互式输入加密用的 Vault password, 在我们配置了上述脚本集成 Bitwarden 后,这个命令交互将变成如下:

1
2
3
ansible-vault encrypt alliot-blog.yaml         

? Master password: [input is hidden]

  这里交互要求输入的是 Bitwarden 的密码, 完成登录后,将直接调用前面我们在 Bitwarden 中配置的 “Ansible-test-alliot-blog” 作为加密用的 Vault password。
  至此, 便实现了 Ansible-vault 调用 Bitwarden 中的密码。

结语

  Bitwarden 提供了多平台的客户端, 以及完善的 API, 利用这些开放的接口, 我们可以实现很多集成, 将零散的密码、凭证统一管理。
不过, 享受这种集中化管理带来的便利的同时, 也要防止被 “一锅端”, 别忘了安全加固与备份。