AWS EC2不开放22端口:Session Manager与IMDSv2加固实战

📅 2026/7/18 16:53:33
AWS EC2不开放22端口:Session Manager与IMDSv2加固实战
很多团队给 EC2 配置安全组时会习惯性地加入一条0.0.0.0/0 - TCP 22然后再依赖强密码、改端口或 Fail2ban。问题是只要 22 端口对公网可达扫描、爆破和密钥管理就一直存在更换员工、外包交接和跳板机维护也会增加运维负担。这篇文章给出一套可验证、可回滚的改造方案使用 AWS Systems Manager Session Manager 管理 EC2确认链路可用后删除 22 端口入站规则再把实例元数据服务切换为 IMDSv2。最终目标不是“绝对安全”而是减少公网暴露面把访问授权收敛到 IAM并保留审计与故障恢复能力。适用范围Amazon Linux、Ubuntu 等已受 AWS Systems Manager 支持的 EC2命令以 AWS CLI v2 和 Bash 为例。生产环境先在测试实例验证尤其不要在 Session Manager 尚未连通时删除 SSH 入口。一、先把事实说清楚根据 AWS 官方文档Session Manager 可以通过浏览器或 AWS CLI 建立交互式会话不需要开放入站端口也不需要维护堡垒机或 SSH 密钥。访问控制由 IAM 完成。受管节点需要运行 SSM Agent、具备实例角色权限并能通过 HTTPS 访问 Systems Manager 所需服务端点没有公网出口的私有子网可使用 VPC Interface Endpoint。IMDSv2 与 Session Manager 解决的是不同问题Session Manager减少管理入口的公网暴露并集中管理“谁能连哪台机器”IMDSv2访问实例元数据前必须先取得会话令牌降低无令牌元数据请求带来的风险安全组与主机防火墙继续负责业务端口的网络边界CloudTrail、Session Manager 日志配置负责访问事件和会话审计。二、改造前检查满足四个前提准备以下变量exportAWS_REGIONap-southeast-1exportINSTANCE_IDi-0123456789abcdef0exportROLE_NAMEEC2-SSM-Core-RoleexportPROFILE_NAMEEC2-SSM-Core-Profile先确认本地身份和目标实例防止操作错账号或区域aws sts get-caller-identity aws ec2 describe-instances\--region$AWS_REGION\--instance-ids$INSTANCE_ID\--queryReservations[0].Instances[0].{State:State.Name,VpcId:VpcId,SubnetId:SubnetId,PrivateIp:PrivateIpAddress,Iam:IamInstanceProfile.Arn}检查清单实例处于running操作者有创建/附加 IAM 角色、修改 EC2 与启动 SSM 会话的权限实例能够出站访问 Systems Manager 服务通常需要 TCP 443当前 SSH 会话暂时保留用作回滚通道。事实边界具体服务端点随区域和代理版本存在差异应以 AWS 的 Session Manager prerequisites 页面及所在区域的服务端点为准。不要为了省事给实例添加与业务无关的宽泛 IAM 权限。三、创建最小可用的 EC2 实例角色3.1 创建信任策略保存为ec2-trust-policy.json{Version:2012-10-17,Statement:[{Effect:Allow,Principal:{Service:ec2.amazonaws.com},Action:sts:AssumeRole}]}创建角色并附加 AWS 托管策略aws iam create-role\--role-name$ROLE_NAME\--assume-role-policy-document file://ec2-trust-policy.json aws iam attach-role-policy\--role-name$ROLE_NAME\--policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore aws iam create-instance-profile\--instance-profile-name$PROFILE_NAMEaws iam add-role-to-instance-profile\--instance-profile-name$PROFILE_NAME\--role-name$ROLE_NAMEAmazonSSMManagedInstanceCore是供 EC2 角色使用的 AWS 托管策略提供 Systems Manager 核心功能所需权限。它不是给日常人员登录使用的用户权限策略也不应附加给 IAM 用户来“图省事”。3.2 关联到实例如果实例目前没有实例配置文件aws ec2 associate-iam-instance-profile\--region$AWS_REGION\--instance-id$INSTANCE_ID\--iam-instance-profileName$PROFILE_NAME如果已有实例角色不要直接覆盖。先检查原角色承载的业务权限再把AmazonSSMManagedInstanceCore合并到现有角色或使用变更流程替换配置文件。IAM 变更可能需要短时间传播遇到“角色已创建但实例看不到”时先等待并复查不要反复创建同名资源。四、验证 SSM Agent 和网络出口Amazon Linux 2/2023 及许多 AWS 提供的 Ubuntu AMI 通常预装 SSM Agent但不能假设所有自定义镜像都已安装。通过当前 SSH 或控制台执行sudosystemctl status amazon-ssm-agent --no-pagersudosystemctlenable--nowamazon-ssm-agentsudojournalctl-uamazon-ssm-agent-n80--no-pagerUbuntu 的 Snap 安装可能使用服务名snap.amazon-ssm-agent.amazon-ssm-agent.service应以systemctl list-units | grep ssm的实际结果为准。从本地检查实例是否注册为受管节点aws ssm describe-instance-information\--region$AWS_REGION\--filtersKeyInstanceIds,Values$INSTANCE_ID\--queryInstanceInformationList[0].{Ping:PingStatus,Agent:AgentVersion,Platform:PlatformName,LastPing:LastPingDateTime}预期PingStatus为Online。如果结果为空按顺序检查实例角色是否关联、Agent 是否运行、DNS 是否正常、出站 443 是否允许、NAT 或 VPC Endpoint 是否可达。五、先建立第二条会话再删除22端口5.1 浏览器连接在 AWS 控制台进入 EC2 → Instances → 选择实例 → Connect → Session Manager → Connect。能看到 shell 并执行以下命令才算第一阶段成功whoamihostnameuname-asudo-ntrue;echo$?whoami常见结果是ssm-user。是否具备 sudo 取决于操作系统、Agent 和本机 sudoers 配置生产环境应按职责收紧而不是默认所有会话都拥有无限制 root 权限。5.2 CLI 连接本地安装 AWS CLI v2 和 Session Manager plugin 后执行aws ssm start-session\--region$AWS_REGION\--target$INSTANCE_ID保持当前 SSH 不退出再开一个 Session Manager 会话。确认重连、sudo、DNS 和业务检查均正常后才删除安全组中的 22 端口规则。先列出实例安全组aws ec2 describe-instances\--region$AWS_REGION\--instance-ids$INSTANCE_ID\--queryReservations[0].Instances[0].SecurityGroups[*].[GroupId,GroupName]\--outputtable删除规则时优先使用规则 ID避免误删同端口但不同来源的规则aws ec2 describe-security-group-rules\--region$AWS_REGION\--filtersNamegroup-id,Valuessg-0123456789abcdef0\--querySecurityGroupRules[?IsEgressfalse].[SecurityGroupRuleId,IpProtocol,FromPort,ToPort,CidrIpv4,Description]\--outputtable aws ec2 revoke-security-group-ingress\--region$AWS_REGION\--group-id sg-0123456789abcdef0\--security-group-rule-ids sgr-0123456789abcdef0不要复制示例 ID必须替换成自己账号中的真实资源。删除后重新启动一次 Session Manager 会话确认入口已从 SSH 切换到 SSM。六、把实例元数据切换为 IMDSv26.1 先评估兼容性旧版 SDK、脚本或代理可能仍使用 IMDSv1。AWS 官方建议先观察 CloudWatch 的MetadataNoToken指标确认无令牌调用降为零再对现有实例强制 IMDSv2。生产实例不要跳过这一步。查看当前配置aws ec2 describe-instances\--region$AWS_REGION\--instance-ids$INSTANCE_ID\--queryReservations[0].Instances[0].MetadataOptions确认应用兼容后执行aws ec2 modify-instance-metadata-options\--region$AWS_REGION\--instance-id$INSTANCE_ID\--http-endpoint enabled\--http-tokens required容器环境的 hop limit 需要按网络路径评估。AWS 对在容器环境中要求 IMDSv2 的场景建议将响应 hop limit 设为 2普通主机不要机械照抄应以实际工作负载和最小可用值验证。6.2 在实例内验证无令牌请求应失败curl-s-o/dev/null-w%{http_code}\n\http://169.254.169.254/latest/meta-data/再使用 IMDSv2 令牌TOKEN$(curl-sS-XPUT\-HX-aws-ec2-metadata-token-ttl-seconds: 21600\http://169.254.169.254/latest/api/token)curl-sS\-HX-aws-ec2-metadata-token:$TOKEN\http://169.254.169.254/latest/meta-data/instance-id返回值应等于当前实例 ID。不要把实例角色临时凭证打印到日志、工单或聊天窗口。七、可选用 Session Manager 做端口转发数据库和内部管理面板不必直接开放公网端口。以下 Bash 示例把实例的 5432 端口映射到本地 15432aws ssm start-session\--region$AWS_REGION\--target$INSTANCE_ID\--document-name AWS-StartPortForwardingSession\--parameters{portNumber:[5432],localPortNumber:[15432]}然后本地客户端连接127.0.0.1:15432。这不等于数据库可以忽略账号、TLS 和最小权限它只改变网络访问路径。Windows PowerShell 的 JSON 引号转义与 Bash 不同建议把参数写入 JSON 文件或按 PowerShell 语法调整。八、验收矩阵与回滚按下表逐项验收检查项命令或位置通过标准SSM 在线describe-instance-informationPingStatusOnline会话重连控制台和 CLI 各测试一次均可进入目标实例公网入口安全组入站规则不存在 TCP 22 公网规则元数据配置describe-instancesHttpTokensrequiredIMDSv1无令牌curl请求失败或返回 401IMDSv2带令牌curl返回当前实例 ID业务健康监控、日志、接口探测错误率与延迟无异常恢复通道EC2 Serial Console/救援方案权限和流程已验证回滚原则如果 SSM 不在线不要删除 22 端口如果强制 IMDSv2 后应用异常可在授权和变更记录完整的前提下临时将--http-tokens optional回滚并尽快升级 SDK 或脚本。回滚是恢复业务的短期措施不应成为长期配置。九、常见失败定位TargetNotConnected优先检查 SSM Agent、实例角色、区域是否一致、出站 443、DNS、NAT 或 VPC Endpoint。实例 ID 正确但区域写错是最常见的低级问题之一。关联角色后仍不在线IAM 需要传播时间检查实例配置文件而不只是 IAM 角色名称。实例必须关联 instance profile只有孤立的 role 不会自动生效。删除22端口后无法运维使用保留的原 SSH 会话恢复规则或通过 EC2 控制台救援能力处理。真正删除规则前必须完成第二会话重连测试。IMDSv2 开启后应用取不到凭证检查 SDK 版本、容器 hop limit 和MetadataNoToken指标。不要通过把元数据端口代理到公网等危险方式“修复”。十、结论这套方案的价值不是把 SSH 换一个入口而是把运维访问从“公网端口 长期密钥”迁移到“身份权限 受管通道”再通过 IMDSv2、日志和验收清单补齐关键边界。对于多账号、多环境团队还应进一步引入 IAM Identity Center、权限边界、Session Manager 日志、VPC Endpoint 和基础设施即代码。如果你正在规划国际业务、海外站点或 AI 服务可提供国际云服务器合规开户流程咨询、实例选型、部署与运维支持。客户本人完成实名、验证码、支付和合同确认可通过平台私信说明目标区域、业务类型、预计流量和预算以便先做架构与成本边界梳理。官方参考资料AWS Systems Manager Session Managerhttps://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.htmlSession Manager prerequisiteshttps://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-prerequisites.html连接 EC2 的 Session Manager 步骤https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-with-systems-manager-session-manager.htmlAmazonSSMManagedInstanceCore 托管策略https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html新实例要求 IMDSv2https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html现有实例迁移到 IMDSv2https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html