首页 文章

源控件中的Ansible SSH私钥?

提问于
浏览
45

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

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

有了这个设置,这里是后续问题:

  • 在基于Ansible的开发环境中,在源代码管理中保存私有SSH密钥是否合理/合理?

  • 这种做法是否仅建议用于开发环境,而playbook节点中的另一个本地git分支将用于保存实际的 生产环境 SSH私钥?

  • 通过Ansible Vault解决这种情况会更好吗?我以前从未使用过这个,但不管怎样我还不知道这是否适合使用它 .

  • 根据您的经验,您在 生产环境 环境中采用什么方法?在这种特定情况下,它会被视为最佳实践?

2 回答

  • 56

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

    感谢所有下面那些通过他们的评论改进答案的人 .

  • 5

    由于您是从头开始配置,因此应在playbook节点上生成私钥/公钥对,然后通过 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
    ...
    

相关问题