cloud-init配置用户sudo为true时无法SSH登录EC2实例如何解决?
首先你调整lock_passwd参数无效是因为该参数仅控制SSH密码登录的开关,你当前使用的是SSH密钥认证,密码是否锁定不会影响密钥认证的校验逻辑,因此修改该参数无法解决问题。
问题原因
- cloud-init 权限处理异常:部分旧版本的cloud-init在给用户配置sudo权限时,会以root身份写入对应用户家目录下的
~/.ssh/authorized_keys文件,导致该文件或.ssh目录的属主被错误修改为root,或权限不符合SSH要求:SSH要求普通用户的.ssh目录权限必须为700,authorized_keys文件权限必须为600,且两者的属主必须为对应用户,权限或属主异常会直接触发SSH密钥认证失败。 - sudo字段配置规则不兼容:部分老旧版本的cloud-init不支持
sudo: true这种布尔值写法,要求必须显式指定sudo权限规则。当传入布尔值参数时会触发用户配置逻辑异常,导致你填写的ssh_authorized_keys配置没有被正确写入到目标用户的家目录下,自然无法通过密钥认证。 - SELinux上下文异常:如果你使用的EC2 AMI默认开启了SELinux(比如CentOS、RHEL系列的官方AMI),当root账户修改普通用户的
.ssh目录下的文件时,可能会导致authorized_keys的SELinux安全上下文错误,SSH服务读取密钥文件时被SELinux拦截,触发认证失败。
解决方案
1. 替换布尔值sudo写法,显式声明规则
不要使用sudo: true的写法,改为显式声明sudo权限规则,同时显式指定用户家目录,避免cloud-init执行逻辑异常:
- name: myuser primary_group: mygroup sudo: ALL=(ALL) NOPASSWD:ALL lock_passwd: true homedir: /home/myuser ssh_authorized_keys: - ssh-rsa ALDLKDSDF...
2. 强制修复权限和SELinux上下文
在cloud-init配置中添加runcmd模块,在实例初始化完成后强制修正用户家目录下SSH相关文件的权限、属主和SELinux上下文:
runcmd: - chown -R myuser:mygroup /home/myuser/.ssh - chmod 700 /home/myuser/.ssh - chmod 600 /home/myuser/.ssh/authorized_keys # 开启SELinux的系统执行下面这行修复上下文,无SELinux的系统会自动跳过不报错 - restorecon -R /home/myuser/.ssh || true
3. 排查SSH服务的组限制规则
如果上面两种方案都无效,可以先用EC2默认的管理员账号(比如ec2-user、ubuntu)登录实例,检查/etc/ssh/sshd_config文件,确认没有AllowGroups、DenyGroups配置限制你创建的myuser用户登录,修改配置后执行systemctl restart sshd即可生效。
内容的提问来源于stack exchange,提问作者mitchus
相关产品推荐
相关产品推荐

