EC2 インスタンスへのアクセス時に発生する、"アクセス許可が拒否されました (publickey)" または "認証失敗、アクセス許可が拒否されました" というエラーを解決する方法を教えてください。

所要時間3分
0

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにアクセスしようとすると、"アクセス許可が拒否されました (publickey)" または "認証失敗、アクセス許可が拒否されました" というエラーが表示されます。

簡単な説明

次の原因で、アクセス許可が拒否されました (publickey) または認証失敗、アクセス許可が拒否されましたというエラーが発生します。

  • 接続時に、Amazon マシンイメージ (AMI) に誤ったユーザー名を使用している。
  • インスタンスのオペレーティングシステム (OS) でファイルのアクセス許可が誤っている。
  • authorized_keys の SSH パブリックキー (.pub) ファイルが誤っているか、キーを使用せずにインスタンスを起動した。
  • authorized_keys ファイルまたは .ssh フォルダの名前が誤っている。
  • authorized_keys ファイルまたは .ssh フォルダが削除されている。
  • (Ubuntu 20.x のみ) SSH 設定で AuthorizedKeysCommand を使用している。

解決策

AMI で正しいユーザー名を使用していることを確認する

AMI に必ず有効なユーザー名を使用していることを確認します

OS においてファイルのアクセス許可が正しく、authorized_keys ファイルに正しい SSH パブリックキーがあることを確認する

次のいずれかの方法で設定を確認します。

EC2 シリアルコンソールを使用する

Linux で EC2 シリアルコンソールを有効にした場合は、コンソールを使用して、サポートされている Nitro ベースのインスタンスタイプをトラブルシューティングします。シリアルコンソールは、ネットワーク接続を必要とせずインスタンスに接続できます。シリアルコンソールには、Amazon EC2 コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) 経由でアクセスできます。

シリアルコンソールを使用する前に、AWS アカウントレベルでシリアルコンソールへのアクセスを許可します。次に、IAM ユーザーにコンソールへのアクセス許可を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。シリアルコンソールを使用する各インスタンスには、パスワードベースのユーザーが少なくとも 1 ユーザー必要です。Linux 用 EC2 シリアルコンソールの設定方法については、「EC2 シリアルコンソールへのアクセスを設定する」を参照してください。

インスタンスに到達できず、シリアルコンソールへのアクセスを設定していない場合は、別の方法で設定を確認してください。

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

Systems Manager Session Manager を使用する

注: この方法では、SSM Agent をインストールする必要があります。Systems Manager を使用するための前提条件のリストについては、「ステップ 1: Session Manager の前提条件を満たす」を参照してください。

AWS Systems Manager Session Manager を使用してインスタンスにログインし、修正を行います。次の手順を実行します。

  1. Systems Manager コンソールを開きます。

  2. セッションを開始します

  3. ls -ld コマンドを実行し、home ディレクトリにあるファイルのアクセス許可が正しいかどうかを確認します。

    ls -ld /home/ec2-user/

    注: ec2-user は、インスタンスの Amazon マシンイメージ (AMI) に基づいたユーザー名に置き換えてください。
    次の例のような出力が表示されます。

    drwx------ 3 ec2-user ec2-user 4096 Apr  1 08:31 /home/ec2-user/

    次の例は、必要な正しいアクセス許可のリストを示しています。
    Linux のホームディレクトリ /home(0755/drwxr-xr-x) を使用します。
    ユーザーのホームディレクトリ /home/ec2-user/(0700/drwx------) を使用します。
    .ssh ディレクトリ /home/ec2-user/.ssh のアクセス許可に (0700/drwx------) を使用します。
    authorized_keys ファイル /home/ec2-user/.ssh/authorized_keys のアクセス許可に (0600/-rw-------) を使用します。

  4. ローカルコンピュータで、SSH パブリックキーを使用していることを確認します。

  5. SSH パブリックキーの署名が出力に表示されていない場合は、authorized_keys ファイルを更新して SSH キーを許可します。次のコマンドを実行します。

    echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys

    注: サンプルキーはお使いの SSH 公開キーに置き換えます。

  6. アクセス許可を修正するには、EC2 インスタンスで次のコマンドを実行します。

    sudo chown root:root /home
    sudo chmod 755 /home
    sudo chown ec2-user:ec2-user /home/ec2-user -R
    sudo chmod 700 /home/ec2-user /home/ec2-user/.ssh
    sudo chmod 600 /home/ec2-user/.ssh/authorized_keys
  7. セッションを終了します

  8. SSH を使用してインスタンスに接続します

AWSSupport-TroubleshootSSH オートメーションランブックを実行する

AWSSupport-TroubleshootSSH を使用して、SSH 経由の Linux マシンへのリモート接続でエラーが発生する原因となる問題を確認し、修正します。詳細については、「SSH を使用して EC2 インスタンスに接続しようとするとエラーが発生します。AWSSupport-TroubleshootSSH オートメーションワークフローを使用して SSH 接続に関する問題をトラブルシューティングする方法を教えてください」を参照してください。

ユーザーデータスクリプトを使用して SSH のアクセス許可を修復し、正しい SSH 公開キーを authorized_keys ファイルに追加する

重要: この方法で行うには、インスタンスを停止する必要があります。インスタンスを停止すると、次の影響が発生します。

  • インスタンスが Amazon Elastic Block Storage (Amazon EBS) インスタンスストアを基盤としているか、データを含むインスタンスストアボリュームがある場合、データは失われます。
  • インスタンスが Amazon EC2 Auto Scaling グループに属している場合、Amazon EC2 Auto Scaling によりインスタンスが終了する場合があります。Amazon EMR、AWS CloudFormation、または AWS Elastic Beanstalk を使用して起動するインスタンスは、Auto Scaling グループに属している可能性があります。この場合、インスタンスの終了は、Auto Scaling グループのインスタンススケールイン保護設定に左右されます。インスタンスが Auto Scaling グループに属している場合は、次の解決手順を実行する前に Auto Scaling グループから一時的にインスタンスを削除します。
  • インスタンスのパブリック IP アドレスが変更されます。外部トラフィックをインスタンスにルーティングする場合は、パブリック IP アドレスではなく、Elastic IP アドレスを使用するのがベストプラクティスです。

SSH のアクセス許可を修復するには、次の手順を実行します。

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

  2. ナビゲーションペインから [インスタンス] を選択し、起動するインスタンスを選択します。

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

  4. [アクション] を選択し、[インスタンス設定] を選択します。

  5. [ユーザーデータを編集] を選択します。

  6. [ユーザーデータを編集] に次のユーザーデータスクリプトを入力します。

    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
    OS_USER=os-user
    chown root:root /home
    chmod 755 /home
    chown $OS_USER:$OS_USER /home/$OS_USER -R
    chmod 700 /home/$OS_USER
    chmod 700 /home/$OS_USER/.ssh
    chmod 600 /home/$OS_USER/.ssh/authorized_keys
    --//

    注: os-user は、インスタンスの起動に使用した AMI に関連付けられたユーザー名に置き換えます。

  7. [保存] をクリックします。

  8. ローカルコンピュータで、SSH パブリックキーを使用していることを確認します。

  9. SSH パブリックキーの署名が出力にない場合は、そのキーをユーザーデータスクリプトに追加します。署名が一致している場合は、次のステップに進みます。

    SSH パブリックキーを使用したユーザーデータスクリプトの例:

    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
    OS_USER=os-user
    chown root:root /home
    chmod 755 /home
    chmod 700 /home/$OS_USER
    chmod 700 /home/$OS_USER/.ssh
    chmod 600 /home/$OS_USER/.ssh/authorized_keys
    echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/$OS_USER/.ssh/authorized_keys
    chown $OS_USER:$OS_USER /home/$OS_USER -R
    --//
  10. インスタンスを起動します

注: 上記のユーザーデータスクリプトは、インスタンスを再起動するたびに実行されるように設定されています。インスタンスへのアクセスが復旧した後は、ユーザーデータスクリプトを削除します。

(Ubuntu 20.x のみ) SSH の設定について、AuthorizedKeysCommand を確認します。

Ubuntu 20.x には、EC2 Instance Connect がデフォルトでインストールされています。SSH 認証用に AuthorizedKeysCommandAuthorizedKeysCommandUser の設定を構成した場合、EC2 Instance Connect のインストールではこれらの設定は更新されません。これが原因で、EC2 Instance Connect を使用できなくなります。この問題を解決するには、SSH 設定から AuthorizedKeysCommand および AuthorizedKeysCommandUser を削除します。

関連情報

SSH を使用して Amazon EC2 Linux インスタンスへの接続をトラブルシューティングする方法を教えてください

プライベートキーを紛失した場合のインスタンスへの接続方法を教えてください

最初のインスタンスの起動後に SSH キーペアを紛失した場合に、Amazon EC2 インスタンスに接続する方法を教えてください

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

関連するコンテンツ