通过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服务让配置立即生效
注意事项
- 请根据你的AWS区域替换
ImageId为对应区域的Amazon Linux 2或Amazon Linux 2023 AMI(如果用Ubuntu等其他发行版,需要调整脚本中的服务命令,比如把systemctl restart sshd改成systemctl restart ssh)。 - 如果实例没有公网IP,需要配置VPC端点访问Secrets Manager,或者确保实例能通过NAT网关访问公网。
- 你可以通过AWS CLI随时查看密码:
aws secretsmanager get-secret-value --secret-id /ec2/student-ssh-password --region 你的区域
内容的提问来源于stack exchange,提问作者Atish Kumbhar
相关产品推荐
相关产品推荐

