PuTTY连接EC2:为Ubuntu用户配置AWS密钥对失败原因咨询
问题:AWS EC2 Ubuntu实例通过user-data添加密钥对失败,ec2-user却可正常登录?
问题背景
- 电脑故障丢失未备份的PuTTY .ppk文件,无法连接EC2实例,按AWS指引通过user-data添加新密钥对
- 首次操作成功以
ec2-user身份登录,但实例默认用户为ubuntu,因无密码无法通过su - ubuntu切换 - 修改user-data指定
name为ubuntu并重启后,PuTTY连接时报错Server refused our key - 测试指定
name为rubbish无法登录,但仍能以ec2-user身份登录 - 恢复原.ppk后可正常连接,疑惑为何user-data方法对
ubuntu用户无效
原因分析
1. Ubuntu AMI与Amazon Linux的user-data处理逻辑差异
AWS官方文档中的密钥替换方法是针对Amazon Linux AMI设计的,而Ubuntu官方AMI使用cloud-init处理user-data,两者逻辑不同:
- Amazon Linux会直接解析
ssh-authorized-keys格式的user-data,为指定用户添加密钥 - Ubuntu的
cloud-init仅在实例首次启动时,为默认用户ubuntu初始化密钥;后续修改user-data时,需使用cloud-config的特定格式才能触发密钥更新,原文档的格式无法被Ubuntu的cloud-init正确识别处理。
2. ec2-user的密钥未被清理
首次添加user-data时,脚本为ec2-user添加了密钥,但user-data脚本默认只负责添加密钥,不会主动清理旧密钥。后续移除user-data并重启时,~ec2-user/.ssh/authorized_keys中的密钥依然存在,因此仍能登录。
3. Ubuntu用户目录权限问题
当你指定name为ubuntu时,cloud-init尝试修改~ubuntu/.ssh/authorized_keys,但如果该文件或父目录的权限不符合SSH要求(比如所有者非ubuntu、权限过于开放),SSH服务会拒绝使用该密钥,导致Server refused our key报错。而ec2-user的目录权限是首次操作时正确设置的,因此密钥可正常生效。
4. cloud-init的状态缓存
cloud-init会缓存已执行的user-data操作记录,避免重复执行。首次添加user-data后,即使后续修改并重新添加,cloud-init可能不会重新处理密钥添加逻辑,除非重置其缓存状态。
补充解决建议(供后续参考)
若需通过user-data为Ubuntu用户添加密钥,需使用cloud-config格式:
#cloud-config ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC... 你的新公钥内容
执行前需重置cloud-init缓存:
sudo rm -rf /var/lib/cloud/instance/*
之后重启实例即可生效。
内容的提问来源于stack exchange,提问作者Paul Taylor
相关产品推荐
相关产品推荐

