EC2 インスタンスの sudoers ファイルを編集しましたが、sudo コマンドを実行しようとすると構文エラーが発生します。これを修正するにはどうすればよいですか?
最終更新日: 2021 年 9 月 17 日
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 ファイルに戻します。
警告: この手順を開始する前に、次の点に注意してください。
- インスタンスを停止して再開すると、インスタンスストアボリュームのデータがすべて消去されます。インスタンスストアボリューム上の保持したいデータを必ずバックアップしてください。詳細については、インスタンスのルートデバイスタイプの判別を参照してください。
- インスタンスを停止および再起動すると、インスタンスのパブリック IP アドレスが変更されます。インスタンスに外部トラフィックをルーティングするときは、パブリック IP アドレスの代わりに Elastic IP アドレスを使用することをお勧めします。
解決方法
注: 接続可能な実行中のインスタンスで、vi、vim、nano などのテキストエディタを使用して、sudoers ファイルを手動で編集しないでください。接続できるインスタンスの /etc/sudoers ファイルを編集する際は、常に visudo を実行してください。Visudo は編集時に解析エラーをチェックし、変更を保存する前にファイルに発生した問題についての注意喚起を行います。
1. Amazon EC2 コンソールを開きます。
2. ナビゲーションペインで [Instances] を選択し、障害が発生したインスタンスを選択します。
3. [Actions]、[Instance State]、[Stop] の順でクリックします。
4. [Description] タブで [Root device] を選択し、[EBS ID] をクリックします。
5. [アクション]、[ボリュームをデタッチ] (/dev/sda1 または /dev/xvda)、[デタッチ] の順にクリックします。
6. [状態] が [利用可能] であることを確認します。
7. 元のインスタンスと同じアベイラビリティーゾーンで、新しい EC2 インスタンスを起動します。新しいインスタンスがレスキューインスタンスになります。
8. レスキューインスタンスが起動したら、ナビゲーションペインで [ボリューム] をクリックし、元のインスタンスの接続解除したルートボリュームを選択します。
9. [アクション] を選択してから、[ボリュームのアタッチ] を選択します。
10. レスキューインスタンス ID (1-xxxx) を選択し、デバイス名 (/dev/sdf など) を入力します。
11. SSH を使用して、キーペアを使用してレスキューインスタンスに接続します。
12. lsblk コマンドを実行して、アタッチされたボリュームのデバイス名を確認します。
lsblk
以下に出力の例を示します。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 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
13. マウントディレクトリを作成し、ルート権限でマウントします。
Amazon Linux、Ubuntu、および Debian:
sudo mount /dev/xvdf1 /mnt
Amazon Linux 2、CentOS 7 または 8、SUSE Linux 12、および RHEL 7.x または 8.x:
sudo mount -o nouuid /dev/xvdf1 /mnt
コンソールで、新しくアタッチされたボリュームのマウントポイントを確認します。通常、このマウントポイントは /dev/xvdf1 です。
14. マウントされたディレクトリに Chroot を指定します。
for dir in {/dev,/dev/pts,/sys,/proc}; do sudo mount -o bind $dir /mnt$dir; done
chroot /mnt
15. visudo コマンドを使用して sudoers ファイルを編集します。
visudo
ファイルを編集するには、次の 2 つのオプションがあります。
オプション 1: 構文エラーを引き起こした変更を元に戻す方法。
オプション 2: リカバリインスタンスからファイルをコピーして、/mnt/etc/sudoers ファイルをリカバリインスタンスの既知の正しいファイルに置き換える方法。
元のファイルのバックアップを作成します。
sudo mv /mnt/etc/sudoers /mnt/etc/sudoers.backup
ファイルをインスタンスにコピーします。
sudo cp /etc/sudoers /mnt/etc/sudoers
16. sudoers ファイルを編集または置換した後、ボリュームのマウントを解除します。
for dir in {/dev,/dev/pts,/sys,/proc}; do umount /mnt$dir; done
sudo umount /mnt
17. ボリュームを元のインスタンスにアタッチします。これは元のインスタンスのルートボリュームであるため、マウントポイントを /dev/xvda または /dev/sda1 として指定します。
18. 元のインスタンスを起動します。
19. SSH を使用してインスタンスに接続し、sudo コマンドを実行してみてください。