EC2 インスタンスにアクセスしようとすると、「Permission denied (publickey)」または「Authentication failed, permission denied」というエラーが表示されます。これを解決するにはどうすればよいですか?
最終更新日: 2022 年 5 月 20 日
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにアクセスするときに「Permission denied (publickey)」(許可が拒否されました (publickey)) または「Authentication failed, permission denied」(認証に失敗し、許可が拒否されました) というエラーが表示されます。解決方法を教えてください。
簡単な説明
「Permission denied (publickey)」および「Authentication failed, permission denied」エラーは次の場合に発生します。
- AMI に誤ったユーザー名を使用して接続しようとしている。
- オペレーティングシステム内のファイルのアクセス許可がインスタンスに対して正しくない。
- authorized_keys ファイルに正しくない SSH 公開キー (.pub) ファイルがある。
解決方法
AMI に使用しているユーザー名が正しいか確認します。
有効なユーザー名の一覧については、「エラー: Server refused our key または No supported authentication methods available (サーバーはキーを拒否しました、または利用可能なサポートされる認証方法はありません)」を参照してください。
オペレーティングシステムのファイルのアクセス許可が正しいこと、および 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 Agent をインストールする必要があります。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 Auto Scaling グループの一部である可能性があります。このシナリオでのインスタンスの削除は、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
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 に関連付けられるユーザー名に置き換えてください。詳細については、「接続の問題の一般的な原因」 の「インスタンスの起動に使用した AMI のデフォルトのユーザー名を取得する」を参照してください。
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
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
--//
注:OS_USER の値を、インスタンスを起動した AMI に関連付けられるユーザー名に置き換えてください。詳細については、「接続の問題の一般的な原因」 の「インスタンスの起動に使用した AMI のデフォルトのユーザー名を取得する」を参照してください。
8. インスタンスを起動します。
注意: 前述のユーザーデータスクリプトは、インスタンスを再起動するたびに実行されるように設定されています。インスタンスにアクセスできるようになったら、ユーザーデータスクリプトを削除してください。
ユーザーデータの削除方法:
- このセクションの手順 1~4 を完了します。
- [Edit User Data] (ユーザーデータを編集) ダイアログボックスでユーザーデータスクリプトを削除します。