无需公网 IP 和 SSH 密钥:用 AWS SSM 实现安全的 EC2 访问
告别手动管理 Access Key、开放 22 端口和分配公网 IP,用 AWS IAM Identity Center + SSM Session Manager 构建零信任的 EC2 访问方案。
背景
传统访问 EC2 的方式存在几个痛点:
- 需要管理
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY,过期后要手动更新 - EC2 必须分配公网 IP 才能 SSH 进去
- 安全组需要开放 22 端口,暴露攻击面
- SSH 密钥对需要妥善管理和分发
本文介绍如何通过 AWS SSO + SSM Session Manager 彻底解决以上问题。
一、配置 AWS SSO,告别手动 Access Key
为什么用 SSO
配置 SSO 后,AWS CLI 凭证完全由 SSO token 驱动,不再需要手动设置或更新任何 Key。凭证过期后只需重新走一遍浏览器授权即可,无需接触 ~/.aws/credentials 文件。
配置步骤
运行向导:
aws configure sso
按提示填入 SSO Start URL、Region 和 Session Name,完成后 ~/.aws/config 会生成类似配置:
[default]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = AdministratorAccess
region = us-east-2
[sso-session my-sso]
sso_start_url = https://d-xxxxxxxxxx.awsapps.com/start
sso_region = us-west-2
sso_registration_scopes = sso:account:access
日常使用
# 登录(走浏览器授权,token 缓存到本地)
aws sso login
# 验证身份
aws sts get-caller-identity
只要 SSO session 有效,AWS 凭证会自动续期,无需任何手动操作。
| 对比项 | 手动 Access Key | SSO |
|---|---|---|
| 需要复制粘贴 Keys | ✅ 每次过期都要 | ❌ 不需要 |
| 凭证自动刷新 | ❌ | ✅ |
| 过期后操作 | 重新拿 Key 粘贴 | aws sso login |
二、用 SSM Session Manager 替代 SSH
交互式终端访问
无需 SSH,直接通过 SSM 进入实例:
aws ssm start-session \
--target i-xxxxxxxxxxxxxxxxxxx \
--document-name AWS-StartInteractiveCommand \
--parameters '{"command": ["sudo su - ubuntu"]}'
推送 SSH 公钥(一次性操作)
如果需要使用 SCP 传输文件,先通过 SSM 将本地公钥写入 EC2:
# 查看本地公钥
cat ~/.ssh/id_ed25519.pub
# 通过 SSM 写入
aws ssm start-session \
--target i-xxxxxxxxxxxxxxxxxxx \
--document-name AWS-StartInteractiveCommand \
--parameters "{\"command\": [\"echo 'ssh-ed25519 AAAAC3Nza... you@mac' >> /home/ubuntu/.ssh/authorized_keys\"]}"
如果 .ssh 目录不存在,先初始化:
aws ssm start-session \
--target i-xxxxxxxxxxxxxxxxxxx \
--document-name AWS-StartInteractiveCommand \
--parameters '{"command": ["mkdir -p /home/ubuntu/.ssh && chmod 700 /home/ubuntu/.ssh && touch /home/ubuntu/.ssh/authorized_keys && chmod 600 /home/ubuntu/.ssh/authorized_keys"]}'
三、SSH / SCP over SSM Tunnel
配置好公钥后,可以让普通的 ssh 和 scp 命令也通过 SSM tunnel 工作,无需开放 22 端口。
安装 Session Manager Plugin
# macOS
brew install --cask session-manager-plugin
# 验证
session-manager-plugin --version
配置 SSH ProxyCommand
编辑 ~/.ssh/config:
Host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
User ubuntu
StrictHostKeyChecking no
使用 SSH 和 SCP
# SSH 登录
ssh i-xxxxxxxxxxxxxxxxxxx
# 上传文件
scp ./localfile.txt i-xxxxxxxxxxxxxxxxxxx:~/
# 下载文件
scp i-xxxxxxxxxxxxxxxxxxx:~/remotefile.txt ./
# 上传目录
scp -r ./mydir i-xxxxxxxxxxxxxxxxxxx:~/
四、移除公网 IP,彻底隐藏实例
SSM 不依赖公网 IP,可以将 EC2 完全从公网隐藏。
移除公网 IP
- EIP 用户:EC2 控制台 → Elastic IPs → 解除关联
- 已有实例:停止实例 → Actions → Instance Settings → Modify auto-assign IP settings → 关闭
- 新建实例:Launch 时 Network Settings → Auto-assign public IP → Disable
安全组配置
| 方向 | 规则 |
|---|---|
| Inbound | ❌ 全部删除(包括 22 端口) |
| Outbound | ✅ 保留 443(SSM 需要访问 AWS 端点) |
SSM 正常工作的网络前提
EC2 需要能访问 AWS SSM 端点(三选一):
- 实例在公有子网,有出站 443
- 配置 NAT Gateway 出公网
- 配置 VPC Endpoint for SSM(完全内网,最安全)
总结
通过以上配置,最终实现的效果:
| 能力 | 传统方案 | SSM 方案 |
|---|---|---|
| AWS CLI 认证 | 手动管理 Access Key | SSO 自动管理 |
| 终端访问 EC2 | SSH + 公网 IP + 22 端口 | SSM Session,无需公网 |
| 文件传输 | SCP via 公网 | SCP over SSM Tunnel |
| 公网暴露 | 必须有公网 IP | 完全不需要 |
| 入站端口 | 22 端口开放 | 零入站规则 |
这套方案的核心思路是零信任:不依赖网络边界(公网 IP、开放端口),而是通过 IAM 身份和 SSM 通道来控制访问权限,安全性和便捷性都得到了显著提升。

浙公网安备 33010602011771号