使用SSM在AWS EC2克隆Bitbucket私有库遇公钥权限问题求解决
首先咱们先搞清楚核心原因:当你通过SSM Run Command执行命令时,命令是在SSM服务默认使用的系统用户(比如Amazon Linux 2上是ssm-user,Ubuntu可能是ubuntu或root)的上下文下运行的,不是你手动登录EC2时用的个人用户。你之前上传到自己用户~/.ssh目录的密钥,对SSM进程来说完全不可见——它只会去找执行命令那个用户的~/.ssh目录。
下面是几个可行的解决方案,按从易操作到安全合规的顺序排列:
方案1:把SSH密钥放到SSM执行用户的.ssh目录
步骤1:确认SSM使用的用户
先通过SSM执行whoami命令,确定当前执行命令的用户:
aws ssm send-command --instance-ids <你的EC2实例ID> --document-name "AWS-RunShellScript" --parameters commands="whoami"
查看命令输出,得到用户名(比如ssm-user)。
步骤2:配置SSH密钥和known_hosts
把你的Bitbucket私钥放到该用户的.ssh目录,同时设置严格的权限(SSH对文件权限要求很高,权限太宽会直接拒绝使用):
# 创建.ssh目录并设置权限 aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="mkdir -p /home/ssm-user/.ssh && chmod 700 /home/ssm-user/.ssh" # 写入私钥(替换成你的私钥内容,注意保留原格式) aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="echo '-----BEGIN OPENSSH PRIVATE KEY----- 你的私钥完整内容,每一行都要保留 -----END OPENSSH PRIVATE KEY-----' > /home/ssm-user/.ssh/id_rsa && chmod 600 /home/ssm-user/.ssh/id_rsa" # 添加Bitbucket到known_hosts,避免首次连接的交互式确认 aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="ssh-keyscan bitbucket.org >> /home/ssm-user/.ssh/known_hosts && chmod 644 /home/ssm-user/.ssh/known_hosts"
注意:如果你的私钥设置了密码,这个方案不适用,因为SSM命令无法交互式输入密码。
步骤3:克隆仓库
现在就可以正常执行克隆命令了:
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git clone git@bitbucket.org:<你的Bitbucket用户名>/<仓库名>.git /目标克隆目录"
方案2:用HTTPS + Bitbucket App Password克隆(无需SSH密钥)
这个方案跳过SSH配置,直接用HTTPS认证,操作更简单:
步骤1:创建Bitbucket App Password
登录Bitbucket → 点击个人头像 → Personal settings → App passwords → Create app password,勾选Repository read权限(如果需要写入权限就额外勾选),生成后务必保存好这个密码(Bitbucket只显示一次)。
步骤2:执行HTTPS克隆
把你的Bitbucket用户名和App Password嵌入到HTTPS URL里,直接克隆:
aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git clone https://<你的Bitbucket用户名>:<你的App Password>@bitbucket.org/<你的用户名>/<仓库名>.git /目标克隆目录"
小提示:如果App Password里有特殊字符(比如
@、&),需要做URL编码,比如@换成%40,&换成%26。
方案3:用EC2 Instance Profile + Bitbucket IAM集成(最安全)
如果你的EC2实例已经配置了Instance Profile,并且Bitbucket支持AWS IAM身份验证,这种方案不需要存储任何静态密钥,完全依赖临时IAM凭证认证,符合安全最佳实践:
步骤1:配置Bitbucket的AWS IAM集成
在Bitbucket仓库的设置里,找到Access management → AWS IAM,启用集成,添加你的AWS账户ID,并授予仓库对应的访问权限。
步骤2:安装认证助手并克隆
# 安装Bitbucket AWS认证助手(以Amazon Linux 2为例,其他系统替换对应的下载链接) aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="curl -L https://github.com/awslabs/aws-bitbucket-creds/releases/latest/download/aws-bitbucket-creds-linux-amd64 -o /usr/local/bin/aws-bitbucket-creds && chmod +x /usr/local/bin/aws-bitbucket-creds" # 配置Git使用该认证助手 aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git config --global credential.helper '!aws-bitbucket-creds'" # 克隆仓库 aws ssm send-command --instance-ids <实例ID> --document-name "AWS-RunShellScript" --parameters commands="git clone https://bitbucket.org/<你的用户名>/<仓库名>.git /目标克隆目录"
内容的提问来源于stack exchange,提问作者Mohamed Adel

