我在 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例上运行 sudo 命令时收到错误。
简述
/usr/bin/sudo 文件的所有者必须是 root:root 用户。如果 /usr/bin/sudo 文件的所有者是非根用户,则在 EC2 Linux 实例上运行 sudo 命令时,您会收到以下错误消息:
“/usr/bin/sudo must be owned by uid 0 and have the setuid bit set”
sudoers 文件也不得是全局可写文件。如果该文件全局可写,则每个人都可以写入该文件,您会收到以下错误消息:
“sudo: /etc/sudoers is world writable”
注意: 默认情况下,sudoers 文件的文件模式为 0440。此配置允许所有者和群组读取文件,但不允许任何人写入文件。
要解决上述错误,请使用适用于 Linux 的 EC2 Serial Console 进行连接和故障排除。或者,更新实例的用户数据脚本以重置文件权限。
解决方法
注意: 如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI。
使用 EC2 Serial Console 进行连接和故障排除
先决条件: 配置对 EC2 Serial Console 的访问权限。您只能在基于 AWS Nitro System 构建的实例和支持的裸机实例上使用串行控制台。
使用 Amazon EC2 控制台或带有 SSH 客户端命令的 AWS CLI 通过串行控制台连接到您的实例。串行控制台不需要有效的网络连接。连接后,针对启动、网络配置或 SSH 配置问题对您的实例进行故障排除。
如果您无法使用串行控制台进行连接,则必须使用用户数据脚本对 sudo 错误进行故障排除。
更新用户数据脚本
注意: 当您对用户数据脚本进行故障排除时,必须停止并启动您的实例。
配置实例以进行停止和启动
注意: 当停止并启动某个实例时,该实例的公有 IP 地址将发生变化。最佳做法是使用弹性 IP 地址(而不是公有 IP 地址)将外部流量路由到您的实例。如果您使用的是 Amazon Route 53,则在公有 IP 地址发生变化时可能需要更新 Route 53 DNS 记录。停止和启动与实例重启不同。有关详细信息,请参阅停止和启动 EC2 实例的工作原理。
在停止和启动实例之前,请执行以下操作:
更新您的用户数据脚本
完成以下步骤:
- 停止实例。
注意: 如果您无法选择 Stop(停止),说明该实例已停止,或者其根设备是实例存储卷。
- 选择您的实例,然后选择 Actions(操作)。
- 选择 Instance settings(实例设置),然后选择 Edit User Data(编辑用户数据)。
- (可选)如果您不知道所需的权限,请查看 /usr/bin/sudo 以获取正确的权限。在具有相同操作系统的工作实例上运行以下命令:
ls -l /usr/bin/sudo
注意: /usr/bin/sudo 的权限在各个 Linux 发行版中各不相同。您可以使用命令输出中的权限作为参考。确保您运行命令的实例是全新安装的,而不是生产环境中的实例。这种配置意味着文件保持不变。
- 根据您的 Linux 发行版输入以下用户数据脚本。
基于 Red Hat 的发行版:
Content-Type: multipart/mixed; boundary="//"MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
rpm --setugids sudo && rpm --setperms sudo
find /etc/sudoers.d/ -type f -exec /bin/chmod 0440 {} \;
find /etc/sudoers.d/ -type f -exec /bin/chown root:root {} \;
--//
基于 Debian 的发行版:
Content-Type: multipart/mixed; boundary="//"MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
/bin/chown root:root /usr/bin/sudo
/bin/chmod 4111 /usr/bin/sudo
/bin/chmod 644 /usr/lib/sudo/sudoers.so
/bin/chmod 0440 /etc/sudoers
/bin/chmod 750 /etc/sudoers.d
find /etc/sudoers.d/ -type f -exec /bin/chmod 0440 {} \;
find /etc/sudoers.d/ -type f -exec /bin/chown root:root {} \;
--//
注意: 务必要复制整个脚本。输入脚本时不要插入额外空格。最后两个命令行在 /etc/sudoers.d/ 目录中恢复自定义 sudo 安全策略插件的权限、所有者和组。
- 选择 Save(保存)。
- 启动实例。
- 使用 SSH 连接到实例,然后运行测试命令来验证 sudo 是否按预期运行。
命令示例:
sudo whoami
注意: 前面示例命令的输出必须是 root。如果您仍然收到权限错误,请检查 /var/log/cloud-init-output.log 中是否存在必须解决的用户数据脚本执行错误。如果您收到语法错误,请参阅如何修复运行 sudo 命令时 Amazon EC2 或 Amazon Lightsail 实例上的 sudo 错误?