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」
このエラーは、非 root ユーザーが /usr/bin/sudo ファイルを所有するときに発生します。/usr/bin/sudo ファイルの所有者には root: root が必要です。
- 「sudo: /etc/sudoers is world writable」エラー。
このエラーは、/etc/sudoers ファイルが、誤ったアクセス権を持っている場合に発生します。sudoers ファイルは world-writable にはできません。world-writable とは、誰でもそのファイルに書き込むことができることを意味します。デフォルトでは、sudoers ファイルのファイルモードは 0440 です。これによって所有者とグループはファイルを読み取ることができ、ファイルへの書き込みは禁止されます。
これらのエラーを修正するには、Amazon EC2 シリアルコンソールまたはユーザーデータのスクリプトを使用します。
解決策
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 を使用していることを確認してください。
ユーザーデータスクリプトを使用する
ユーザーデータスクリプトを使用して、以下のディストリビューションでの sudo エラーを修正します。
- SUSE、CentOS、Amazon Linux 1、Amazon Linux 2、Amazon Linux 2023、RHEL などの Red Hat ベースのディストリビューション
- Debian ベースのディストリビューション (Ubuntu など)
重要: この手順では、EC2 インスタンスを停止して起動する必要があります。これにより、データが失わる、他のインスタンスが停止する、パブリック IP アドレスが変更されるなどの結果が生じる場合があります。詳細については、「インスタンスを停止するとどうなるか」を参照してください。
-
Amazon EC2 コンソールを開き、インスタンスを選択します。
-
[アクション]、[インスタンスの状態]、[停止] を選択します。
注: [停止] を選択できない場合は、インスタンスがすでに停止している、または、そのルートデバイスそのものが 1 つのインスタンスストアボリュームであることを意味します。
-
[アクション]、[インスタンス設定]、[ユーザーデータを編集] を選択します。
-
次のスクリプトをコピーして [ユーザーデータを編集] フィールドに貼り付け、[保存] を選択します。必ずスクリプト全体をコピーしてください。スクリプトを貼り付けるときは余分なスペースを入れないでください。
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 {} \;
--//
注: 最後の 2 つのコマンドラインは、「/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 {} \;
--//
最後の 2 つのコマンドラインは、「/etc/sudoers.d/」 ディレクトリにあるカスタム sudo セキュリティポリシープラグインの権限、所有者、およびグループを回復します。
重要: /usr/bin/sudo の権限は、多様な Linux ディストリビューションごとに異なります。権限を恒久的に設定する前に、類似のオペレーティングシステムを使用するインスタンスからの権限を確認してください。ls-l /usr/bin/sudo を実行し、この例の権限を参考にしてください。
このファイルが変更されないように、参照インスタンスがクリーンインストールであり、本番環境ではないことを確認してください。
-
インスタンスを起動し、SSH を使用してインスタンスに接続します。
注: 構文エラーが発生した場合は、「EC2 インスタンスで sudoers ファイルを編集する際、sudo コマンドを実行すると構文エラーが表示されます。これを修正するにはどうすればよいですか?」参照してください。