git-源代码管理中的SSH私钥?

我已经开发了Ansible剧本已经有几个星期了,因此,我在这种技术上的经验相对较短。 我的策略的一部分包括使用自定义ansible_ssh_user来在整个清单中配置主机,但是,此类用户将需要其自己的SSH密钥对,这将涉及某种计划来保存/存储其对应的私钥。 在生产环境中,此剧本将被克隆/拉出并在某个剧本节点内运行,该节点的作用是提供其余基础结构。

最初,我只是想将私钥放入剧本git存储库中,但尽管如此,我还是有第二个想法,主要是因为一些明显的安全原因和常识,因此我需要向您咨询 这件事。

摆好桌子后,以下是后续问题:

  • 在基于Ansible的开发环境中,在源代码控制中持有私有SSH密钥是否合理/合理?
  • 仅在开发环境中建议这种做法,而在playbook节点内使用另一个本地git分支来保存实际的生产SSH私钥吗?
  • 改用Ansible Vault处理这种情况会更好吗?我以前从未使用过这种方法,但是无论如何,我仍无法确定这是否是使用该方法的适当情况。
  • 根据您的经验,在生产环境中您将如何处理此问题?在这种特定情况下,什么是最佳实践?
Alejandro Ricoveri asked 2020-01-23T00:45:22Z
2个解决方案
65 votes

在修订控制中存储任何类型的纯文本机密(包括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

感谢以下所有改进了评论答案的人。

Ben Whaley answered 2020-01-23T00:46:13Z
5 votes

由于您是从头开始配置的,因此应该在剧本节点上生成私钥/公钥对,然后通过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
...
gmoon answered 2020-01-23T00:46:34Z
translate from https://stackoverflow.com:/questions/29392369/ansible-ssh-private-key-in-source-control