无需公网 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

配置好公钥后,可以让普通的 sshscp 命令也通过 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 通道来控制访问权限,安全性和便捷性都得到了显著提升。

posted @ 2026-03-06 02:29  LexLuc  阅读(1)  评论(0)    收藏  举报