EC2 インスタンスで sudo コマンドを実行したときに発生する、sudo 関連のエラーを修正する方法を教えてください。

所要時間3分
0

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで、/etc/sudoers ファイルの編集または削除を行いました。その後 sudo コマンドを実行すると、構文または sudo に関するエラーが発生します。

簡単な説明

/etc/sudoers ファイルを削除したり、その設定が誤っていたりする場合に、次の構文エラーまたは sudo エラーが発生します。

  • "/etc/sudoers:abc:x: 構文エラー"
  • "sudo: /etc/sudoers を開くことができません。 該当するファイルまたはディレクトリがありません"
  • "sudo: 有効な sudoers ソースが見つからないため、終了します"
  • "sudo: 監査プラグイン sudoers_audit の初期化時にエラーが発生しました"

上記のエラーのいずれかが発生した場合、ユーザーまたはユーザーグループにシステムリソースへのアクセス許可を付与できないことを示しています。/etc/sudoers ファイルを修正するには、ルートディスクをレスキューインスタンスにアタッチします。ルートディスクをレスキューインスタンスに接続できない場合は、ユーザーデータを使用してファイルを変更します。

解決策

AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

ルートディスクをレスキューインスタンスにアタッチする

/etc/sudoers ファイルを変更するには、ルートディスクをレスキューインスタンスにアタッチすることがベストプラクティスです。

前提条件: インスタンスを停止または再起動すると、インスタンスストアのボリュームからデータが消去されます。保持するインスタンスストアボリューム上のデータをすべてバックアップします。詳しくは、「ルートデバイスの種類」を参照してください。また、インスタンスを停止または起動すると、インスタンスのパブリック IP アドレスが変更されます。外部トラフィックをインスタンスにルーティングする場合は、パブリック IP アドレスではなく、Elastic IP アドレスを使用することがベストプラクティスです。

ルートディスクをレスキューインスタンスに接続するには、次の手順を実行します。

  1. 新しいキーペアを作成します。

  2. 元のインスタンスのルートボリュームに関するボリューム ID とデバイス名を取得します。

  3. 元のインスタンスを停止します。

  4. 同じアベイラビリティーゾーンにある、同じ Linux オペレーティングシステム (OS) の Amazon マシンイメージ (AMI) から、リカバリインスタンスを起動します。

  5. 元のインスタンスからルートボリュームをデタッチし、セカンダリボリュームとしてリカバリインスタンスにアタッチします。

  6. 新しい SSH キーペアを使用してリカバリインスタンスに接続します。

  7. 次のコマンドを実行し、root ユーザーに切り替えます。

    [ec2-user ~]$ sudo su
  8. リカバリインスタンスで次のコマンドを実行し、ブロックされたデバイス名とパーティションを特定します。

    [root ~]$ lsblkNAME    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  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part
    xvdg    202:96   0   30G  0 disk

    上記の例では、/dev/xvda ボリュームと /dev/xvdf ボリュームのデバイス名はパーティション化されたボリュームであり、/dev/xvdg はパーティション化されたボリュームではありません。
    ボリュームがパーティション化されている場合は、次のコマンドを実行し、raw デバイスである /dev/xvdf ではなく、パーティション /dev/xvdf1 をマウントします。

    [root ~]$ mount -o nouuid  /dev/xvdf1 /mnt

    AWS Nitro System 基盤のインスタンスを使用する場合、ボリュームデバイス名は /dev/nvme[0-26]n1 という形式になります。インスタンスが NVMe を搭載した Nitro システムにビルドされている場合は、/mnt ディレクトリにパーティションをマウントします。lsblk コマンドを実行し、特定したデバイス名を使用します。

    [root ~]$ mount -o nouuid  /dev/nvme1n1p1 /mnt

    詳細については、「Amazon EC2 インスタンス上のボリュームのデバイス名」を参照してください。

  9. /etc/sudoers ファイルを作業インスタンスからバックアップとしてコピーするには、次のコマンドを実行します。

    [root ~]$ cp /etc/sudoers /mnt/etc/sudoers.bak
  10. 次のコマンドを実行し、/mnt ディレクトリに chroot 環境を作成します。

[root ~]$ for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt

上記の例では、/dev/proc/sys/run ディレクトリが元のルートファイルシステムからバインドマウントされます。これにより、chroot 環境内で実行されるプロセスがこれらのシステムディレクトリにアクセスできるようになります。 /etc/sudoers ファイルを編集するには、chroot 環境内で visudo コマンドを実行します。

[root ~]$ visudo

注: sudoers ファイルを編集するには、visudo コマンドを実行する必要があります。visudo コマンドにより、sudoers ファイルはロックされます。
上記のコマンドでエラーが発生した場合は、次の diff コマンドを実行して /etc/sudoers ファイルと新しい /etc/sudoers.bak ファイルを比較します。

[root ~]$ diff /etc/sudoers /etc/sudoers.bak

注: ファイルを編集する前にカスタム変更を行わなかった場合は、/etc/sudoers.bak ファイルを /etc/sudoers に復元します。 chroot 環境を終了するには、以下のコマンドを実行します。

[root ~]$ exit
  1. ルートボリュームをアンマウントするには、次のコマンドを実行します。
[root ~]$ umount -fl /mnt
  1. リカバリインスタンスから、セカンダリボリュームとしてアタッチされたルートボリュームをデタッチします。次に、ステップ 2 で使用したデバイス名で元のインスタンスに再アタッチします。
  2. 元のインスタンスを起動し、sudo コマンドが正しく動作していることを確認します。

ユーザーデータを使用してファイルを変更する

注: 次のトラブルシューティング方法では、ユーザーデータの入力を行います。この方法を実施するには、root ユーザーのパスワードを設定する必要があります。

ユーザーデータを使用してファイルを変更するには、次の手順を実行します。

  1. Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインで [インスタンス] を選択し、該当するインスタンスを選択します。

  3. [インスタンスの状態] を選択し、**[インスタンスの停止]**を選択します。

  4. [インスタンスを停止しますか?][停止] を選択します。

  5. root ユーザー用の一時パスワードを設定します。
    例:

                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
                chpasswd <<<"root:root"
                --//

    重要: このパスワードでは、プレーンテキストでシークレットが渡されるため、安全ではありません。トラブルシューティング手順を完了した後は、必ず root ユーザーから一時パスワードを削除してください。

  6. インスタンスを起動し、ec2-user でログインします。

  7. 次の pkexec コマンドを実行し、/etc/sudoers ファイルにアクセスします。

    pkexec /usr/sbin/visudo
  8. root ユーザーのパスワードを入力した後、/etc/sudoers ファイルを変更します。

  9. sudo コマンドを実行し、sudo が正しく動作していることを確認します。

  10. インスタンスを停止します。

Amazon EC2 コンソールを使用して root ユーザーパスワードなどのユーザーデータ値を削除するには、次の手順を実行します。

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインで [インスタンス] を選択し、該当するインスタンスを選択します。
  3. [アクション] を選択し、[インスタンス設定] を選択します。
  4. [ユーザーデータの編集] を選択し、すべてのユーザーデータを削除します。

AWS CLI インターフェイスを使用して root ユーザーパスワードなどのユーザーデータ値を削除するには、次の modify-instance-attribute コマンドを実行します。

aws ec2 modify-instance-attribute --instance-id example-instance-id --user-data Value=""

注: example-instance-id は、実際のインスタンス ID に置き換えます。

ユーザーデータが削除されたことを確認するには、次の describe-instance-attribute コマンドを実行します。

aws ec2 describe-instance-attribute --instance-id example-instance-id --attribute userData

注: example-instance-id は、実際のインスタンス ID に置き換えます。

ユーザーデータの削除後、インスタンスを起動します。

関連情報

EC2 Linux インスタンスで sudo コマンドを実行できない理由を知りたいです

AWS公式
AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ