You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过CloudFormation创建EC2实例:用动态随机密码替代PEM密钥开启SSH

如何在CloudFormation中为EC2实例设置动态随机SSH密码替代静态密码

我来帮你搞定把静态密码换成动态随机密码的需求,同时确保EC2实例只允许密码登录、禁用PEM密钥认证。下面是完整的解决方案和修改后的CloudFormation模板:

核心思路

咱们通过三个关键步骤实现目标:

  • 用AWS Secrets Manager生成并安全存储动态随机密码
  • 给EC2实例赋予读取该密码的IAM权限
  • 修改UserData脚本,从Secrets Manager获取密码并配置SSH服务

修改后的完整CloudFormation模板

AWSTemplateFormatVersion: "2010-09-09"
Description: "EC2 Instance with Dynamic SSH Password Authentication"

Resources:
  # 1. 生成并存储动态随机密码的Secrets Manager资源
  SSHUserPassword:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: /ec2/student-ssh-password
      Description: Dynamic SSH password for student user
      GenerateSecretString:
        SecretStringTemplate: '{"username": "student"}'
        GenerateStringKey: "password"
        PasswordLength: 16
        ExcludeCharacters: '"@/\`'
        RequireEachIncludedType: true

  # 2. 允许EC2实例读取密码的IAM角色
  EC2InstanceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore # 可选,方便用SSM管理实例
      Policies:
        - PolicyName: ReadSSHPassword
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - secretsmanager:GetSecretValue
                Resource: !Ref SSHUserPassword

  # 3. 实例配置文件,关联IAM角色到EC2实例
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref EC2InstanceRole

  # 4. EC2实例资源,配置UserData实现密码登录
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-0c55b159cbfafe1f0 # 示例:Amazon Linux 2 AMI,根据你的区域替换
      IamInstanceProfile: !Ref EC2InstanceProfile
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          # 创建student用户(如果不存在)
          if ! id "student" &>/dev/null; then
              useradd -m student
              usermod -aG wheel student
          fi

          # 从Secrets Manager获取密码并设置给student用户
          SECRET=$(aws secretsmanager get-secret-value --secret-id ${SSHUserPassword} --region ${AWS::Region})
          PASSWORD=$(echo $SECRET | jq -r '.SecretString' | jq -r '.password')
          echo "student:$PASSWORD" | chpasswd

          # 修改SSH配置:禁用密钥认证,启用密码认证
          sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
          sed -i 's/^PubkeyAuthentication yes/PubkeyAuthentication no/' /etc/ssh/sshd_config
          sed -i 's/^ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config

          # 重启SSH服务使配置生效
          systemctl restart sshd

      Tags:
        - Key: Name
          Value: EC2-With-Dynamic-SSH-Password

关键部分说明

  • Secrets Manager配置:自动生成符合复杂度要求的随机密码,安全存储在Secrets Manager中,你可以随时在控制台查看或重置密码。
  • IAM权限:确保EC2实例能合法读取密码,彻底避免硬编码密码的安全风险。
  • UserData脚本:
    • 先检查并创建student用户(如果不存在)
    • 用AWS CLI和jq工具解析Secrets Manager返回的密码(Amazon Linux 2默认已预装这两个工具)
    • 修改sshd_config的核心配置,彻底禁用密钥认证,只允许密码登录
    • 重启SSH服务让配置立即生效

注意事项

  1. 请根据你的AWS区域替换ImageId为对应区域的Amazon Linux 2或Amazon Linux 2023 AMI(如果用Ubuntu等其他发行版,需要调整脚本中的服务命令,比如把systemctl restart sshd改成systemctl restart ssh)。
  2. 如果实例没有公网IP,需要配置VPC端点访问Secrets Manager,或者确保实例能通过NAT网关访问公网。
  3. 你可以通过AWS CLI随时查看密码:aws secretsmanager get-secret-value --secret-id /ec2/student-ssh-password --region 你的区域

内容的提问来源于stack exchange,提问作者Atish Kumbhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:32:20