GitLab存储SSH密钥执行Ansible报UNPROTECTED PRIVATE KEY错误求助
问题根因
报错核心有两个层面:
- SSH协议强制要求私钥文件仅所有者可读写,权限超过
0600时会直接拒绝加载,你从GitLab拉取到本地的私钥文件权限为0644,不符合SSH要求 - 直接将明文私钥提交到Git仓库属于严重安全风险,所有拥有仓库读取权限的用户都可获取私钥访问你的基础设施资源,Git本身也不会跟踪保存除可执行位之外的文件权限,因此你本地修改权限后提交到GitLab也不会生效。
解决方案
方案1:使用GitLab CI/CD加密变量存储私钥(推荐,安全性最高)
- 先删除仓库中现存的
lab_ssh_key文件,同时清理Git提交历史避免私钥泄露 - 进入GitLab对应仓库的「设置」-「CI/CD」-「变量」页面,新增加密变量:
- 变量名可自定义为
LAB_SSH_PRIVATE_KEY - 变量值粘贴完整的私钥内容
- 勾选「保护变量」「掩码变量」选项,避免私钥在日志中泄露
- 变量名可自定义为
- 在Jenkins执行脚本/CI流水线脚本中,执行ansible命令前动态生成私钥文件并设置正确权限:
# 将加密变量中的私钥写入临时文件 echo "$LAB_SSH_PRIVATE_KEY" > /tmp/lab_ssh_key # 设置SSH要求的0600权限 chmod 600 /tmp/lab_ssh_key # 执行ansible时指定私钥路径,也可提前在ansible.cfg中配置private_key_file参数指向该路径 ansible-playbook your_playbook.yml --private-key /tmp/lab_ssh_key # 执行完成后可删除临时私钥文件避免残留 rm -f /tmp/lab_ssh_key
方案2:执行脚本前修改本地私钥权限(不推荐,仅临时场景使用)
如果必须将私钥保留在Git仓库中,可在执行ansible命令前主动修改拉取到本地的私钥权限:
chmod 600 Ansible/lab_ssh_key # 再执行ansible-playbook命令即可正常加载私钥
该方案仍存在私钥明文存储在Git仓库的安全风险,需严格管控仓库的访问权限。
方案3:关闭SSH权限校验(极不推荐,仅临时测试使用)
如果仅需要临时调试,可在ansible.cfg中添加SSH参数关闭权限校验,生产环境禁止使用:
[ssh_connection] ssh_args = -o StrictModes=no
内容的提问来源于stack exchange,提问作者Sina Wolf
相关产品推荐
相关产品推荐

