SSH を使用して EC2 インスタンスに接続しようとすると、「サーバーがキーを拒否しました」というエラーが表示されるのはなぜですか?
SSH を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに接続すると、「サーバーがキーを拒否しました」というエラーが表示されます。
簡単な説明
SSH サーバー (sshd) がプライベート SSH キーを拒否する理由は複数あります。このエラーが表示される一般的な理由は次のとおりです。
- EC2 インスタンスに接続するときに AMI に間違ったユーザー名を使用しています。通常のユーザー名は ec2-user、ubuntu、centos、root、または管理者です。
- インスタンスにアクセスしようとしたユーザーがサーバーから削除されたか、アカウントがロックされました。
- インスタンスにアクセス権限の問題があるか、ディレクトリがありません。
- EC2 インスタンスに接続するときに、間違ったプライベートキーファイルを使用しています。詳細については、「Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスへの接続時に「imported-openssh-key」または「Putty Fatal Error」エラーが表示されるのはなぜですか?」の**「プライベートキーが正しいことを確認する」**セクションを参照してください。
- /etc/ssh/sshd_config の SSH サーバー設定が変更されました。詳細については、「インスタンスの sshd_config ファイルを変更した後、SSH を使用して EC2 インスタンスにアクセスする方法」を参照してください。
- オペレーティングシステムが、ホームディレクトリ (/etc/fstab) をマウントできませんでした。詳細については、「EC2 Linux インスタンスが起動せず、緊急モードになるのはなぜですか?」の**「依存関係失敗エラー」**セクションを参照してください。
解決策
EC2 インスタンスに接続するときに AMI に間違ったユーザー名を使用している
有効なユーザー名のリストについては、「エラー: サーバーはキーを拒否しました、またはサポートされる認証方法はありません」を参照してください。
インスタンスにアクセスしようとしたユーザーがサーバーから削除されたかアカウントがロックされました
インスタンスにアクセスしようとしたユーザーがサーバーから削除された場合は、そのユーザーを新しいユーザーとして追加し直します。詳細については、「SSH アクセスを行える新しいユーザーアカウントを Amazon EC2 Linux インスタンスに追加する方法」を参照してください。
インスタンスにアクセス権限の問題があるか、ディレクトリが見つかりません
インスタンスの権限とディレクトリを確認するには、次の 4 つの方法があります。
方法 1: EC2 シリアルコンソールを使用する
Linux 用 EC2 シリアルコンソール を有効にしている場合は、シリアルコンソールを使用して、サポートされている Nitro ベースのインスタンスタイプをトラブルシューティングできます。シリアルコンソールは、起動に関する問題、ネットワーク構成、および SSH 設定の問題のトラブルシューティングに役立ちます。シリアルコンソールは、ネットワーク接続が機能していなくてもインスタンスに接続します。Amazon EC2 コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用してシリアルコンソールにアクセスできます。
シリアルコンソールを使用する前に、アカウントレベルでシリアルコンソールへのアクセスを許可する必要があります。次に、IAM ユーザーにアクセス権を付与する AWS ID およびアクセス管理 (IAM) ポリシーを作成する必要があります。また、シリアルコンソールを使用するすべてのインスタンスには、少なくとも 1 人のパスワードベースのユーザーが含まれている必要があります。インスタンスにアクセスできず、シリアルコンソールへのアクセスを設定していない場合は、方法 2、3、または 4 の指示に従ってください。Linux 用 EC2 シリアルコンソールの設定については、「EC2 シリアルコンソールへのアクセスの設定」を参照してください。
**方法 2:**AWS Systems Manager セッションマネージャーを使用してインスタンスにログインし、権限を確認します
**注:**この方法を使用するには、SSM Agent のインストールが必要です。セッションマネージャーの詳細と前提条件の一覧については、「セッションマネージャーの設定」を参照してください。
1. [AWS Systems Manager コンソール] を開きます。
2. セッションを開始します。
3. stat コマンドを使用して、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-------) でなければなりません。
以下は、stat コマンドとその結果の出力の例です。この例では、ec2-user がユーザー名です。特定の AMI に合わせてユーザー名を変更してください。
$ stat /home/ec2-user/ File: '/home/ec2-user/' Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 10301h/66305d Inode: 18322 Links: 3 Access: (0700/drwx------) Uid: ( 500/ec2-user) Gid: ( 500/ec2-user)
4. 権限が上記の値と一致しない場合は、次のコマンドを実行します。
$ 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
5. セッションを終了します。
6. インスタンスに SSH で接続します。
メソッド 3: AWSSupport-TroubleshootSSH ドキュメントを実行して、エラーの原因となっている問題を自動的に修正します
AWSSupport-TroubleshootSSH 自動化ドキュメントでは、Amazon EC2Rescue ツールをインスタンスにインストールし、SSH 経由で Linux マシンに接続するときにリモート接続エラーの原因となるいくつかの問題を確認して修正します。詳細については、「SSH を使用して EC2 インスタンスに接続しようとするとエラーが発生します」を参照してください。AWSSupport-TroubleshootSSH 自動化ワークフローを使用して SSH 接続に関する問題をトラブルシューティングする方法
メソッド 4: ユーザーデータを使用してインスタンスの権限を修正する
重要:
- この復旧手順では、インスタンスを停止して起動する必要があります。これを行うと、インスタンスストアボリュームのデータは失われます。詳細については、「インスタンスのルートデバイスタイプの決定」を参照してください。
- インスタンスが Amazon EC2 Auto Scaling グループの一部である場合、インスタンスは停止すると終了する可能性があります。これは、Amazon EMR、AWS CloudFormation、AWS Elastic Beanstalk などの AWS Auto Scalingを使用するサービスによって起動されたインスタンスでも発生する可能性があります。このシナリオでのインスタンスの終了は、Auto Scaling グループのインスタンススケールイン保護設定によって異なります。インスタンスが Auto Scaling グループの一部である場合は、解決手順を開始する前に Auto Scaling グループから一時的にインスタンスを削除します。
- インスタンスを停止して再起動すると、インスタンスのパブリック IP アドレスが変更されます。外部トラフィックをインスタンスにルーティングする場合は、パブリック IP アドレスの代わりに Elastic IP アドレスを使用するのがベストプラクティスです。
- インスタンスのルートデバイスがインスタンスストアボリュームの場合、ユーザーデータを使用して SSH キーを変更することはできません。詳細については、「インスタンスのルートデバイスタイプの決定」を参照してください。
- インスタンスのユーザーデータの更新は、cloud-init ディレクティブをサポートするすべてのディストリビューションに適用されます。これらの手順を正常に実行するには、cloud-init をインストールして設定する必要があります。cloud-init SSH モジュールの詳細については、Cloud-init ドキュメントの「SSH-SSH と SSH キーの設定」を参照してください。
1. Amazon EC2 コンソールを開き、インスタンスを選択します。
2. [インスタンスの状態] を選択し、[インスタンスの停止] を選択します。
注:****[停止] が使用できない場合は、インスタンスがすでに停止しているか、そのルートデバイスがインスタンスストアボリュームであるかのどちらかです。
3. [アクション] を選択し、[インスタンス設定] を選択し、[ユーザーデータの編集] を選択します。
4. 次のスクリプトを [ユーザーデータ] フィールドにコピーし、[保存] を選択します。必ずスクリプト全体をコピーし、余分なスペースを追加しないでください。
**注:**次のスクリプトでは、ec2-user というユーザー名を使用しています。ec2-user をご使用の AMI のユーザー名に変更してください。
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 --//
5. インスタンスを起動しインスタンスに SSH で接続します。
**注:**デフォルトでは、ユーザーデータスクリプトはインスタンスごとに 1 回実行されます。このプロシージャは、インスタンスの再起動、停止、または起動のたびにパブリックキーを追加するようにデフォルトの動作を変更します。デフォルトの動作に戻すには、カスタムユーザーデータを削除します。ベストプラクティスとして、インスタンスの初回起動後にユーザーデータを実行できるようにすることによるセキュリティ上の影響を検討してください。インスタンスのユーザーデータは、ModifyInstanceAttribute API メソッドを使用して変更できます。このメソッドへのアクセスを制限するには、IAM ポリシーを使用してください。
関連情報
PuTTY を使用して Windows から Linux インスタンスに接続します
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 6年前lg...
- 質問済み 3ヶ月前lg...
- 承認された回答質問済み 3ヶ月前lg...
- AWS公式更新しました 6ヶ月前