EC2 インスタンスにアクセスしようとすると、「アクセス許可が拒否されました (publickey)」または「認証に失敗し、アクセス許可が拒否されました」というエラーが表示されます。これを解決するにはどうすればよいですか?
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにアクセスしようとすると、「アクセス許可が拒否されました (publickey)」または「認証に失敗し、アクセス許可が拒否されました」というエラーが表示されます。
簡単な説明
「アクセス許可が拒否されました (publickey) 」および「認証に失敗し、アクセス許可が拒否されました」エラーは、次の場合に発生します。
- 誤ったユーザー名を使用して 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 の詳細と前提条件の一覧については、Setting up 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 マシンに接続する際に、リモート接続エラーを引き起こすいくつかの問題を確認して修正します。詳細については、「SSH を使用して EC2 インスタンスに接続しようとするとエラーが発生します。AWSSupport-TroubleshootSSH 自動化ワークフローを使用して SSH 接続に関する問題をトラブルシューティングする方法」を参照してください。
方法 4: ユーザーデータスクリプトを使用して SSH アクセス許可を修復し、 正しい SSH 公開キーを authorized\ _keys ファイルに追加する
重要
- インスタンスがインスタンスストアでバックアップされている場合や、データを含むインスタンスストアボリュームがある場合、インスタンスを停止するとデータが失われます。詳細については、「インスタンスのルートデバイスタイプの判別」を参照してください。
- インスタンスが 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. ナビゲーションペインで [インスタンス] を選択し、起動するインスタンスを選択します。
3. インスタンスを停止します。
4. [アクション]、[インスタンス設定]、**[ユーザーデータを編集]**の順に選択します。
5. 次のユーザーデータスクリプトを [ユーザーデータを編集] ダイアログボックスにコピーし、**[保存]**を選択します。
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 を完了します。
- **[ユーザーデータを編集]**ダイアログボックスでユーザーデータスクリプトを削除します。
関連情報
SSH を使用して Amazon EC2 Linux インスタンスへの接続をトラブルシューティングする方法を教えてください。
関連するコンテンツ
- 質問済み 7年前lg...
- 質問済み 1年前lg...
- 質問済み 4年前lg...
- AWS公式更新しました 1年前