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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:15:09