为什么我无法在 EC2 Linux 实例上运行 sudo 命令?

上次更新时间:2021 年 5 月 12 日

我在 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例上运行 sudo 命令时,收到了这样的错误:“sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set”(sudo: /usr/bin/sudo 必须由 uid 0 拥有并且设置了 setuid 位)或“sudo: /etc/sudoers is world writable”(sudo: /etc/sudoers 全局可写)。如何修复此问题?

简短描述

/usr/bin/sudo 文件由非根用户拥有时,系统会显示错误:“sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set”(sudo: /usr/bin/sudo 必须由 uid 0 拥有并且设置了 setuid 位)。/usr/bin/sudo 文件应以 root:root 为拥有者。

/etc/sudoers 文件具有不正确的权限时,系统会显示错误:“sudo: /etc/sudoers is world writable”(sudo: /etc/sudoers 全局可写)。sudoers 文件不得为全局可写文件。如果某个文件全局可写,则表示每个人都可以写入该文件。默认情况下,sudoers 文件的文件模式是 0440。这允许拥有者和组中的任何人读取该文件,但会禁止写入该文件。

您可以使用 EC2 串行控制台或用户数据脚本更正这些错误。

解决方法

方法 1:使用 EC2 串行控制台

如果您已为 Linux 启用 EC2 串行控制台,可以使用它来排查受支持的基于 Nitro 的实例类型的问题。串行控制台可帮助您排查启动问题、网络配置和 SSH 配置问题。串行控制台无需网络连接即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS 命令行界面 (AWS CLI) 访问串行控制台。

在使用串行控制台之前,在账户层面授予对该控制台的访问权限。然后,创建 AWS Identity and Access Management (IAM) 策略,授予对 IAM 用户的访问权限。此外,每个使用串行控制台的实例都必须至少包含一个基于密码的用户。如果您的实例无法访问,并且尚未配置对串行控制台的访问权限,请按照方法 2:使用用户数据脚本部分的说明进行操作。有关为 Linux 配置 EC2 串行控制台的信息,请参阅配置对 EC2 串行控制台的访问

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

方法 2:使用用户数据脚本

使用用户数据脚本来更正下列实例上的这些错误:

  • 基于 Red Hat 的发行版(例如 SUSE、CentOS、Amazon Linux 1、Amazon Linux 2 和 RHEL)。
  • 基于 Debian 的发行版(例如 Ubuntu)。

1.    打开 Amazon EC2 控制台,然后选择您的实例。

2.    依次选择操作实例状态停止

注意:如果停止处于禁用状态,则表示要么实例已停止,要么其根设备是一个实例存储卷。

3.    依次选择 Actions(操作)、Instance Settings(实例设置)、Edit User Data(编辑用户数据)。

4.    将以下脚本复制并粘贴到 Edit User Data(编辑用户数据)字段中,然后选择 Save(保存)。请务必复制完整的脚本内容。粘贴脚本时,不要插入额外的空格。

基于 Red Hat 的发行版

对于基于 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
--//

基于 Debian 的发行版

对于基于 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
--//

5.    启动实例,然后使用 SSH 连接到实例

注意:如果您在编辑 sudoers 文件后,尝试使用 SSH 连接到实例时收到语法错误,请参阅我编辑了 EC2 实例上的 sudoers 文件,可尝试运行 sudo 命令时,收到了语法错误。如何修复此问题?


这篇文章对您有帮助吗?


您是否需要账单或技术支持?