如何通过AWS SSM配置SSH隧道访问VPC私有子网内EC2、RDS、Redis等资源
基于AWS SSM实现本地macOS访问VPC私有子网资源实操指南与疑问
方案背景
- 需求场景:测试自研应用的RDS数据库、Redis及私有API网关
- 选型理由:相比OpenVPN、公有子网堡垒机方案,SSM无需暴露公网入口规避安全风险,且配置速度快适合MVP开发阶段
- 适用环境:单可用区VPC,包含1个公有子网+1个私有子网的沙箱环境
具体配置步骤
- 使用VPC启动向导在us-east-1c可用区创建包含1个公有子网、1个私有子网的VPC
- 在私有子网中启动Redis实例
- 在私有子网中启动使用Amazon Linux 2 AMI的EC2实例,不开启公网访问权限
- 创建IAM角色绑定到上述EC2实例,附加
AmazonSSMManagedInstanceCore策略 - 创建仅开启编程访问权限的IAM用户,附加
AmazonSSMFullAccess、EC2InstanceConnect策略 - 本地通过pip3安装awscli包:
pip3 install awscli - 本地macOS安装SSM插件
- 终端执行
aws configure配置上述IAM用户的凭证信息 - 执行命令测试SSM会话连接:
aws ssm start-session --target i-xxxxxxxxxxxxxxxxx
输出示例:
sh-4.2$
- 执行命令为EC2实例推送SSH公钥:
aws ec2-instance-connect send-ssh-public-key \ --availability-zone us-east-1c \ --instance-id i-xxxxxxxxxxxxxxxxx \ --instance-os-user ec2-user \ --ssh-public-key file://$HOME/.ssh/id_rsa.pub
- 在
$HOME/.ssh/config文件中添加如下配置:
host i-* ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
- 执行隧道转发命令,将本地5000端口映射到远端Redis实例6379端口:
ssh ec2-user@i-xxxxxxxxxxxxxxxxx -NL 5000:some_redis_aws_url.cache.amazon.com:6379 -i test.pem -v
疑问解答与优化建议
通用疑问解答
- EC2实例绑定的SSM角色中,KMS加密、日志上传功能是否必需?
AmazonSSMManagedInstanceCore是基础必需策略,KMS加密和日志属于可选的安全审计配置,非功能必需项。日志未上传通常是因为角色缺少CloudWatch日志写入、S3上传的对应权限,或SSM会话管理器的默认配置未指定日志存储位置,无审计需求可以直接关闭相关配置减少操作复杂度。 - 本地IAM用户的
AmazonSSMFullAccess和EC2InstanceConnect策略是否必需?
两个都是必需策略:AmazonSSMFullAccess用于调用SSM会话接口建立隧道,EC2InstanceConnect用于推送SSH公钥到目标EC2实例实现身份认证。生产环境可以按最小权限原则裁剪策略,只开放指定实例的访问权限即可,无需使用全量访问策略。 - 执行
send-ssh-public-key命令的作用是什么?
EC2 Instance Connect会把你本地的公钥临时写入目标EC2实例的~/.ssh/authorized_keys文件,默认有效期60秒,到期自动删除,无需在实例上提前预置静态公钥,比传统固定密钥的方式更安全。 - 建立隧道时为什么还需要指定
.pem文件?怎么省略?
报错是因为SSH默认会优先读取本地默认路径的私钥,如果你的公钥是用id_rsa.pub推送的,把命令里的-i test.pem改成-i ~/.ssh/id_rsa即可;也可以在~/.ssh/config的host i-*配置块下加一行IdentityFile ~/.ssh/id_rsa,后续执行SSH命令就不用再加-i参数。
流程优化方案
可以把公钥推送、隧道建立的步骤封装成Shell脚本,执行时只需要传入目标实例ID、本地端口、远端资源地址+端口三个参数即可,一键完成隧道建立,不需要每次手动执行多步命令。
内容的提问来源于stack exchange,提问作者dataviews
相关产品推荐
相关产品推荐

