跳至内容

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

2 分钟阅读
0

我在 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 实例的工作原理

在停止和启动实例之前,请执行以下操作:

更新您的用户数据脚本

完成以下步骤:

  1. 停止实例
    注意: 如果您无法选择 Stop(停止),说明该实例已停止,或者其根设备是实例存储卷。
  2. 选择您的实例,然后选择 Actions(操作)。
  3. 选择 Instance settings(实例设置),然后选择 Edit User Data(编辑用户数据)。
  4. (可选)如果您不知道所需的权限,请查看 /usr/bin/sudo 以获取正确的权限。在具有相同操作系统的工作实例上运行以下命令:
    ls -l /usr/bin/sudo
    注意: /usr/bin/sudo 的权限在各个 Linux 发行版中各不相同。您可以使用命令输出中的权限作为参考。确保您运行命令的实例是全新安装的,而不是生产环境中的实例。这种配置意味着文件保持不变。
  5. 根据您的 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 安全策略插件的权限、所有者和组。
  6. 选择 Save(保存)。
  7. 启动实例
  8. 使用 SSH 连接到实例,然后运行测试命令来验证 sudo 是否按预期运行。
    命令示例:
    sudo whoami
    注意: 前面示例命令的输出必须是 root。如果您仍然收到权限错误,请检查 /var/log/cloud-init-output.log 中是否存在必须解决的用户数据脚本执行错误。如果您收到语法错误,请参阅如何修复运行 sudo 命令时 Amazon EC2 或 Amazon Lightsail 实例上的 sudo 错误?
AWS 官方已更新 5 个月前