首页 > 解决方案 > Ansible 设计模式可以安全地将 SSH 密钥存储在 Git 存储库中吗?

问题描述

我一周前开始使用 Ansible,抱歉,如果这是一个简单的问题,我没有这方面的经验......

我的问题是我需要使用 Ansible 开发软件部署解决方案,其他开发人员将来可以轻松使用。在这个解决方案中,需要下载一个包含 VagrantFile 的 Git 存储库,然后创建一个安装 Ansible 的 Vagrant 框,其中 Ansible 被配置为使用跳转服务器和网关连接到 Hadoop 集群。

为了连接到公司的环境可以使用 SSH 密钥或用户/密码(开发人员有自己的开发人员帐户),所以我决定生成用于开发的 SSH 密钥,我在 Ansible 中使用以下方式:

库存文件:

[company_jumpserver]
IP.ADDR.OF.COMP ansible_ssh_private_key_file=~/.ssh/id_rsa

[company_gateway]
GW_ALIAS ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_ssh_common_args='-o ProxyCommand="ssh -i ~/.ssh/id_rsa -W %h:%p DEV_USER_X@IP.ADDR.OF.COMP"'

[company_hadoop_edgenode]
EDGE_ALIAS ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_ssh_common_args='-o ProxyCommand="ssh -i ~/.ssh/id_rsa -o ProxyCommand=\"ssh -i ~/.ssh/id_rsa DEV_USER_X@IP.ADDR.OF.COMP -W GW_ALIAS:22\" DEV_USER_X@GW_ALIAS -W EDGE_ALIAS:22"'

剧本yaml文件:

- name: Reach jumpserver
  hosts: company_hadoop_edgenode
  remote_user: DEV_USER_X
  tasks:
    - ping:
    - command: hostname
      register: out
    - debug: msg="{{out.stdout_lines}}"

问题:

问题是我想安全地存储 SSH 密钥,不仅仅是为了我,而是为了任何开发人员(没关系,如果我稍后将他们的 SSH 密钥添加到 Ansible 配置中)。

由于将 SSH 密钥直接存储在 Git 存储库中不是一个好的模式,所以我研究了如何存储加密的密码: https ://docs.ansible.com/ansible/2.4/vault.html(这个文档是有间隙的并且在某些情况下有故障)

现在我可以将任何 SSH 密码转换为加密格式,如下所示:

my_password: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      62313365396662343061393464336163383764373764613633653634306231386433626436623361
      6134333665353966363534333632666535333761666131620a663537646436643839616531643561
      63396265333966386166373632626539326166353965363262633030333630313338646335303630
      3438626666666137650a353638643435666633633964366338633066623234616432373231333331
      6564

但我不清楚,为多个用户存储和使用加密 SSH 密钥的好模式是什么。

我更喜欢基于--ask-vault-pass而不是的解决方案--vault-id,因为在后一种情况下文档不准确。

谢谢您的帮助!

标签: githadoopsshansiblessh-keys

解决方案


为什么不使用 SSH 的代理转发?您只需要在远程主机上安装公钥。您可能希望将这些公钥存储在您的 ansible 项目 git 存储库中,以便在新用户加入您的公司时轻松安装新的基础架构/配置更新。将此添加到您的ansible.cfg文件中。

[ssh_connection]
ssh_args = -o ForwardAgent=yes

但是如果你需要共享私钥,那你就做错了。

有关 SSH 代理转发的一些附加背景信息。

编辑:回答评论

如果您可以保证用户登录在整个基础架构以及您的用户工作站中是相同的,那么以下工作不会:

- name: Reach jumpserver
  hosts: company_hadoop_edgenode
  remote_user: "{{ lookup('env', 'LOGIN') }}"
  tasks:
    - ping:
    - command: hostname
      register: out
    - debug: msg="{{out.stdout_lines}}"

如果您不能保证,那么在我工作的地方,我们做了以下事情:我们有一个专用于用户个人设置的变量文件。它被导入到剧本中任何需要的地方。有存储的 API 密钥,凭据,......源代码,它被 git 保留,只提供一个模板来帮助新来者填写它。出于安全原因,我们要求用户保管该文件。在下面的示例中,我将该文件命名为company-member.yml

- name: Reach jumpserver
  hosts: company_hadoop_edgenode
  remote_user: "{{ company_login }}"
  vars_files:
    - vars/company-member.yml
  tasks:
  # ...  

并在company-member.yml

company_login: my_personal_login
# And all other personal info and credentials

推荐阅读