源代码控制中的 Ansible SSH 私钥?

Ansible SSH private key in source control?

我已经开发 Ansible playbook 几个星期了,因此,我对这种技术的经验相对较短。我的部分策略包括使用自定义 ansible_ssh_user 在整个清单中配置主机,但是,此类用户将需要自己的 SSH 密钥对,这将涉及 holding/storing 其对应私钥的某种计划.在生产环境中,此剧本将 cloned/pulled 和 运行 在某个 剧本节点 中,其作用是提供其余基础设施。

起初,我只是想将该私钥放入 playbook git 存储库中,但我还是重新考虑了一下,主要是因为一些明显的安全原因和围绕它的常识,因此,我需要就此事咨询您。

在 table 上完成此设置后,以下是后续问题:

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