EC2 Linux インスタンスで sudo コマンドを実行できないのはなぜですか?
最終更新日: 2021 年 5 月 12 日
Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスで sudo コマンドを実行しようとすると、「sudo: /usr/bin/sudo be owned by uid 0 and the setuid bit set」または「sudo: /etc/sudoers is world writable」というエラーが表示されます。この問題を解決する方法を教えてください。
簡単な説明
エラー sudo: 「/usr/bin/sudo must be owned by uid 0 and have the setuid bit set」は、非 root ユーザーが /usr/bin/sudo ファイル所有している場合に発生します。/usr/bin/sudo ファイルの所有者として root:root が必要です。
エラー「sudo: /etc/sudoers is world writable」は、/etc/sudoers ファイルのアクセス許可が正しくない場合に発生します。sudoers ファイルは誰でも書き込みができる状態になっていてはなりません。ファイルが誰でも書き込み可能な場合、ファイルに書き込める人に制限がかかりません。デフォルトでは、sudoers ファイルのファイルモードは 0440 です。これにより、所有者とグループはファイルを読み取ることができ、誰もがファイルに書き込むことができなくなります。
EC2 シリアルコンソールまたはユーザーデータスクリプトを使用して、これらのエラーを修正できます。
解決方法
方法 1: EC2 シリアルコンソールを使用する
Linux 用の EC2 シリアルコンソールを有効にした場合は、それを使用してサポートされている Nitro ベースのインスタンスタイプのトラブルシューティングを行うことができます。シリアルコンソールは、起動問題、ネットワーク設定、および SSH 設定問題のトラブルシューティングに役立ちます。シリアルコンソールは、正常に動作するネットワーク接続を必要とすることなく、インスタンスに接続します。シリアルコンソールには、Amazon EC2 コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用してアクセスできます。
シリアルコンソールを使用する前に、アカウントレベルでコンソールにアクセス権を付与します。その後、IAM ユーザーにアクセス権を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。また、シリアルコンソールを使用するすべてのインスタンスには、少なくとも 1 名のパスワードベースユーザーを含める必要があります。インスタンスが到達不能で、シリアルコンソールへのアクセスが設定されていない場合は、次の方法 2: ユーザーデータスクリプトを使用するのセクションにある手順に従ってください。Linux 用の EC2 シリアルコンソールの設定の詳細については、EC2 シリアルコンソールへのアクセスを設定するを参照してください。
注: AWS CLI コマンドの実行時にエラーが表示される場合は、AWS CLI の最新バージョンを使用していることを確認してください。
方法 2: ユーザーデータスクリプトを使用する
ユーザーデータスクリプトを使用して、次のエラーを修正します。
- SUSE、CentOS、Amazon Linux 1、Amazon Linux 2、RHEL など、Red Hat ベースのディストリビューション。
- Debian ベースのディストリビューション (Ubuntu など)。
1. Amazon EC2 コンソールを開き、インスタンスを選択します。
2. [Actions]、[Instance State]、[Stop] の順に選択します。
注: [Stop] が無効になっている場合は、インスタンスがすでに停止しているか、そのルートデバイスがインスタンスストアボリュームになっています。
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 コマンドを実行しようとすると、構文エラーを受け取ります。この問題を解決する方法を教えてください