是否存在类似SSH Agent转发的AWS凭证代理与临时凭证传递方案?
针对你提出的需求——在通过SSM/EC2 Instance Connect连接远程EC2时,无需重复MFA验证,自动传递临时AWS凭证并实现透明轮换——以下是几种可行的实现方案:
一、本地凭证代理 + SSM端口转发(最接近SSH Agent Forwarding的方案)
这个方案的核心是将远程会话中的AWS SDK/CLI请求代理回本地,利用本地已验证(含MFA)的凭证生成临时密钥,全程本地凭证不会离开本地系统,且自动轮换对用户透明。
具体步骤:
本地启动AWS凭证代理服务
使用工具(如aws-vault)启动本地凭证代理,它会以你本地已通过MFA验证的身份处理远程的AWS请求签名:aws-vault proxy --port 8100该服务会在本地8100端口监听,返回临时凭证给远程请求。
通过SSM建立端口转发
连接EC2实例时,将远程的8100端口转发到本地的8100端口:aws ssm start-session --target <你的EC2实例ID> --document-name AWS-StartPortForwardingSession --parameters '{"portNumber": ["8100"], "localPortNumber": ["8100"]}'配置远程会话使用代理获取凭证
在远程EC2会话中,创建临时AWS配置文件并设置环境变量,让AWS SDK/CLI通过代理获取凭证:# 设置临时配置文件路径 export AWS_CONFIG_FILE=/tmp/aws-proxy-config # 写入配置内容,指定通过本地代理获取凭证 cat > /tmp/aws-proxy-config << EOF [default] credential_process = curl -s http://localhost:8100/credentials EOF此后远程会话中的所有AWS操作,都会自动通过代理获取本地生成的临时凭证,且凭证轮换由本地代理自动处理,无需用户干预。
二、自动化临时凭证注入(简单但需处理过期)
如果不需要完全的代理模式,可以在连接远程会话时,自动将本地生成的临时凭证注入到远程环境:
具体步骤:
本地生成临时凭证
利用本地已验证的身份生成带有效期的临时凭证(若需MFA,只需在本地验证一次):aws sts get-session-token --serial-number <你的MFA设备ARN> --token-code <MFA验证码> > /tmp/temp-creds.json通过SSM会话注入环境变量
连接EC2时,将临时凭证作为环境变量传入远程会话:# 提取凭证信息 export AWS_ACCESS_KEY_ID=$(jq -r '.Credentials.AccessKeyId' /tmp/temp-creds.json) export AWS_SECRET_ACCESS_KEY=$(jq -r '.Credentials.SecretAccessKey' /tmp/temp-creds.json) export AWS_SESSION_TOKEN=$(jq -r '.Credentials.SessionToken' /tmp/temp-creds.json) # 通过SSM启动会话并注入环境变量 aws ssm start-session --target <你的EC2实例ID> --parameters "environmentVariables={\"AWS_ACCESS_KEY_ID\":\"$AWS_ACCESS_KEY_ID\",\"AWS_SECRET_ACCESS_KEY\":\"$AWS_SECRET_ACCESS_KEY\",\"AWS_SESSION_TOKEN\":\"$AWS_SESSION_TOKEN\"}"此方案的缺点是临时凭证有有效期(默认12小时),过期后需要重新生成并注入,但优点是无需额外代理服务。
三、SSM会话文档自定义初始化(进阶自动化)
你可以创建自定义SSM会话文档,在启动远程会话时自动完成凭证代理配置或临时凭证注入,进一步简化操作:
- 编写SSM文档,包含端口转发配置和远程环境变量设置逻辑
- 连接时指定该自定义文档,实现一键完成所有配置
方案对比
| 方案 | 安全性 | 透明性 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| 本地代理+端口转发 | 最高(本地凭证不离开本地) | 完全透明(自动轮换) | 中等 | 长期远程会话、频繁AWS操作 |
| 临时凭证注入 | 中等(临时凭证存在于远程环境变量) | 需手动/脚本处理过期 | 低 | 短期会话、简单AWS操作 |
内容的提问来源于stack exchange,提问作者benjimin

