EC2 インスタンスで sudoers ファイルを編集し、sudo コマンドを実行すると構文エラーが表示されます。これを修正するにはどうすれば良いですか?

所要時間2分
0

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 や、特権ユーザーアクセスを必要とするコマンドを実行できなくなります。この構文エラーを修正するには、次の手順を実行します。

  1. インスタンスを停止します。
  2. ルートボリュームをデタッチします。
  3. ルートボリュームを 2 次ボリュームとしてリカバリインスタンスにアタッチします。
  4. アタッチされたボリュームをマウントします。
  5. 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 コマンドを実行できない理由は何ですか?

AWS公式
AWS公式更新しました 6ヶ月前