嘗試存取 EC2 執行個體時收到「許可遭拒 (publickey)」或「身份驗證失敗,許可遭拒」錯誤。如何解決此錯誤?

上次更新日期:2021 年 9 月 21 日

存取 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體時收到「許可遭拒 (publickey)」或「身分驗證失敗,許可遭拒」錯誤。如何解決此錯誤?

簡短描述

在以下情況將會發生「許可遭拒 (publickey)」或「身份驗證失敗,許可遭拒」錯誤:

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

解決方案

驗證您使用的是正確的 AMI 使用者名稱

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

驗證作業系統內的檔案許可是否正確,且正確的 SSH 公有金鑰位於 authorized_keys 檔案內

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

方法 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 的工作階段管理員登入執行個體並進行更正

此方法可以更新許可,並將您的 SSH 公開金鑰加入 authorized_keys 檔案。

注意:使用此方法需要安裝 SSM Agent。如需工作階段管理員和完整必要條件清單的詳細資訊,請參閱設定工作階段管理員

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_keys 檔案

重要

  • 如果您的執行個體是執行個體後端或具有包含資料的執行個體存放區磁碟區,則執行個體停止時,資料會遺失。如需詳細資訊,請參閱判斷執行個體的根裝置類型
  • 如果您的執行個體屬於 Amazon EC2 Auto Scaling 群組,則停用執行個體時可能會終止執行個體。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 啟動的執行個體可能屬於 AWS Auto Scaling 群組。在此情況下,執行個體是否終止取決於 Auto Scaling 群組的執行個體縮減保護設定。如果您的執行個體屬於 Auto Scaling 群組,請先從 Auto Scaling 群組中暫時移除該執行個體,然後再執行解決方案步驟。
  • 停止和啟動執行個體會改變執行個體的公有 IP 地址。在將外部流量路由到您的執行個體時,最佳實務是使用彈性 IP 地址而不是公有 IP 地址。

1.    開啟 Amazon EC2 主控台

2.    從導覽窗格中選擇 Instances (執行個體),然後選取您嘗試啟動的執行個體。

3.    停止執行個體

4.    選擇 Actions (動作),Instance settings (執行個體設定),Edit User Data (編輯使用者資料)。

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。
  • Edit User Data (編輯使用者資料) 對話方塊中刪除使用者資料指令碼。