如何解決在存取 EC2 執行個體時收到的「Permission denied (publickey)」(權限遭拒 (publickey)) 或「Authentication failed, permission denied」(驗證失敗,權限遭拒) 錯誤?

3 分的閱讀內容
0

在存取我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體時,我收到「Permission denied (publickey)」(權限遭拒 (publickey)) 或「Authentication failed, permission denied」(驗證失敗,權限遭拒) 錯誤。

簡短說明

Permission denied (publickey)」(權限遭拒 (publickey)) 和「Authentication failed, permission denied」(驗證失敗,權限遭拒) 錯誤是由於下列原因所導致:

  • 連線時,您使用錯誤的 Amazon Machine Image (AMI) 使用者名稱。
  • 您擁有錯誤的執行個體作業系統 (OS) 檔案權限。
  • authorized_keys 檔案具有不正確的 SSH 公開金鑰 (.pub) 檔案,或者您在沒有金鑰的情況下啟動執行個體。
  • 沒有正確為您的 authorized_keys 檔案或 .ssh 資料夾命名。
  • authorized_keys 檔案或 .ssh 資料夾已刪除。
  • (僅限 Ubuntu 20.x) 您在 SSH 組態中使用 AuthorizedKeysCommand

解決方法

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

確保您為 AMI 使用有效的使用者名稱

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

若要驗證您的組態,請使用下列其中一種方法。

使用 EC2 序列主控台

如果您已啟用適用於 Linux 的 EC2 序列主控台,則可以使用主控台來對支援的 Nitro 型執行個體類型進行疑難排解。序列主控台可連線至執行個體,無需網路連線。您可以透過 Amazon EC2 主控台或 AWS Command Line Interface (AWS CLI),存取序列主控台。

使用序列主控台之前,先在 AWS 帳戶層級授予主控台存取權。然後,建立 AWS Identity and Access Management (AWS IAM) 政策,以授予 IAM 使用者主控台存取權。每個使用序列主控台的執行個體都必須包含至少一個密碼型使用者。如需有關如何設定適用於 Linux 的 EC2 序列主控台的資訊,請參閱設定 EC2 序列主控台的存取權

如果您的執行個體無法連線,且您尚未設定序列主控台的存取權,請使用其他方法來驗證您的組態。

**注意:**如果您在執行 AWS CLI 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

使用 Systems Manager Session Manager

**注意:**若要使用此方法,您必須安裝 SSM Agent。如需使用 Systems Manager 的先決條件清單,請參閱步驟 1: 完成 Session Manager 先決條件

使用 AWS Systems Manager Session Manager 來登入執行個體並進行更正。請完成下列步驟:

  1. 開啟 Systems Manager 主控台

  2. 啟動工作階段

  3. 若要檢查目錄下的檔案權限是否正確無誤,請執行 ls -ld 命令:

    ls -ld /home/ec2-user/

    注意:根據您的執行個體 Amazon Machine Image (AMI) 使用您的使用者名稱取代 ec2-user
    您會收到類似於下列範例的輸出:

    drwx------ 3 ec2-user ec2-user 4096 Apr  1 08:31 /home/ec2-user/

    下列範例顯示了正確的必要權限清單:
    針對 /home Linux 主目錄使用 (0755/drwxr-xr-x)
    針對 /home/ec2-user/ 使用者的主目錄使用 (0700/drwx------)
    針對 /home/ec2-user/.ssh.ssh 目錄權限使用 (0700/drwx------)
    針對 /home/ec2-user/.ssh/authorized_keys authorized_keys 檔案權限使用 (0600/-rw-------)

  4. 在本機電腦上,確認您使用的是 SSH 公開金鑰

  5. 如果輸出中沒有 SSH 公開金鑰的簽名,請更新 authorized_keys 檔案以允許您的 SSH 金鑰。執行下列命令:

    echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys

    **注意:**使用您的 SSH 公開金鑰取代範例金鑰。

  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 連線到執行個體

執行 AWSSupport-TroubleshootSSH 自動化執行手冊

使用 AWSSupport-TroubleshootSSH 來檢查並更正導致透過 SSH 遠端連線至 Linux 機器錯誤的一些問題。如需詳細資訊,請參閱我在嘗試使用 SSH 連線至 EC2 執行個體時收到錯誤。如何使用 AWSSupport-TroubleshootSSH 自動化工作流程對 SSH 連線問題進行疑難排解?

使用使用者資料指令碼修復 SSH 權限並將正確的 SSH 公開金鑰新增至 authorized_key 檔案

**重要:**若要使用此方法,您必須停止執行個體。當您停止執行個體時,會產生下列效果:

  • 如果您的執行個體由 Amazon Elastic Block Storage (Amazon EBS) 執行個體儲存體備份,或具有包含資料的執行個體儲存體磁碟區,則資料就會遺失。
  • 如果您的執行個體屬於 Amazon EC2 Auto Scaling 群組,則 Amazon EC2 Auto Scaling 可能會終止執行個體。您使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 啟動的執行個體,可能屬於 Auto Scaling 群組。此案例中的執行個體終止情況,會取決於 Auto Scaling 群組的執行個體縮減保護設定。如果執行個體屬於 Auto Scaling 群組,請先暫時從 Auto Scaling 群組中移除該執行個體,然後再完成下列步驟。
  • 執行個體的公用 IP 位址會變更。將外部流量路由至執行個體時,最佳實務是使用 Elastic IP 位址而非公用 IP 位址。

若要修復您的 SSH 權限,請完成下列步驟:

  1. 開啟 Amazon EC2 主控台

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

  3. 停止執行個體

  4. 選擇「Actions」(動作),然後選擇「Instance settings」(執行個體設定)。

  5. 選擇「Edit User Data」(編輯使用者資料)。

  6. 在「Edit user data」(編輯使用者資料) 中輸入下列使用者資料指令碼:

    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=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

  7. 選擇 Save (儲存)。

  8. 在本機電腦上,確認您使用的是 SSH 公開金鑰

  9. 如果輸出中沒有 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=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
    --//
  10. 啟動您的執行個體

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

(僅限 Ubuntu 20.x) 檢查 SSH 組態的 AuthorizedKeysCommand

在 Ubuntu 20.x 中,預設會安裝 EC2 Instance Connect。當您設定用於 SSH 身分驗證的 AuthorizedKeysCommandAuthorizedKeysCommandUser 設定時,EC2 Instance Connect 安裝不會更新這些設定。因此,您無法使用 EC2 Instance Connect。若要解決此問題,請從您的 SSH 組態中移除 AuthorizedKeysCommandAuthorizedKeysCommandUser

相關資訊

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

我遺失了我的私有金鑰。我該如何連線至我的執行個體?

如果在開始啟動執行個體後遺失 SSH 金鑰對,我該如何連線到我的 Amazon EC2 執行個體?

AWS 官方
AWS 官方已更新 4 個月前