SSH を使用して EC2 インスタンスに接続しようとすると、「Server refused our key (サーバーはキーを拒否しました)」というエラーが表示されるのはなぜですか?

最終更新日: 2020 年 4 月 1 日

SSH を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに接続しようとしているのですが、「Server refused our key (サーバーはキーを拒否しました)」というエラーが表示されます。どうすれば解決できますか?

簡単な説明

Server refused our key エラーが表示される理由はいくつかあります。

  • EC2 インスタンスに接続するときに、AMI に使用しているユーザー名に間違いがある。
  • インスタンスにアクセス許可の問題があるか、またはディレクトリが見つからない。
  • インスタンスにアクセスしようとしたユーザーがサーバーから削除されている。

解決方法

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

有効なユーザー名のリストについては、インスタンスへの接続に関するトラブルシューティング - 「エラー: Server refused our key または No supported authentication methods available (サーバーはキーを拒否しましたまたは利用可能なサポートされる認証方法はありません)」を参照してください。

インスタンスに正しいアクセス許可が設定されているか、および欠落しているディレクトリがないかを確認します。

インスタンスのアクセス許可とディレクトリを検証する方法は、次の 3 通りです。

方法 1: AWS Systems Manager Session Manager を使用してインスタンスにログインし、アクセス許可を確認する

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

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 接続します。

方法 2: エラーの原因となる問題を自動的に修正する

AWSSupport-TroubleshootSSH Automation ドキュメントを実行する

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

方法 3: ユーザーデータを使用してインスタンスのアクセス許可を修正する

重要な点:

  • インスタンスが Instance Store-Backed である場合、またはインスタンスにデータを含むインスタンスストアボリュームがある場合は、EC2 インスタンスの停止と再起動を必要とする手順を実行しないでください。この復旧手順では、インスタンスを停止してから再起動する必要があります。この復旧手順により、インスタンスストアボリューム上のデータが失われます。詳細については、「インスタンスのルートデバイスタイプの判別」をご参照ください。
  • インスタンスが Amazon EC2 Auto Scaling グループの一部である場合、またはインスタンスが AWS Auto Scaling を使用するサービス (Amazon EMR、AWS CloudFormation、AWS Elastic Beanstalk など) によって起動された場合には、インスタンスを停止するとインスタンスが終了する可能性があります。このシナリオでのインスタンスの削除は、Auto Scaling グループのインスタンススケールイン保護設定によって異なります。インスタンスが Auto Scaling グループの一部である場合は、解決手順を開始する前に、一時的に Auto Scaling グループからインスタンスを削除してください。
  • インスタンスを停止および再起動すると、インスタンスのパブリック IP アドレスが変更されます。インスタンスに外部トラフィックをルーティングする際のベストプラクティスは、パブリック IP アドレスではなく Elastic IP アドレスを使用することです。
  • インスタンスのルートデバイスがインスタンスストアボリュームである場合、ユーザーデータを使用して SSH キーを変更することはできません。詳細については、「インスタンスのルートデバイスタイプの判別」をご参照ください。
  • インスタンスのユーザーデータの更新は、cloud-init ディレクティブをサポートするすべてのディストリビューションに適用されます。これらの手順を正常に実行するには、cloud-init をインストールして設定する必要があります。cloud-init SSH モジュールの詳細については、「configure SSH and SSH keys」を参照してください。

1.    Amazon EC2 コンソールを開き、インスタンスを選択します。

2.    [アクション]、[インスタンスの状態]、[停止] の順に選択します。

注意: [停止] が無効になっている場合は、インスタンスがすでに停止しているか、またはそのルートデバイスがインスタンスストアボリュームになっています。

3.    [アクション]、[インスタンス設定]、[ユーザーデータの表示/変更] の順に選択します。

4.    次のスクリプトを [ユーザーデータ] フィールドにコピーし、[保存] を選択します。スクリプト全体をコピーしてください。余分なスペースを追加しないでください。

注意: 次のスクリプトでは、ユーザー名に ec2-user を使用します。ec2-userAMI のユーザー名に変更します。

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 メソッドを使用して、インスタンスのユーザーデータを変更できます。この方法へのアクセスを制限するには、AWS Identity and Access Management (IAM) ポリシーを使用します。

ユーザーがサーバーから削除されているかどうかを確認する

インスタンスへのアクセスを試みているユーザーがサーバーから削除されている場合、ユーザーを新しいユーザーとして追加しなおします。詳細については、SSH アクセスを行える新しいユーザーアカウントを Amazon EC2 Linux インスタンスに追加するには? を参照してください。