Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの sudoers ファイルを手動で編集しました。これで、sudo su コマンドまたは特権ユーザーアクセスを必要とするコマンドを実行すると、次のような構文エラーが表示されます。「/etc/sudoers: syntax error near line xx」 「sudo: parse error in /etc/sudoers near line xx」 「sudo: no valid sudoers sources found, quitting」 「sudo: unable to initialize policy plugin」
簡単な説明
この構文エラーは、/etc/sudoers ファイルを手動で編集して sudo ユーザーを変更し、ファイルに不要な文字を追加したりした場合に発生します。その結果、インスタンスに障害が発生し、sudo su や、特権ユーザーアクセスを必要とするコマンドを実行できなくなります。この構文エラーを修正するには、次の手順を実行します。
- インスタンスを停止します。
- ルートボリュームをデタッチします。
- ルートボリュームを 2 次ボリュームとしてリカバリインスタンスにアタッチします。
- アタッチされたボリュームをマウントします。
- sudoers ファイルへの変更を元に戻します。
解決策
前提条件
**注:**接続可能な実行中のインスタンスで、vi、vim、nano などのテキストエディタを使用して sudoers ファイルを手動で編集しないでください。visudo コマンドを実行して、接続可能なインスタンスの /etc/sudoers ファイルを編集します。visudo コマンドは、編集中に解析エラーをチェックし、変更を保存する前にファイルに発生した問題を警告します。
1. Amazon EC2 コンソールを開きます。
2. ナビゲーションペインで [インスタンス] を選択します。
3. 障害のあるインスタンスを選択し、[インスタンスの状態] を選択し、[インスタンスの停止] を選択します。
4. [インスタンスを停止しますか?] ポップアップで [停止] を選択します。
5. [ストレージ] タブで、ルートデバイス名のボリューム ID をクリックします。
6. [ボリューム] ページでボリュームを選択し、[アクション] を選択してから、[ボリュームのデタッチ] を選択します。
7. ポップアップで [デタッチ] を選択します。ボリュームの状態が [使用可能] であることを確認します。
8. 元のインスタンスと同じアベイラビリティーゾーンで新しい EC2 インスタンスを起動します。新しいインスタンスがレスキューインスタンスになります。
9. レスキューインスタンスが起動したら、ナビゲーションペインから [ボリューム] を選択します。
10. 元のインスタンスのデタッチされたルートボリュームを選択します。[アクション] を選択し、[ボリュームのアタッチ] を選択します。
11. [インスタンス] では、レスキューインスタンス ID を選択し、デバイス名を入力します。次に、[ボリュームをアタッチ] を選択します。
12. キーペアで、SSH を使用してインスタンスに接続します。
13. アタッチされたボリュームのデバイス名を確認するには、lsblk コマンドを実行します。
lsblk
出力例:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTxvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 500G 0 disk
└─xvdf1 202:81 0 500G 0 part
14. マウントディレクトリを作成し、ルート権限でマウントします。
Amazon Linux、Ubuntu、Debian:
sudo mount /dev/xvdf1 /mnt
Amazon Linux 2023、Amazon Linux 2、CentOS 7 または 8、SUSE Linux 12、および RHEL 7.x または 8.x:
sudo mount -o nouuid /dev/xvdf1 /mnt
コンソールのマウントポイントで、新しくアタッチされたボリュームを確認します。マウントポイントは通常 /dev/xvdf1 です。
15. Chroot でマウントしたディレクトリに移動します。
for dir in {/dev,/dev/pts,/sys,/proc}; do sudo mount -o bind $dir /mnt$dir; donechroot /mnt
16. subdoers ファイルを編集するには、visudo コマンドを実行します。
visudo
ファイルを編集すると、構文エラーの原因となった変更を元に戻すことができます。または、リカバリインスタンスからファイルをコピーして、/mnt/etc/sudoers ファイルを既知の正しいファイルに置き換えることもできます。
元のファイルのバックアップを作成します。
sudo mv /mnt/etc/sudoers /mnt/etc/sudoers.backup
ファイルをインスタンスにコピーします。
sudo cp /etc/sudoers /mnt/etc/sudoers
17. sudoers ファイルを編集または置き換えたら、ボリュームをアンマウントします。
for dir in {/dev,/dev/pts,/sys,/proc}; do umount /mnt$dir; donesudo umount /mnt
18. ボリュームを元のインスタンスにアタッチします.。マウントポイントは /dev/xvda または /dev/sda1 として指定します。これは元のインスタンスのルートボリュームです。
19. 元のインスタンスを起動します。
20. SSH を使用してインスタンスに接続し、sudo コマンドを実行します。
関連情報
EC2 Linux インスタンスで sudo コマンドを実行できない理由は何ですか?