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

如何保持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恢复:

  1. 在运行的EC2实例上,确认/etc/ssh/ssh_host_*文件是你需要保留的密钥。
  2. 创建该实例的AMI(创建过程中不要勾选"清除启动时的SSH密钥"选项)。
  3. 更新启动模板,使用这个包含固定SSH密钥的AMI。
  4. 后续ASG启动新实例时,会直接继承AMI中的SSH密钥,指纹保持不变。

验证方法

实例启动后,执行以下命令查看SSH指纹,确认与原实例一致:

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

内容的提问来源于stack exchange,提问作者Sierra6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:45:03