EC2 インスタンスの sudoers ファイルを編集しましたが、sudo コマンドを実行しようとすると構文エラーが発生します。この問題を解決する方法を教えてください。

最終更新日: 2020 年 3 月 27 日

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 を実行できないインスタンスや、特権ユーザーアクセスを必要とするコマンドが発生する可能性があります。この構文エラーを修正するには、インスタンスを停止し、ルートボリュームをデタッチして、それをリカバリインスタンスにアタッチし、ルートボリュームをセカンダリボリュームとしてマウントしてから、変更内容を sudoers ファイルに戻します。

警告: この手順を開始する前に、次の点にご注意ください。

解決方法

注: 接続可能な実行中のインスタンスで、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.    [Actions]、[Detach Volume] (/dev/sda1 または /dev/xvda)、[Yes, Detach] の順にクリックします。

6.    [State] が [Available] であることを確認します。

7.    元のインスタンスと同じアベイラビリティーゾーンで、新しい EC2 インスタンスを起動します。新しいインスタンスがレスキューインスタンスになります。

8.    レスキューインスタンスが起動したら、ナビゲーションペインで [Volumes] をクリックし、元のインスタンスの接続解除したルートボリュームを選択します。

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.    マウントディレクトリを作成し、ルート権限でマウントします。

sudo mount /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 コマンドを実行してみてください。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合