跳至內容

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

3 分的閱讀內容
0

我想連接至我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,但我遺失了 SSH 金鑰對。

簡短描述

若要在遺失 SSH 金鑰對時連線到 EC2 執行個體,請使用下列其中一種方法:

  • 輸入使用者資料以建立新的金鑰對。
  • 對於受管節點的執行個體,請使用 AWS Systems Manager 來復原金鑰對。
  • 對於執行 Amazon Linux 2 (AL2) 版本 2.0.20190618 及更新版本或 Amazon Linux 2023 (AL2023) 的執行個體,請使用 EC2 Instance Connect。
  • 如果您可連接執行個體且可存取 EC2 序列主控台,請使用序列主控台。
    **注意:**此方法不需要您停止並啟動執行個體。
  • 建立救援執行個體來建立新的公有金鑰。

**重要:**在停止和啟動執行個體之前,請執行下列動作:

**注意:**當您停止和啟動執行個體時,該執行個體的公有 IP 位址也會變更。最佳做法是使用彈性 IP 位址而不是公用 IP 位址,將外部流量路由到執行個體。

解決方法

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

輸入使用者資料指令碼

**重要:**請勿在使用者資料指令碼中儲存敏感資料。請改用安全的方法,例如 AWS Secrets Manager

如果您的執行個體無法存取 cloud-init 或您遇到 cloud-init 問題,請繼續使用救援執行個體

建立新的金鑰對

請完成下列步驟:

  1. 建立新的金鑰對
  2. 如果您在 Amazon EC2 主控台上建立私有金鑰,請擷取金鑰對的公有金鑰
  3. 開啟 Amazon EC2 console (Amazon EC2 主控台)。
  4. 停止您的執行個體
  5. 選擇 Actions (動作),然後選擇 Instance settings (執行個體設定)。
  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:
    - [users-groups, once]
    users:
    - name: username
    ssh-authorized-keys:
    - PublicKeypair
    **注意:**將 username 替換為預設使用者名稱或先前建立的自訂使用者名稱。將 PublicKeypair 替換為公有金鑰。輸入完整公有金鑰時,以 ssh-rsa 開頭。
  7. 選擇 Save (儲存)。
  8. 啟動您的執行個體

確認 cloud-init 階段已完成

執行個體主控台輸出中,檢查以下因素以確保 cloud-init 階段已完成:

  • 沒有錯誤訊息。
  • 所有 cloud-init 命令均列為已執行
  • 您有看到 cloud-init 的完成訊息,其類似以下範例: 「Finished [0;1;39mCloud-init: Final Stage[0m Cloud-init v.A.B.C finished at ..」。

從執行個體的使用者資料中移除命令

請完成下列步驟:

  1. 停止您的執行個體
  2. 選擇 Actions (動作),然後選擇 Instance settings (執行個體設定)。
  3. 選擇 Edit user data (編輯使用者資料),然後清除欄位中的所有內容。
  4. 選擇 Save (儲存)。
  5. 啟動您的執行個體

使用 Systems Manager

若要復原 Systems Manager 中的受管節點執行個體,請使用 AWSSupport-ResetAccess 執行手冊來復原金鑰對AWSSupport-ResetAccess 會使用 EC2Rescue,自動在執行個體上產生並新增新的 SSH 金鑰對。

Systems Manager 會將您執行個體的新 SSH 私有金鑰加密並儲存在 Parameter Store (AWS Systems Manager 的一項功能) 中,格式為 /ec2rl/openssh/instance_id/key

若要從 Parameter Store 取得私有 SSH 金鑰,請執行 get-parameters AWS CLI 命令:

aws ssm get-parameters --names "/ec2rl/openssh/instance_id/key" --with-decryption --output json --query  "Parameters[0].Value" | sed 's:\\n:\n:g; s:^"::; s:"$::' >  key-pair-name

**注意:**將 instance_id 替換為您的執行個體 ID,將 key-pair-name 替換為您金鑰對的名稱。

然後,使用參數的值作為內容,建立一個新的 .pem 檔案。使用該 .pem 檔案重新連線至無法存取的執行個體。

若要將私有金鑰轉換為 .pem 檔案,請執行以下命令:

ssh-keygen -f key-pair-name -e -m pem > key-pair-name.pem

**注意:**將 key-pair-name 替換為您金鑰對的名稱。

自動化執行手冊會建立一個由密碼啟動的備份 Amazon Machine Image (AMI)。Amazon EC2 不會自動刪除新的 AMI,因此其會保留在您的 AWS 帳戶中。

若要找到 AMI,請完成以下步驟:

  1. 開啟 Amazon EC2 console (Amazon EC2 主控台)。
  2. 選擇 AMIs
  3. 在搜尋欄位中輸入自動化 ID。

使用 EC2 Instance Connect

若要連線至 Amazon Linux 執行個體,請參閱使用 EC2 Instance Connect 連線至 Linux 執行個體

使用 EC2 序列主控台

如果您可以存取 Linux 的 EC2 序列主控台,請使用該主控台對支援的 Nitro 型執行個體類型進行疑難排解。如需詳細資訊,請參閱設定 EC2 序列主控台的存取權

使用救援執行個體

請完成下列步驟:

  1. 停止執行個體

  2. 將根 EBS 磁碟區與執行個體分離

  3. 在與原始執行個體相同的可用性區域中啟動救援執行個體

  4. 將原始執行個體的根磁碟區作為次要磁碟區附加到救援執行個體

  5. 啟動救援執行個體

  6. 若要取得根磁碟區裝置名稱,請執行下列命令:

    sudo lsblk -f

    輸出範例:

    NAME FSTYPE LABEL UUID MOUNTPOINT
    xvda └─xvda1 xfs 1234abcd-56ef-78gh-90ij-1234klmnopqr /
     xvdf └─xvdf1 xfs abcd1234-ef56-gh78-ij90-qr1234klmnop
  7. 若要將附加磁碟區掛載到救援執行個體,請執行下列命令:

    sudo mkdir /mnt/target
    sudo mount /dev/xvdf1 /mnt/target

    **注意:**將 /dev/xvdf1 替換為原始執行個體的根磁碟區裝置名稱。

  8. 若要建立新的公有金鑰,請執行以下命令:

    sudo mkdir -p /mnt/target/home/USER/.ssh
    echo "your_new_public_key" | sudo tee -a /mnt/target/home/USER/.ssh/authorized_keys

    **注意:**將 USER 替換為原始執行個體的使用者名稱,並將 your_new_public_key 替換為您的公有金鑰。公有金鑰名稱以 ssh-rsa 開頭。

  9. 若要設定對執行個體中金鑰的存取權,請執行以下命令:

    OS_USER=os-user
    sudo chown -R $OS_USER:$OS_USER /mnt/target/home/$OS_USER/.ssh
    sudo chmod 700 /mnt/target/home/$OS_USER/.ssh
    sudo chmod 600 /mnt/target/home/$OS_USER/.ssh/authorized_keys

    **注意:**將 os-user 替換為與啟動執行個體的 AMI 相關聯的使用者名稱

  10. 若要卸載磁碟區,請執行以下命令:

sudo umount /mnt/target
  1. 將磁碟區從救援執行個體中分離,然後將其重新附加到原始執行個體
  2. 啟動原始執行個體