源控件中的Ansible SSH私钥?

时间:2015-04-01 13:41:11

标签: git ssh ansible ssh-keys

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

起初,我想把这个私钥放在playbook git存储库中,但是我对它有了第二个想法,主要是因为有一些明显的安全原因和它周围的常识,因此我需要有关此事的咨询。

在表格中设置此设置,以下是后续问题:

  • 在基于Ansible的开发环境中,在源代码管理中保存私有SSH密钥是否合理/合理?
  • 这种做法是否仅建议用于开发环境,而 playbook节点中的另一个本地git分支将用于保存实际的生产SSH私钥?
  • 通过Ansible Vault解决这种情况会更好吗?我以前从未使用过这个,但不管怎样我还不知道这是否适合使用它。
  • 根据您的经验,您在生产环境中采用什么方法?在这种情况下,它会被视为最佳做法?

2 个答案:

答案 0 :(得分:60)

在修订控制中存储任何类型的明文密钥都是一个坏主意,包括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

感谢所有下面的人通过他们的评论改进了答案。

答案 1 :(得分:5)

由于您是从头开始配置,因此您应 playbook节点上生成私钥/公钥对,然后通过authorized_keys分发公钥模块。除了在需要它的主机上之外,这将消除在任何地方存储秘密的需要。这是一个实现这一目标的剧本,将在 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
...