為什麼我不能在 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 序列主控台或使用者資料指令碼。

解決方法

使用 EC2 序列主控台

如果您已啟用適用於 Linux 的 EC2 序列主控台,可以使用它來對支援的 Nitro 型執行個體類型進行疑難排解。序列主控台可協助您對開機問題、網路組態和 SSH 組態問題進行疑難排解。序列主控台無需正常運作中的網路連線,就能連線至您的執行個體。您可以使用 Amazon EC2 主控台或 AWS Command Line Interface (AWS CLI),來存取序列主控台。

使用序列主控台之前,先在帳戶層級授予對主控台的存取權。然後,建立 AWS Identity and Access Management (AWS IAM) 政策,以授予 IAM 使用者存取權。此外,每個使用序列主控台的執行個體都必須包含至少一個密碼型使用者。如果您無法存取執行個體或序列主控台,請遵循方法 2: 使用使用者資料指令碼部分中的指示進行操作。如需有關設定適用於 Linux 的 EC2 序列主控台的詳細資訊,請參閱設定 EC2 序列主控台的存取權

**注意:**如果您在執行 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 官方已更新 9 個月前