git - 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 密钥的好模式是什么。
以后如何将其他开发人员用户动态添加到 Ansible 配置中?
我应该如何重组我的库存文件以使用可以验证自己的用户(现在我的 SSH 密钥的路径是硬编码的)。
我应该在这里使用什么样的变量(组/主机)?
我应该在哪里存储加密的 SSH 密钥(或保管库变量)以获得灵活的解决方案?
以后应该如何添加新的 SSH 密钥?
我更喜欢基于--ask-vault-pass
而不是的解决方案--vault-id
,因为在后一种情况下文档不准确。
谢谢您的帮助!
解决方案
为什么不使用 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
推荐阅读
- angular - 标头共享组件上的购物车数量未从 Angular 10 中的另一个组件更新
- jquery - 在 Woocommerce 的不同页面上加载 flexslider
- r - 如何根据列名向量过滤 R 中的数据框?
- python - 我可以在 netmiko/paramiko 中获取 ssh 连接的源端口吗?
- javascript - 如何在 JavaScript 中对齐表单文件?
- php - WooCommerce 自定义 Ajax 添加到购物车:如何设置自定义价格?
- javascript - 如何防止黑客在电子商务中修改产品价格
- mysql - MYSQL 选择销售列出所有名称,即使它们没有出售
- java - 如何在更新时从 JSpinner 获取价值?
- linear-algebra - 为 cirq 函数设置随机种子