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

2 分钟阅读
0

我在 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例上运行 sudo 命令时收到错误。

简短描述

当您尝试在 Amazon EC2 Linux 实例上运行 sudo 命令时,可能会出现以下错误:

  • "/usr/bin/sudo must be owned by uid 0 and have the setuid bit set"

当非根用户有 /usr/bin/sudo 文件时,会出现此错误。/usr/bin/sudo 文件的所有者必须是 root:root

  • 错误“sudo: /etc/sudoers is world writable”

/etc/sudoers 文件的权限不正确时,会出现此错误。sudoers 文件不得是全局可写文件。如果一个文件全局可写,每个人都能够向该文件写入。默认情况下,sudoers 文件的文件模式为 0440。此模式允许所有者和群组读取文件,并禁止任何人写入该文件。

要更正这些错误,请使用 Amazon EC2 Serial Console 或用户数据脚本。

解决方法

使用 EC2 Serial Console

如果您已激活适用于 Linux 的 EC2 Serial Console,可以将其用于对受支持的基于 Nitro 的实例类型进行故障排除。Serial Console 可帮助您解决启动问题、网络配置和 SSH 配置问题。Serial Console 无需有效的网络连接即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS 命令行界面(AWS CLI)访问 Serial Console。

在使用 Serial Console 之前,先在账户级别授予对控制台的访问权限。然后,创建 AWS Identity and Access Management(IAM)策略,向您的 IAM 用户授予访问权限。此外,每个使用 Serial Console 的实例都必须包含至少一个基于密码的用户。如果您无法访问实例或 Serial Console,请按照方法 2: 使用用户数据脚本部分的说明操作。有关配置适用于 Linux 的 EC2 Serial Console 的更多信息,请参阅配置 EC2 Serial Console 的访问权限

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

使用用户数据脚本

使用用户数据脚本修复以下发行版上的 sudo 错误:

  • 基于 Red Hat 的发行版,如 SUSE、CentOS、Amazon Linux 1、Amazon Linux 2、Amazon Linux 2023 和 RHEL
  • 基于 Debian 的发行版,如 Ubuntu

重要事项: 此过程需要您停止和启动 EC2 实例。这可能会导致数据丢失、其他实例停止以及公有 IP 地址发生变化。有关更多信息,请参阅停止实例会发生什么

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

  2. 选择操作实例状态停止
    注意: 如果您无法选择停止,说明该实例已停止,或者其根设备是实例存储卷。

  3. 依次选择操作实例设置编辑用户数据

  4. 将以下脚本复制并粘贴到编辑用户数据字段,然后选择保存。务必要复制整个脚本。粘贴脚本时不要额外插入空格:
    基于 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 {} \;
    --//

    注意: 最后两个命令行在 /etc/sudoers.d/ 目录中恢复自定义 sudo 安全策略插件的权限、所有者和组。
    基于 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 安全策略插件的权限、所有者和组。
    重要事项: /usr/bin/sudo 的权限在各个 Linux 发行版中各不相同。在永久设置权限之前,请先确认具有相似操作系统的实例的权限。运行 ls -l /usr/bin/sudo,然后使用此示例中的权限作为参考。
    确保您的参考实例是全新安装的,没有用于生产,以使此文件保持不变。

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

AWS 官方
AWS 官方已更新 8 个月前