EC2 インスタンスにアクセスしようとすると、「Permission denied (publickey)」または「Authentication failed, permission denied」というエラーが表示されます。このエラーの解決方法を教えてください。

最終更新日: 2021 年 5 月 4 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにアクセスするときに「Permission denied (publickey)」または「Authentication failed, permission denied」というエラーが表示されます。このエラーの解決方法を教えてください。

簡単な説明

「Permission denied (publickey)」および「Authentication failed, permission denied」エラーは次の場合に発生します。

  • AMI に誤ったユーザー名を使用して接続しようとしている。
  • インスタンスのアクセス許可が正しくない。
  • authorized_keys ファイルに正しくない SSH パブリックキー (.pub) ファイルがある。

解決方法

AMI に使用しているユーザー名が正しいか確認します。

インスタンスのアクセス許可が正しいこと、および authorized_keys ファイルに正しい SSH パブリックキーがあることを確認します。

これらのタスクを実行する方法は 4 つあります。

方法 1: EC2 シリアルコンソールを使用する

Linux 用の EC2 シリアルコンソールを有効にした場合は、それを使用してサポートされている Nitro ベースのインスタンスタイプのトラブルシューティングを行うことができます。シリアルコンソールは、起動問題、ネットワーク設定、および SSH 設定問題のトラブルシューティングに役立ちます。シリアルコンソールは、正常に動作するネットワーク接続を必要とすることなく、インスタンスに接続します。シリアルコンソールには、Amazon EC2 コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用してアクセスできます。

シリアルコンソールを使用する前に、アカウントレベルでコンソールにアクセス権を付与します。その後、IAM ユーザーにアクセス権を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。また、シリアルコンソールを使用するすべてのインスタンスには、少なくとも 1 名のパスワードベースユーザーを含める必要があります。インスタンスが到達不能で、シリアルコンソールへのアクセスを設定していない場合は、方法 2、3、または 4 の手順に従います。Linux 用の EC2 シリアルコンソールの設定の詳細については、「EC2 シリアルコンソールへのアクセスを設定する」を参照してください。

注意: AWS CLI コマンドの実行時にエラーが表示される場合は、AWS CLI の最新バージョンを使用していることを確認してください

方法 2: AWS Systems Manager Session Manager を使用してインスタンスにログインし、修正を行う

この方法は、アクセス許可を更新して、authorized_keys ファイルに SSH パブリックキーを挿入します。

注意: この方法を使用するには、SSM エージェントをインストールする必要があります。Session Manager の詳細と前提条件の一覧については、Session Manager の開始方法をご参照ください。

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

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

3.    ls -ld コマンドを使用して、home ディレクトリにあるファイルのアクセス許可が正しいことを確認します。以下は、正しいアクセス許可のリストです。

  • 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-------) にする必要があります。

ls -ld コマンドと結果の出力の例を以下に示します。この例では、ec2-user がユーザー名です。AMI に従ってユーザー名を変更します。

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

4.    ローカルコンピュータで SSH パブリックキーを確認します。

5.    SSH パブリックキーの署名が出力に存在しない場合は、authorized_keys ファイルを更新して SSH キーを許可します。次の例では、サンプルキーを SSH パブリックキーに置き換えます。

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

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 を使ってインスタンスに接続します。

方法 3: AWSSupport-TroubleshootSSH Automation プロシージャを実行する

AWSSupport-TroubleshootSSH が Amazon EC2Rescue ツールをインストールします。インストールすると、このツールが SSH 経由で Linux マシンに接続する時にリモート接続エラーを引き起こすいくつかの問題を確認して修正します。詳細については、「AWSSupport-TroubleshootSSH Automation ワークフローを使用して、SSH 接続の問題をトラブルシューティングする方法を教えてください。」を参照してください。

方法 4: ユーザーデータスクリプトを使用して SSH アクセス許可を修復し、正しい SSH パブリックキーを authorized_keys ファイルに追加する

重要

  • インスタンスが instance store-backed であるか、データを含むインスタンスストアボリュームがインスタンスにある場合、インスタンスが停止するとデータが失われることにご注意ください。詳細については、「インスタンスのルートデバイスタイプの判別」を参照してください。
  • インスタンスが Amazon EC2 Auto Scaling グループの一部である場合、インスタンスの停止によってインスタンスが終了されることがあります。Amazon EMR、AWS CloudFormation、または AWS Elastic Beanstalk で起動されたインスタンスは、AWS AutoScaling グループの一部である可能性があります。このシナリオでのインスタンスの終了は、Auto Scaling グループのインスタンスのスケールイン保護の設定に応じて異なります。インスタンスが Auto Scaling グループの一部である場合、解決のための手順を開始する前に、インスタンスを Auto Scaling グループから一時的に削除します。
  • インスタンスを停止して開始すると、インスタンスのパブリック IP アドレスが変更されます。インスタンスに外部トラフィックをルーティングするときは、パブリック IP アドレスではなく Elastic IP アドレスを使用することがベストプラクティスです。

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

2.    ナビゲーションペインで [Incetances] (インスタンス) を選択し、起動しようとしているインスタンスを選択します。

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

4.    [Actions] (アクション)、[Instance Settings] (インスタンス設定)、[Edit user data] (ユーザーデータを編集) の順に選択します。

5.    [Edit User Data] (ユーザーデータを編集) ダイアログボックスにユーザーデータスクリプトをコピーして、[Save] (保存) をクリックします。

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

6.    ローカルコンピュータで SSH パブリックキーを確認します。

7.    SSH パブリックキーの署名が出力に存在しない場合は、ステップ 5 で作成したユーザーデータスクリプトに正しいキーを追加します。書名が一致する場合は、この手順を省略できます。次の例に示すように、ユーザーデータスクリプトに 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
chown root:root /home
chmod 755 /home
chmod 700 /home/ec2-user /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys
chown ec2-user:ec2-user /home/ec2-user -R
--//

8.    インスタンスを起動します

注意: 前述のユーザーデータスクリプトは、インスタンスを再起動するたびに実行されるように設定されています。インスタンスにアクセスできるようになったら、ユーザーデータスクリプトを削除してください。

ユーザーデータの削除方法:

  • このセクションの手順 1~4 を完了します。
  • [Edit User Data] (ユーザーデータを編集) ダイアログボックスでユーザーデータスクリプトを削除します。