當嘗試存取 EC2 執行個體時,我收到 "Permission denied (publickey)" 或 "Authentication failed, permission denied" 錯誤。如何解決此問題?

3 分的閱讀內容
0

當存取我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體時,我收到 "Permission denied (publickey)" 或 "Authentication failed, permission denied" 錯誤。

簡短描述

出現下列情況時,會發生 "Permission denied (publickey)" 和 "Authentication failed, permission denied" 錯誤:

  • 您嘗試使用錯誤的 AMI 使用者名稱連線。
  • 作業系統内的檔案許可在執行個體上不正確。
  • 不正確的 SSH 公有金鑰 (.pub) 檔案位於 authorized_keys 檔案中。

解決方法

確認您是否為 AMI 使用正確的使用者名稱

如需有效使用者名稱的清單,請參閱錯誤: 伺服器拒絕我們的金鑰,或者沒有支援的驗證方法

確認作業系統內的檔案許可正確,且 authorized_keys 檔案中有正確的 SSH 公有金鑰

有四種方法可以執行這些任務:

方法 1: 使用 EC2 序列主控台

如果您已啟用適用於 Linux 的 EC2 序列主控台,則可以使用它來對支援的 Nitro 型執行個體類型進行疑難排解。序列主控台可協助您對開機問題、網路組態和 SSH 組態問題進行疑難排解。序列主控台可連線至執行個體,無需可運作的網路連線。您可以使用 Amazon EC2 主控台或 AWS Command Line Interface (AWS CLI),存取序列主控台。

使用序列主控台之前,先在帳戶層級授予主控台存取權。然後,建立 AWS Identity and Access Management (IAM) 政策,將存取權授予給 IAM 使用者。此外,每個使用序列主控台的執行個體都必須至少包含一個密碼型使用者。如果您的執行個體無法連線,而且您並未設定序列主控台的存取權,則依照方法 2、3 或 4 中的指示操作。如需有關設定適用於 Linux 的 EC2 序列主控台的資訊,請參閱設定 EC2 序列主控台的存取權

**注意:**如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版本的 AWS CLI

方法 2: 使用 AWS Systems Manager Session Manager 登入執行個體並更正

此方法會更新許可,並將您的 SSH 公有金鑰插入 authorized_keys 檔案中。

**注意:**使用此方法時需要安裝 SSM 代理程式。如需 Session Manager 和完整的先決條件清單,請參閱設定 Session Manager

1.    開啟 AWS Systems Manager 主控台

2.    啟動工作階段

3.    使用 ls -ld 命令確定目錄下的檔案許可正確無誤。以下是正確許可的清單:

  • 例如,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 自動化程序

AWSSupport-TroubleshootSSH 安裝 Amazon EC2Rescue 工具。安裝後,該工具會檢查並更正透過 SSH 連線至 Linux 機器時,導致遠端連線錯誤的一些問題。如需詳細資訊,請參閱如何使用 AWSSupport-TroubleshootSSH 自動化工作流程對 SSH 連線問題進行疑難排解?

方法 4: 使用使用者資料指令碼修復 SSH 許可 ,並將正確的 SSH 公有金鑰新增至 authorized_key 檔案

重要事項

  • 如果執行個體是執行個體儲存體備份,或具有包含資料的執行個體儲存體磁碟區,則當您停止執行個體時,資料會遺失。如需詳細資訊,請參閱確定執行個體的根裝置類型
  • 如果您的執行個體屬於 Amazon EC2 Auto Scaling 群組的一部分,則停止執行個體可能會將其終止。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 啟動的執行個體,可能是 AWS Auto Scaling 群組的一部分。在這種情況下,執行個體終止取決於您 Auto Scaling 群組的執行個體向內擴展保護設定。如果執行個體屬於 Auto Scaling 群組的一部分,請先暫時從 Auto Scaling 群組中移除該執行個體,然後再開始解決方法步驟。
  • 停止和啟動執行個體會變更執行個體的公有 IP 地址。將外部流量路由至您的執行個體時,最佳實務是使用 Elastic IP 地址,而非公有 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
--//

注意:使用與啟動執行個體的 AMI 相關聯的使用者名稱取代 OS_USER 的值。如需詳細資訊,請參閱連線問題的常見原因取得您用來啟動執行個體的 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
--//

注意:使用與啟動執行個體的 AMI 相關聯的使用者名稱取代 OS_USER 的值。如需詳細資訊,請參閱連線問題的常見原因取得您用來啟動執行個體的 AMI 的預設使用者名稱

8.    啟動您的執行個體

**注意:**上述使用者資料指令碼設定為在每次重新啟動執行個體時執行。重新取得執行個體的存取權之後,移除使用者資料指令碼。

移除使用者資料:

  • 完成本節中的步驟 1–4。
  • 刪除編輯使用者資料對話方塊中的使用者資料指令碼。

相關資訊

如何對使用 SSH 連線至 Amazon EC2 Linux 執行個體的問題進行疑難排解?

我遺失我的私有金鑰。如何連接至我的 Linux 執行個體?

如果我在首次啟動後就遺失了 SSH 金鑰對,該如何連接至 Amazon EC2 執行個體?

AWS 官方
AWS 官方已更新 1 年前