Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 源代码管理中的Ansible SSH私钥?_Git_Ssh_Ansible_Ssh Keys - Fatal编程技术网

Git 源代码管理中的Ansible SSH私钥?

Git 源代码管理中的Ansible SSH私钥?,git,ssh,ansible,ssh-keys,Git,Ssh,Ansible,Ssh Keys,我开发Ansible playbook已经有几个星期了,因此,我使用这种技术的经验相对较短。我的部分策略包括使用定制的ansible\u ssh\u用户在整个资源清册中配置主机,但是,这样的用户将需要自己的ssh密钥对,这将涉及到某种持有/存储其对应私钥的计划。在生产环境中,此playbook将被克隆/拉取,并在某个playbook节点内运行,该节点的作用是提供基础设施的其余部分 起初,我想把这个私钥放在playbook git存储库中,但我还是在重新考虑它,主要是因为有一些明显的安全原因和常识

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

起初,我想把这个私钥放在playbook git存储库中,但我还是在重新考虑它,主要是因为有一些明显的安全原因和常识,因此我需要就此事咨询您

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

  • 在基于Ansible的开发环境中,在源代码管理中持有私有SSH密钥是否合理
  • 这种做法是否只建议用于开发环境,而playbook节点内的另一个本地git分支将用于保存实际的生产SSH私钥
  • 通过Ansible Vault解决这种情况会更好吗?我以前从未使用过这种方法,但尽管如此,我仍然无法判断这是否适合使用它
  • 根据您的经验,在生产环境中,您会采取什么方法来解决这个问题?在这个特定场景中,您认为什么是最佳实践

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

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

因为您是从头开始设置的,所以您应该在playbook节点上生成私钥/公钥对,然后通过
授权密钥模块分发公钥。这将消除在任何地方存储机密的需要,除非在需要的主机上。以下是实现此目的的剧本,将在剧本节点上执行:


好的解决方案-任何自动私钥解决方案通常意味着密钥没有密码,您仍然需要手动提供密码以确保ansible vault的安全。如果需要通过中间
playbook
节点使用SSH密钥进行身份验证,请仅将SSH密钥保留在主节点上,并使用SSH转发。假设“ansible\u SSH\u user”公钥在远程主机的“~/.SSH/authorized\u key”文件上可用。需要对本地ansible.cfg文件进行哪些更改?是否应将默认远程用户值更新为“ansible\u ssh\u user”?灾难恢复时会发生什么情况?