在源代码管理中存储Ansible SSH私钥?

63

我已经开发了一个 Ansible playbook 几周了,因此,我对这种技术的经验相对较短。我的部分策略包括在整个清单中使用自定义的 ansible_ssh_user 来对主机进行配置,但是,这样的用户将需要其自己的 SSH 密钥对,这将涉及一些关于持有/存储其对应私钥的计划。在生产环境中,该 playbook 将被克隆/拉取并在某个特定的 playbook node 中运行,其角色是配置剩余的基础设施。

起初,我想只是将私钥放在 playbook git 存储库中,但是我仍然对此有所顾虑,主要是因为明显的安全原因和相关的常识,因此我需要请教您这个问题。

鉴于这一情况,请回答以下跟进问题:

  • 在基于 Ansible 的开发环境中,在源代码控制中保存私有 SSH 密钥是否合理?
  • 该做法是否仅适用于开发环境,而另一个本地 Git 分支将用于保存实际的生产SSH 私钥?
  • 最好是通过 Ansible Vault 解决这种情况吗?我以前从未使用过它,但无论如何,我还不能确定是否适合使用它。
  • 在您的经验中,您将如何处理生产环境中的此类情况?在这种特殊情况下,最佳做法是什么?
2个回答

87

在版本控制中存储任何形式的明文秘密都是一个糟糕的主意,包括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

9

由于您是从头开始进行配置,因此您应该在 playbook node生成 私钥/公钥对,并通过 authorized_keys 模块分发公钥。这样可以避免在除了需要的主机之外的任何地方存储密钥信息。以下是可在 playbook node 上执行的playbook:

---
- 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 vault安全。只在主节点上保留SSH密钥,并在需要通过中间“playbook”节点进行身份验证时使用SSH转发。 - Steve E.
假设“ansible_ssh_user”公钥可用于远程主机的“~/.ssh/authorized_key”文件。本地ansible.cfg文件需要进行哪些更改?默认的remote_user值是否应更新为“ansible_ssh_user”? - emeraldjava
5
灾难恢复时会发生什么? - frostymarvelous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接