Amazon Linux 2 EC2实例禁用root后sudo -s仍可登录及相关疑问
问题
我创建了一台采用Amazon Linux 2镜像的EC2实例,仅允许通过Session Manager访问,禁止SSH访问。实例包含以下用户:默认创建的ec2-user、ssm-user、root,以及我通过Terraform创建的自定义管理员用户myrootec2-user(已设置密码)。
为了仅通过myrootec2-user执行管理员操作,我尝试禁用root用户,操作步骤为执行sudo vim /etc/passwd,将root行的/bin/bash改为/sbin/nologin。但发现使用不同sudo参数结果不同:sudo su - 报错“此账户当前不可用”,而sudo -s可正常登录root。
请问:
- 为何第二个命令可登录?
- 是否推荐禁用root?
- 若不推荐,有何替代方案(如给root设置密码)?
解答
1. sudo -s能成功的原因
sudo su -是模拟root的完整登录流程:它会调用su -命令,该命令会尝试启动root用户在/etc/passwd中配置的默认shell。你把root的shell改成了/sbin/nologin(这是专门拒绝登录的shell),所以触发报错。sudo -s是直接以root身份启动当前用户的shell(或sudoers配置中指定的shell),它跳过了root用户的登录shell验证步骤,不需要读取root的shell配置,因此不受/etc/passwd中root shell设置的影响,能直接获取root权限运行shell。
2. 是否推荐禁用root?
在Amazon Linux 2的EC2实例中,不推荐通过修改/etc/passwd更改root的登录shell来禁用root,原因如下:
- 不少系统内置工具、运维脚本依赖root的默认shell为可登录shell,强行修改可能导致系统操作异常;
- 你的实例已经通过Session Manager限制了访问,且EC2实例默认root无密码,无法直接通过Session Manager或SSH登录root(Session Manager默认用
ssm-user或ec2-user登录),原本就不存在直接登录root的风险。
3. 替代方案
如果要确保只有myrootec2-user能执行管理员操作,推荐以下方案:
- 配置
sudoers严格管控权限:使用visudo命令编辑/etc/sudoers(避免语法错误导致sudo失效),只保留myrootec2-user的sudo权限,移除ec2-user、ssm-user的sudo规则。例如添加:
同时注释掉myrootec2-user ALL=(ALL) ALL/etc/sudoers.d/90-cloud-init-users中ec2-user的sudo配置。 - 禁用其他用户的sudo权限:直接删除或注释
ec2-user、ssm-user在sudo配置文件中的条目,确保只有myrootec2-user可以执行sudo命令。 - 不要给root设置密码:EC2实例默认root无密码,设置密码反而增加安全风险——密码泄露后攻击者可能借此登录,而无密码情况下,只能通过sudo切换到root,sudo权限可严格管控,安全性更高。
内容的提问来源于stack exchange,提问作者user1911
相关产品推荐
相关产品推荐

