【问题标题】:Ansible SSH private key in source control?源代码控制中的 Ansible SSH 私钥?
【发布时间】:2015-06-06 04:38:10
【问题描述】:

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

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

有了这一套,下面是后续问题:

  • 在基于 Ansible 的开发环境中,在源代码控制中持有私有 SSH 密钥是否合理/合理?
  • 这种做法是否建议仅用于开发环境,而 playbook 节点内的另一个本地 git 分支 将用于保存实际的生产 SSH 私钥?李>
  • 通过 Ansible Vault 解决这种情况会更好吗?我以前从未使用过它,但无论如何我还不能确定这是否适合使用它。
  • 根据您的经验,您在生产环境中会采取什么方法?在这种特殊情况下,最佳做法是什么?

【问题讨论】:

    标签: git ssh ansible ssh-keys


    【解决方案1】:

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

    感谢以下所有使用 cmets 改进答案的人。

    【讨论】:

      【解决方案2】:

      由于您是从头开始配置,您应该在 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
      ...
      

      【讨论】:

      • 好的解决方案 - 任何自动私钥解决方案通常意味着密钥没有密码,您仍然需要手动提供密码以确保 ansible vault 安全。仅将 SSH 密钥保留在主节点上,如果您需要通过中间 playbook 节点使用密钥进行身份验证,请使用 SSH 转发。
      • 假设 'ansible_ssh_user' 公钥在远程主机 '~/.ssh/authorised_key' 文件中可用。需要对本地 ansible.cfg 文件进行哪些更改?是否应该将默认 remote_user 值更新为“ansible_ssh_user”?
      • 灾难恢复时会发生什么?
      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2018-10-14
      相关资源
      最近更新 更多