如何通过CloudFormation创建无密钥、密码登录的EC2 Linux实例?
用CloudFormation实现无密钥、密码登录的EC2 Linux实例
核心是利用EC2的用户数据(UserData),在实例启动阶段自动完成sshd配置修改、密码设置和服务重启,无需手动操作。以下是完整的实现方案:
关键逻辑说明
- 通过UserData执行shell命令,自动修改
/etc/ssh/sshd_config开启密码认证 - 为实例默认用户(如Amazon Linux 2的
ec2-user)和root用户设置登录密码 - 重启sshd服务让配置立即生效
CloudFormation模板示例
AWSTemplateFormatVersion: '2010-09-09' Parameters: InstanceType: Type: String Default: t2.micro AMIID: Type: String # 替换为你所在区域的Amazon Linux 2 AMI ID,比如us-east-1区域可填ami-0c55b159cbfafe1f0 Default: ami-0c55b159cbfafe1f0 LoginPassword: Type: String NoEcho: true Description: "EC2实例的登录密码(建议包含大小写、数字和特殊字符)" Resources: EC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: !Ref InstanceType ImageId: !Ref AMIID SecurityGroups: [!Ref InstanceSecurityGroup] UserData: Fn::Base64: !Sub | #!/bin/bash # 设置root用户密码 echo root:${LoginPassword} | chpasswd # 设置ec2-user用户密码(适配Amazon Linux 2默认用户) echo ec2-user:${LoginPassword} | chpasswd # 修改sshd_config,开启密码认证 sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config # 重启sshd服务使配置生效 systemctl restart sshd InstanceSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 允许SSH访问 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0 # 生产环境建议限制为你的可信IP,比如192.168.1.1/32
重要注意事项
- 密码安全:模板中用
NoEcho: true隐藏参数输入,但生产环境避免直接传明文密码,建议用AWS Secrets Manager存储密码,通过UserData调用aws secretsmanager get-secret-value动态获取。 - 发行版适配:不同Linux发行版的sshd配置路径、服务命令有差异,比如Ubuntu需用
service ssh restart重启服务,需根据实际AMI调整命令。 - 安全组限制:示例中允许所有IP访问SSH,实际要缩小范围到可信IP段,降低被暴力破解的风险。
- 用户权限:
ec2-user默认拥有sudo权限,root用户登录后可直接管理实例。
内容的提问来源于stack exchange,提问作者AndriiPopa
相关产品推荐
相关产品推荐

