如何保持ASG管理的EC2实例SSH指纹跨重启一致?
解决AWS ASG实例替换后SSH指纹不变的问题
现有备份恢复方案的潜在问题
你当前的脚本未成功,大概率是以下几个原因:
- 权限不足:用户数据默认以普通用户(如
ec2-user)执行,解压到/etc/ssh和重启sshd需要root权限,未加sudo会失败。 - IAM权限缺失:EC2实例的IAM角色没有S3读取权限,导致
aws s3 cp命令无法下载备份文件。 - 变量传递错误:备份脚本用
{{ backup_s3_bucket_name }}模板变量,恢复脚本用${backup_s3_bucket_name},需确保变量在用户数据中正确定义。 - 密钥权限不正确:解压后的SSH密钥文件权限不符合
sshd要求(私钥需600,公钥需644),会导致sshd无法加载。
修正后的备份与恢复方案
1. 配置IAM权限
给EC2实例关联的IAM角色添加以下S3权限策略,允许读取备份桶中的密钥文件:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::{{backup_s3_bucket_name}}/config_files/server/ssh_keys.zip" } ] }
2. 修正备份脚本(在运行实例上执行)
# 以root权限打包所有SSH主机密钥 sudo zip -r ssh_keys.zip /etc/ssh/ssh_host_* # 上传到S3备份桶 sudo aws s3 cp ssh_keys.zip s3://{{backup_s3_bucket_name}}/config_files/server/ssh_keys.zip
3. 修正用户数据恢复脚本
将以下内容作为启动模板的用户数据(替换{{backup_s3_bucket_name}}为实际桶名):
#!/bin/bash # 定义备份桶名 BACKUP_BUCKET="{{backup_s3_bucket_name}}" # 下载密钥备份到临时目录 aws s3 cp s3://${BACKUP_BUCKET}/config_files/server/ssh_keys.zip /tmp/ssh_keys.zip # 解压覆盖系统SSH密钥(需root权限) sudo unzip -o /tmp/ssh_keys.zip -d / # 修复密钥文件权限,符合sshd要求 sudo chmod 600 /etc/ssh/ssh_host_*_key sudo chmod 644 /etc/ssh/ssh_host_*.pub # 重启sshd服务加载新密钥 sudo systemctl restart sshd
更优方案:将SSH密钥打包进AMI
因为你的启动模板使用实例自身的AMI,直接将SSH密钥包含在AMI中是更可靠的方式,无需每次实例启动都从S3恢复:
- 在运行的EC2实例上,确认
/etc/ssh/ssh_host_*文件是你需要保留的密钥。 - 创建该实例的AMI(创建过程中不要勾选"清除启动时的SSH密钥"选项)。
- 更新启动模板,使用这个包含固定SSH密钥的AMI。
- 后续ASG启动新实例时,会直接继承AMI中的SSH密钥,指纹保持不变。
验证方法
实例启动后,执行以下命令查看SSH指纹,确认与原实例一致:
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
内容的提问来源于stack exchange,提问作者Sierra6
相关产品推荐
相关产品推荐

