AWS EC2 如何通过系统管理器 SSM 无需 SSH 密钥登录

文章导读
直接用 AWS Systems Manager 的 Session Manager 功能,只要实例状态正常且权限配置正确,就能在不开放 22 端口、不依赖 SSH 密钥的情况下登录。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

直接用 AWS Systems Manager 的 Session Manager 功能,只要实例状态正常且权限配置正确,就能在不开放 22 端口、不依赖 SSH 密钥的情况下登录。

先说结论:这是 AWS 官方推荐的托管实例登录方式,适合需要审计日志、不想管理密钥对且实例能联网的场景。

  • 适合:Amazon Linux、Ubuntu 等主流系统,且已安装 SSM Agent 的实例。
  • 先准备:确保实例绑定了带有 SSM 权限的 IAM Role,且安全组允许出站 HTTPS。
  • 验收:在 AWS 控制台 Session Manager 页面能看到实例状态为“联机”,并能成功启动会话。

命令速用版

如果你本地安装了 AWS CLI 且配置了凭证,可以直接用以下命令登录:

aws ssm start-session `--target` i-0123456789abcdef0

i-0123456789abcdef0 换成你的实例 ID 即可。不需要指定密钥文件,也不需要知道公网 IP。

AWS EC2 如何通过系统管理器 SSM 无需 SSH 密钥登录

为什么会这样

传统 SSH 登录是客户端直接连接实例的 22 端口,依赖密钥对验证身份。而 Session Manager 是实例上的 SSM Agent 主动向外连接 AWS 服务端,建立加密通道。

这意味着:

AWS EC2 如何通过系统管理器 SSM 无需 SSH 密钥登录
  • 你不需要在安全组开放入站端口(22),降低了被扫描攻击的风险。
  • 权限控制走 IAM 策略,可以细粒度控制谁能登录哪台实例,而不是谁有密钥文件谁就能登。
  • 会话日志可以自动存到 S3 或 CloudWatch Logs,方便审计。

分步处理

按顺序检查以下配置,确保实例能被 SSM 接管:

  1. 创建并绑定 IAM Role
    • 进入 IAM 控制台,选择“角色”>“创建角色”。
    • 可信实体选择"AWS 服务”,用例选择"EC2"。
    • 权限策略搜索并勾选 AmazonSSMManagedInstanceCore
    • 命名角色(如 SSMInstanceRole)并创建。
    • 进入 EC2 控制台,选中实例,点击“操作”>“安全”>“修改 IAM 角色”,选择刚创建的角色并保存。
  2. 检查网络出站:实例需要能访问公网 AWS 服务端点(HTTPS 443 端口)。如果在私有子网,需配置 NAT Gateway 或 VPC Endpoint(com.amazonaws.region.ssm 等)。
  3. 检查或安装 SSM Agent
    • 大多数 Amazon Linux 2/2023 和 Ubuntu 16.04+ 预装了 Agent。
    • 如果状态显示“离线”,可通过 SSH 手动安装:
      • Amazon Linux: sudo yum install -y amazon-ssm-agent
      • Ubuntu: sudo snap install amazon-ssm-agent `--classic`
    • 启动服务:sudo systemctl start amazon-ssm-agent
  4. 配置会话日志(可选但推荐)
    • 进入 Systems Manager 控制台,左侧菜单"Session Manager"。
    • 点击“首选项”选项卡,点击“编辑”。
    • 勾选"CloudWatch Logs"或"S3 存储桶”,选择对应的日志组或桶。
    • 保存后,新建立的会话将自动记录命令历史。
  5. 启动会话:配置完成后,进入 AWS 控制台 Systems Manager - Session Manager,点击“开始会话”,选择目标实例即可。

怎么验证是否生效

登录成功后,在终端执行以下命令确认身份和环境:

whoami
uname -a

同时,回到 AWS 控制台 Session Manager 页面,查看该实例的历史会话记录。如果开启了日志记录,应该能在配置的 S3 桶或 CloudWatch 日志组里看到命令执行记录。

常见坑

  • Agent 版本过旧:如果实例很久没更新,SSM Agent 可能无法连接新服务端点。建议在维护窗口期更新 Agent。
  • 私有子网无出站:放在私有子网的实例如果没有 NAT Gateway 且没配 VPC Endpoint,Agent 无法连上 AWS 服务,状态会一直显示“离线”。
  • IAM 权限不足:即使实例有 Role,操作者的 IAM 用户也需要有 ssm:StartSession 权限,否则会报 AccessDenied。
  • 实例状态检查:如果 EC2 状态检查失败(Status Check Failed),SSM 通常也无法连接,需先排查实例健康状态。

参考来源

  • AWS Official Documentation, "Set up AWS Systems Manager Session Manager", https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html
  • AWS Official Documentation, "Installing SSM Agent", https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-prerequisites.html