通过CircleCI SSH连接AWS EC2是否需配置.pem文件及如何保障密钥安全
CircleCI 连接 AWS EC2 问题解决方案
1. SSH 连接失败修复
你当前的命令报错核心原因是:ssh -i 参数需要接收本地私钥文件的路径,而你直接传入了环境变量名,无法被SSH识别。
修复步骤如下:
- 先确认你存到CircleCI环境变量的PEM内容完整,必须包含首尾的
-----BEGIN RSA PRIVATE KEY-----、-----END RSA PRIVATE KEY-----标记,无多余换行或空格。 - 在CircleCI的
config.yml对应job的执行步骤中,先将环境变量中的私钥内容写入临时文件,修正权限后再发起连接,示例脚本如下:
# 写入私钥到临时文件 echo "$EC2_SSH_PRIVATE_KEY" > ~/ec2_private_key.pem # 修正私钥权限(SSH强制要求私钥仅所有者可读可写) chmod 600 ~/ec2_private_key.pem # 发起SSH连接,添加参数跳过主机指纹校验(适配CI非交互场景) ssh -o StrictHostKeyChecking=no -i ~/ec2_private_key.pem ubuntu@myinstance.compute.amazonaws.com # 连接执行完操作后立即删除临时私钥文件 rm -f ~/ec2_private_key.pem
2. 私钥安全优化方案
CircleCI本身的环境变量是加密存储的,只要关闭项目公开权限、限制项目成员范围,基础安全性可以得到保障。如果需要更高等级的安全防护,可以采用以下方案:
- 方案1:替换为AWS SSM Session Manager连接(最优,无需管理私钥)
完全不用暴露SSH私钥,通过IAM权限控制访问权限。给CircleCI的OIDC身份绑定专用IAM角色,授予SSM会话访问权限后,直接通过AWS CLI发起连接,命令如下:aws ssm start-session --target 你的EC2实例ID - 方案2:加密私钥存储
本地将PEM私钥用AES加密后存入代码仓库,解密密钥仅存在CircleCI环境变量中。流水线运行时临时解密使用,用完立即销毁私钥文件:
本地加密命令示例:
流水线解密使用命令示例:openssl enc -aes-256-cbc -salt -in ec2_key.pem -out ec2_key.pem.encopenssl enc -d -aes-256-cbc -in ./ec2_key.pem.enc -out ~/ec2_private_key.pem -k "$PRIVATE_KEY_DECRYPT_PWD" chmod 600 ~/ec2_private_key.pem # 后续SSH操作执行完成后删除私钥 rm -f ~/ec2_private_key.pem - 方案3:缩小网络访问范围
在EC2安全组中配置22端口的入站规则,仅允许CircleCI官方公布的出口IP段访问,即使私钥泄露也无法从其他IP建立连接。
内容的提问来源于stack exchange,提问作者sonphung.xf
相关产品推荐
相关产品推荐

