通过CloudFormation与Secrets Manager实现EC2实例安全用户创建
解决方案:通过Secrets Manager + CloudFormation自动配置EC2用户
Got it, let's walk through exactly how to set this up without hardcoding any credentials in your CloudFormation templates. We'll split this into two core steps: creating the secure credentials in Secrets Manager, then building the CloudFormation stack to deploy your EC2 instance and auto-create the user.
1. 创建存储在Secrets Manager中的用户名与密码
首先,我们需要把要创建的用户名和密码存储在Secrets Manager里——这样既能加密存储,又能确保只有授权资源可以访问。你可以通过AWS控制台操作,这里给一个CLI命令方便自动化执行:
aws secretsmanager create-secret \ --name EC2UserCredentials \ --secret-string '{"username":"custom-admin","password":"YourStrongPass_123!"}'
小提示:如果不想手动指定密码,加上--generate-password参数,Secrets Manager会自动生成一个高强度随机密码。
2. 编写CloudFormation模板部署服务器并自动创建用户
接下来我们构建的CloudFormation模板会完成三件事:
- 创建IAM角色,让EC2实例有权限访问Secrets Manager
- 启动EC2实例,通过UserData脚本拉取凭据
- 在实例启动时自动创建目标用户
以下是完整模板:
AWSTemplateFormatVersion: '2010-09-09' Description: 部署EC2实例,通过Secrets Manager凭据自动创建用户 Resources: # 给EC2实例创建访问Secrets Manager的IAM角色 EC2InstanceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: AllowSecretsManagerAccess PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: secretsmanager:GetSecretValue Resource: !Sub 'arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:EC2UserCredentials-*' # 通配符适配Secrets Manager自动添加的随机后缀 # 实例配置文件:将IAM角色关联到EC2实例 EC2InstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref EC2InstanceRole # EC2实例配置,包含自动创建用户的UserData脚本 EC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t2.micro ImageId: ami-0c55b159cbfafe1f0 # 替换为你所在区域的Amazon Linux 2 AMI IamInstanceProfile: !Ref EC2InstanceProfile UserData: Fn::Base64: | #!/bin/bash # 从Secrets Manager拉取凭据 SECRET=$(aws secretsmanager get-secret-value --secret-id EC2UserCredentials --query SecretString --output text) # 用jq解析用户名和密码(Amazon Linux 2默认预装jq) USERNAME=$(echo "$SECRET" | jq -r '.username') PASSWORD=$(echo "$SECRET" | jq -r '.password') # 创建带主目录的用户 useradd -m "$USERNAME" # 设置用户密码 echo "$USERNAME:$PASSWORD" | chpasswd # 可选:给用户添加免密sudo权限 echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/"$USERNAME" chmod 0440 /etc/sudoers.d/"$USERNAME"
重要注意事项:
- AMI替换:把模板里的
ImageId换成你所在AWS区域的对应AMI(这里用Amazon Linux 2是因为它预装了AWS CLI和jq,省去额外安装步骤) - 凭据名称匹配:确保模板里的秘密名称
EC2UserCredentials和你第一步创建的完全一致 - 权限最小化:IAM策略只允许访问指定的秘密,遵循权限最小化原则
- 密码复杂度:密码要符合EC2实例操作系统的复杂度要求,否则
chpasswd会执行失败
部署这个模板后,EC2实例启动时会自动完成用户创建,全程不会在模板里明文存储任何凭据,完全符合你的要求。
内容的提问来源于stack exchange,提问作者MattMcG
相关产品推荐
相关产品推荐

