ansible设计模式安全地将ssh密钥存储在git存储库中?

e4yzc0pl  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(477)

我一周前就开始使用ansible了,抱歉,如果这是一个简单的问题,我没有这方面的经验。。。
我的问题是,我需要通过使用ansible开发一个软件部署解决方案,其他开发人员将来可以很容易地使用它。在这个解决方案中,需要下载一个git存储库,其中包含一个vagrant文件,然后创建一个安装了ansible的vagrant框,其中ansible被配置为通过使用jumpserver和网关连接到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配置中,这是可以的)。
由于直接在git存储库中存储ssh密钥不是一种好模式,因此我研究了如何存储加密的密码:https://docs.ansible.com/ansible/2.4/vault.html (在某些情况下,此文档是错误的)
现在我可以将任何ssh密码转换为如下加密格式:

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

但我不清楚,存储和使用多个用户的加密ssh密钥的好模式是什么。
以后如何将其他开发人员用户动态添加到ansible配置中?
我应该如何重构我的清单文件以使用能够验证自己的用户(现在ssh密钥的路径是硬编码的)。
我应该在这里使用什么类型的变量(组/主机)?
我应该将加密的ssh密钥(或保险库变量)存储在哪里,以获得灵活的解决方案?
将来我应该如何添加新的ssh密钥?
我更喜欢基于 --ask-vault-pass 而不是 --vault-id ,因为后者的文档不准确。
谢谢你的帮助!

7bsow1i6

7bsow1i61#

为什么不使用ssh的代理转发?您只需要在远程主机上安装公钥。您可能希望将这些公钥存储在ansible project git存储库中,以便在新用户加入公司时在新的infrastructure/config更新上安装。将此添加到您的 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

相关问题