源代码控制中的 Ansible SSH 私钥?
Ansible SSH private key in source control?
我已经开发 Ansible playbook 几个星期了,因此,我对这种技术的经验相对较短。我的部分策略包括使用自定义 ansible_ssh_user
在整个清单中配置主机,但是,此类用户将需要自己的 SSH 密钥对,这将涉及 holding/storing 其对应私钥的某种计划.在生产环境中,此剧本将 cloned/pulled 和 运行 在某个 剧本节点 中,其作用是提供其余基础设施。
起初,我只是想将该私钥放入 playbook git 存储库中,但我还是重新考虑了一下,主要是因为一些明显的安全原因和围绕它的常识,因此,我需要就此事咨询您。
在 table 上完成此设置后,以下是后续问题:
- 在基于 Ansible 的开发环境中,是否 sane/reasonable 在源代码管理中持有 SSH 私钥?
- 是否建议这种做法仅适用于开发环境,而 剧本节点 内的另一个本地 git 分支则用于保存实际生产的SSH私钥?
- 通过 Ansible Vault 解决这种情况会更好吗?我以前从未使用过它,但无论如何我还不能确定这是否适合使用它。
- 根据您的经验,您在生产环境中会采用什么方法来解决这个问题?在这种特定情况下,什么是最佳实践?
在版本控制中存储任何类型的明文秘密都是一个坏主意,包括 SSH 私钥。相反,使用 ansible-vault 来存储私钥。
ansible-vault
可以对任何文件类型进行操作。只需使用
加密文件
ansible-vault encrypt /path/to/local/private_key
然后安装密钥:
- name: Install a private SSH key
vars:
source_key: /path/to/local/private_key
dest_key: /path/to/remote/private_key
tasks:
- name: Ensure .ssh directory exists.
file:
dest: "{{ dest_key | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
src: "{{ source_key }}"
dest: "{{ dest_key }}"
mode: 0600
owner: user
早期版本的 ansible-vault 只能对定义在 var 文件中的变量进行操作,所以你必须这样做:
ssh_key: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
key_file: /home/user/.ssh/id_rsa
使用 ansible-vault 加密:
ansible-vault encrypt /path/to/var_file
并安装密钥:
- name: Ensure .ssh directory exists.
file:
dest: "{{ key_file | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
content: "{{ ssh_key }}"
dest: "{{ key_file }}"
mode: 0600
owner: user
感谢以下所有通过评论改进答案的人。
由于您是从头开始配置的,因此您应该在 剧本节点 上生成 private/public 密钥对,然后分发public 键通过 authorized_keys
模块。这将消除在需要它的主机上以外的任何地方存储秘密的需要。这是实现此目的的剧本,它将在 剧本节点 :
上执行
---
- hosts: 127.0.0.1
sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user locally
user: name=ansible_ssh_user generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
- name: copy the generated public key to an accessible location for the next play
shell: cp ~ansible_ssh_user/.ssh/id_rsa.pub /tmp/ansible_ssh_user.pub
- hosts: all
sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user
user: name=ansible_ssh_user groups=group1,group2
- name: Add RSA public key to the remote host
authorized_key: user=ansible_ssh_user key="{{ lookup('file', '/tmp/ansible_ssh_user.pub') }}"
- hosts: 127.0.0.1
sudo: yes
gather_facts: no
tasks:
- name: remove public key from /tmp
shell: rm /tmp/ansible_ssh_user.pub
...
我已经开发 Ansible playbook 几个星期了,因此,我对这种技术的经验相对较短。我的部分策略包括使用自定义 ansible_ssh_user
在整个清单中配置主机,但是,此类用户将需要自己的 SSH 密钥对,这将涉及 holding/storing 其对应私钥的某种计划.在生产环境中,此剧本将 cloned/pulled 和 运行 在某个 剧本节点 中,其作用是提供其余基础设施。
起初,我只是想将该私钥放入 playbook git 存储库中,但我还是重新考虑了一下,主要是因为一些明显的安全原因和围绕它的常识,因此,我需要就此事咨询您。
在 table 上完成此设置后,以下是后续问题:
- 在基于 Ansible 的开发环境中,是否 sane/reasonable 在源代码管理中持有 SSH 私钥?
- 是否建议这种做法仅适用于开发环境,而 剧本节点 内的另一个本地 git 分支则用于保存实际生产的SSH私钥?
- 通过 Ansible Vault 解决这种情况会更好吗?我以前从未使用过它,但无论如何我还不能确定这是否适合使用它。
- 根据您的经验,您在生产环境中会采用什么方法来解决这个问题?在这种特定情况下,什么是最佳实践?
在版本控制中存储任何类型的明文秘密都是一个坏主意,包括 SSH 私钥。相反,使用 ansible-vault 来存储私钥。
ansible-vault
可以对任何文件类型进行操作。只需使用
ansible-vault encrypt /path/to/local/private_key
然后安装密钥:
- name: Install a private SSH key
vars:
source_key: /path/to/local/private_key
dest_key: /path/to/remote/private_key
tasks:
- name: Ensure .ssh directory exists.
file:
dest: "{{ dest_key | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
src: "{{ source_key }}"
dest: "{{ dest_key }}"
mode: 0600
owner: user
早期版本的 ansible-vault 只能对定义在 var 文件中的变量进行操作,所以你必须这样做:
ssh_key: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
key_file: /home/user/.ssh/id_rsa
使用 ansible-vault 加密:
ansible-vault encrypt /path/to/var_file
并安装密钥:
- name: Ensure .ssh directory exists.
file:
dest: "{{ key_file | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
content: "{{ ssh_key }}"
dest: "{{ key_file }}"
mode: 0600
owner: user
感谢以下所有通过评论改进答案的人。
由于您是从头开始配置的,因此您应该在 剧本节点 上生成 private/public 密钥对,然后分发public 键通过 authorized_keys
模块。这将消除在需要它的主机上以外的任何地方存储秘密的需要。这是实现此目的的剧本,它将在 剧本节点 :
---
- hosts: 127.0.0.1
sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user locally
user: name=ansible_ssh_user generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
- name: copy the generated public key to an accessible location for the next play
shell: cp ~ansible_ssh_user/.ssh/id_rsa.pub /tmp/ansible_ssh_user.pub
- hosts: all
sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user
user: name=ansible_ssh_user groups=group1,group2
- name: Add RSA public key to the remote host
authorized_key: user=ansible_ssh_user key="{{ lookup('file', '/tmp/ansible_ssh_user.pub') }}"
- hosts: 127.0.0.1
sudo: yes
gather_facts: no
tasks:
- name: remove public key from /tmp
shell: rm /tmp/ansible_ssh_user.pub
...