使用 Amazon EC2 Instance Connect 建立 SSH 連線
當您執行 Amazon EC2 執行個體時,需要對其進行管理。管理遠端 Linux 主機的傳統方法是透過 SSH 連線至 Linux,並執行所需的指令、編輯設定檔等。使用者可以透過使用者名稱和密碼,或透過使用者名稱和安全金鑰,透過 SSH 登入 Linux。 然而,若要透過 SSH 連線至 EC2 執行個體,使用者僅能使用使用者名稱與安全金鑰。此政策是 AWS EC2 為提升安全性所設定的。這篇部落格文章將說明如何從執行 Windows 或 Linux 的電腦,透過 SSH 連線至執行 Linux 的 AWS 執行個體。
從 AWS 下載金鑰
當您使用 AWS 管理主控台中的精靈建立新的 EC2 執行個體時,系統會在 EC2 執行個體建立流程結束時產生一組金鑰對。金鑰對由私密金鑰和公開金鑰組成。Secure Shell (SSH) 是一種加密協定,而金鑰對則用於對連線進行非對稱加密。 公開金鑰可透過私密金鑰產生。當為 Amazon EC2 執行個體產生金鑰對時,公開金鑰會儲存於該 EC2 執行個體上安裝的 Linux 系統設定中,而私密金鑰則由使用者下載。
您必須在 Amazon EC2 執行個體建立流程的最後一步下載私密金鑰,並將金鑰儲存於安全之處。 在您下載私密金鑰之前,EC2 執行個體將不會建立。私密金鑰以 PEM 檔案形式提供。請注意,這是您下載當前 AWS EC2 執行個體金鑰的唯一機會。
我下載了私鑰,並將該金鑰儲存為 blog01-key.pem 檔案。
C透過 SSH 連線至 EC2 執行個體 使用 PuTTY
PuTTY 是一款免費的 SSH 客戶端,您可以 安裝 在 Windows 系統上。您必須先將下載的 PEM 檔案轉換為 PuTTY 支援的 PPK 檔案格式,才能透過 SSH 連線至 AWS。因此,您需要使用 PuTTY 金鑰產生器 (PuTTYgen) 工具,該工具會隨 PuTTY 透過單一安裝檔一併安裝。您也可以下載 puttygen.exe 手動。PuTTYgen 用於產生 RSA 和 DSA 金鑰。
因此,我在這台將用於連線至 EC2 執行個體的 Windows 電腦上,共有三個檔案:
blog01-key.pem
putty.exe
puttygen.exe
這些檔案的位置是"C:AWS SSH“在此範例中。
點擊以下連結開啟 PuTTY 金鑰產生器 (PuTTYgen) puttygen.exe 檔案或該檔案的捷徑。
點擊 Load 在 PuTTYgen 視窗中。
點擊"全選檔案"(*.*) 並瀏覽 PEM 檔案。我們選擇"C:AWS SSHblog01-key.pem“。然後點擊 Open.
請閱讀顯示的公告,然後按下 OK.
現在您可以在 PuTTYgen 的視窗中看到您的公開金鑰字串。請使用如下圖所示的設定。
要建立的金鑰類型: RSA
生成的金鑰位元數: 2048 點擊此處
Save private key.
您確定要將此金鑰儲存起來,而不使用密碼短語來保護它嗎?
點擊 Yes 如果您同意。如果您不同意,請返回並使用密碼短語保護金鑰。
請將私鑰儲存至安全的位置。我將該金鑰儲存為"C:AWS SSHAWS EC2 SSH.ppk"。點擊 Save.
H如何透過 SSH 連線至 EC2 執行個體 來自 Windows
請檢查您的 AWS EC2 執行個體的公開 IP 位址。執行個體必須處於"執行中"狀態,才會擁有公開 IP 位址。以我的情況為例,公開 IP 位址是 52.55.222.44. 我將使用這個 IP 位址透過 SSH 連線至 AWS。
在 Windows 中開啟 PuTTY。執行 putty.exe 或使用相應的快捷鍵。
前往 SSH > Auth.
點擊 Browse 並選取 PPK 檔案(私密金鑰)。我選取"C:AWS SSHAWS EC2 SSH.ppk” 先前在 PuTTYgen 中生成的檔案。
返回 Session 在 PuTTY 中開啟終端機,並在 主機名稱 (或 IP 位址) 欄位。請確認連線類型為 SSH. 我輸入 52.55.222.44,這是我從 EC2 管理主控台複製下來的 EC2 執行個體 IP 位址。已選取 TCP 埠 22。按下 Open.
顯示安全警示。請閱讀訊息並按下 Accept 繼續並連線至 EC2 執行個體。當您首次連線至特定遠端機器時,系統會顯示此對話方塊。訊息中顯示的指紋必須與該 EC2 執行個體的指紋相符。
請在主控台視窗中輸入使用者名稱。由於我在 EC2 執行個體上使用 Ubuntu Linux,因此我使用 ubuntu, 這是從相應的 Amazon 機器映像 (AMI) 部署此實例時所設定的預設使用者名稱。
AWS 中不同類型 Linux AMI 的預設使用者名稱:
- Amazon Linux 2 或 Amazon Linux AMI: ec2-user
- CentOS: CentOS 或 ec2-user
- Debian: 管理員
- Fedora: Fedora 或 ec2-user
- Red Hat Enterprise Linux (RHEL): ec2-user 或 根
- SUSE: ec2-user 或 根
- Ubuntu: Ubuntu
- Oracle: ec2-user
- Bitnami: Bitnami
一旦看到 Linux 命令列介面(此處為 bash),您即可在 AWS 上運行的遠端 Linux 機器上執行指令。這表示您已在 PuTTY 中設定了正確的 AWS EC2 SSH 設定。
透過 SSH 將檔案傳輸至 Amazon EC2 執行個體
我已設定好透過 SSH 遠端存取 AWS EC2 執行個體,現在可以透過 SSH 連線至 AWS 執行個體,執行指令、編輯設定等。不過,您可能也需要透過 SSH 將檔案從 Windows 電腦傳輸至 AWS 執行個體,或是反向傳輸。 有幾種透過 SSH 運作的檔案傳輸協定,可安全地在不同機器間傳輸檔案,例如安全檔案傳輸協定 (SFTP) 和安全複製協定 (SCP)。
若要從 Windows 透過 SSH 將檔案傳輸至 AWS 執行個體,您可以使用 WinSCP,這是一款適用於 Windows 的免費工具。請注意, scp 必須安裝在 AWS 上運行的遠端 Linux 機器上。
在 Windows 機器上安裝 WinSCP 後,請執行該應用程式。
選擇 SFTP 作為檔案傳輸協定,並在 主機名稱 在該欄位中輸入您欲透過 SSH 連線以傳輸檔案的 EC2 執行個體之公開 IP 位址。輸入 EC2 執行個體的使用者名稱。我使用 52.55.222.44 作為 IP 位址以及 Ubuntu 請將此作為我範例中的使用者名稱。
點擊 Advanced 在 WinSCP 的主視窗中。
前往 SSH > Authentication 在 進階網站設定 視窗。點擊 … 在 驗證參數 區段,並選取您先前在 PuTTYgen 中生成的私密金鑰。以我為例,我選擇"C:AWS SSHAWS EC2 SSH.ppk"。點擊 OK 儲存設定並返回 WinSCP 的主視窗。
點擊 Login 在 WinSCP 的主視窗中。
與首次透過 PuTTY 連線至 EC2 執行個體時一樣,此時會出現一則警告訊息。按下 Yes 繼續。
如果 AWS EC2 的 SSH 設定正確,且您已在 WinSCP 中成功設定 SSH 連線參數,您將看到一個採用命令列風格、分為兩個窗格的視窗。左側窗格顯示本地 Windows 電腦的用戶資料夾,右側窗格則顯示在 AWS 上運行的 Linux 系統的用戶主目錄。您可以將檔案從一個窗格拖曳至另一個窗格,並在本地和遠端電腦上執行複製、重新命名或刪除檔案等操作。
從 Linux 透過 SSH 連線至 AWS
與 Windows 不同,Linux 內建 SSH 客戶端。在您本機 Linux 電腦的終端機中,請使用類似以下的指令,透過 SSH 連線至執行 Linux 的 AWS EC2 執行個體:
ssh -i file_name.pem ubuntu@ip_address
前往存放您的私密金鑰的目錄 .pem 檔案的位置在 Linux 系統上。在此範例中,我使用 Ubuntu,並且我下載了 blog01-key.pem 檔案至 ~/下載/.
cd ~/Downloads/
ssh -i blog01-key.pem ubuntu@52.55.222.44
在哪裡 Ubuntu 是遠端 Linux 機器上的使用者名稱,以及 52.55.222.44 是遠端 Linux 主機的 IP 位址。
若您現在執行此指令,將會出現以下錯誤:
警告:未受保護的私鑰檔案。
"blog01-key.pem"的權限設定過於寬鬆。
請務必確保您的私密金鑰不會被他人取得。
此私鑰將被忽略。載入金鑰:pad 權限。
權限遭拒 (公開金鑰).
基於安全考量,您需要設定較低(更嚴格)的權限。
chmod 400 ./blog-key.pem
使用 400 如果密鑰必須僅限您自己讀取。
使用 600 如果您需要讓這些金鑰對您具有讀寫權限。
現在,您可以透過以下指令,從您的 Linux 電腦透過 SSH 連線至 AWS EC2 執行個體:
ssh -i blog01-key.pem ubuntu@52.55.222.44
目前我已透過 SSH 連線至 Amazon EC2 執行個體。
透過 SSH 在 Linux 系統上將檔案傳輸至 Amazon EC2
您也可以透過 Linux 中的 SCP,利用 SSH 將檔案傳輸至 AWS 執行個體。請確保您已從本機 Linux 電腦成功建立與遠端 Linux 執行個體的 AWS SSH 連線。接著,在本機 Linux 電腦上開啟新的控制台,並使用類似以下的指令連線至 EC2 執行個體:
scp -i /path/key_name.pem /path/file_name.txt user_name@ec2_instance_IP_address:/path_to_file
在我的範例中,我使用以下指令:
scp -i ~/Downloads/blog01-key.pem ~/Downloads/file.txt ubuntu@52.55.222.44:/home/ubuntu
已成功透過 SSH 將檔案傳輸至 AWS 執行個體。
若要將檔案反向複製(從 AWS EC2 上的 Linux 系統複製到您的本地 Linux 電腦),請使用類似以下的指令:
scp -i /path/key_name.pem user_name@ec2_instance_IP_address:/path_to_file/my-file.txt path/my-file2.txt
就我而言,我使用的是以下指令:
scp -i ~/Downloads/blog01-key.pem ubuntu@52.55.222.44:/home/ubuntu/file1.txt ~/Downloads/file1-copy.txt
如螢幕截圖所示,檔案已成功複製。您可以將重要的檔案從 Amazon EC2 執行個體複製到所需的本地電腦,並對這些檔案進行備份。執行 AWS EC2 備份 定期備份,以避免資料遺失。
如何為 AWS 執行個體新增金鑰
在建立 AWS EC2 執行個體後,您可以為現有的 EC2 執行個體建立額外的金鑰對,以便透過 SSH 連線至 AWS 執行個體。 您可能需要執行此操作,以便為其他使用者提供對 EC2 執行個體的 SSH 存取權限。當您認為使用者無需透過 SSH 連線至 AWS 執行個體時,您可以從在 AWS EC2 上運行的 Linux 機器中刪除公開金鑰,而無需重新建立新金鑰來取代執行個體建立時所產生的金鑰。
在 AWS 管理主控台中開啟 EC2 管理主控台。
前往 Network & Security 在導覽窗格中,然後按一下 Key Pairs.
此頁面會顯示所有現有的金鑰對。您可以在搜尋欄位中輸入現有金鑰對名稱的一部分,以尋找該金鑰對。
點擊 Create key pair 點擊網頁介面右上角的按鈕,為現有的 EC2 執行個體建立新的金鑰對。
選擇 .pem 若需在 Linux 系統中搭配 OpenSSH 使用金鑰,請選擇此私密金鑰格式;若需在 Windows 系統中搭配 PuTTY 使用金鑰,則請選擇 .ppk。由於我將使用本地端的 Linux 電腦,透過 SSH 並使用新金鑰連線至 AWS EC2 執行個體,因此我選擇 .pem 關鍵選項。如有需要,您可以添加標籤。點擊 Create key pair 準備好繼續時。
請將下載的檔案儲存於安全的地方。以我為例,下載檔案的名稱為 blog02-temp.pem 然後我將這個檔案儲存到 下載 位於使用者主目錄中的目錄。
從新的金鑰對中擷取公鑰
我們已在 AWS 管理主控台的網頁介面中產生了一組新的金鑰對。現在,我們需要使用從下載檔案中取得的私密金鑰來產生公開金鑰 .pem 檔案:
請使用此格式的指令:
ssh-keygen -y -f /path_to_key_pair/my-key-pair.pem
就我而言,指令是:
ssh-keygen -y -f ~/Downloads/blog02-temp.pem
如果出現錯誤,請設定正確的權限:
chmod 400 ~/Downloads/blog02-temp.pem
如果一切正確,主控台輸出中會顯示一個生成的公鑰。
複製生成的金鑰字串,並將此資訊儲存於安全的位置。在此範例中,我將金鑰字串儲存至文字檔案中。
將金鑰字串複製到剪貼簿。
依照本文前文所述,從您的本地 Linux 電腦透過 SSH 連線至 EC2 執行個體。
我們位於位置 /home/Ubuntu/ 現在。
使用文字編輯器開啟儲存透過 SSH 存取 EC2 執行個體所需公開金鑰的設定檔:
nano ~/.ssh/authorized_keys
此設定檔的完整路徑取決於所使用的 Linux Amazon 機器映像 (AMI),可能為:
/home/ubuntu/.ssh/authorized_keys
/home/ec2-user/.ssh/authorized_keys
/root/.ssh/authorized_keys
將剪貼板中的金鑰貼到此設定檔的第二行。
儲存變更並關閉檔案。
在確認您新增的第二把金鑰確實有效之前,請勿關閉用於連線至 EC2 執行個體的當前 SSH 工作階段。否則,若設定有誤,您可能會失去 SSH 連線,進而無法透過 SSH 連線至 AWS 執行個體。萬一發生錯誤,請勿讓自己被鎖在系統外!
在您的本地 Linux 機器上開啟另一個終端機,並嘗試使用新金鑰連線至該執行個體。 我前往存放我的 .pem 金鑰檔案的位置。
cd ~/Downloads/
請在新的控制台中,從您的本地 Linux 電腦連線至 AWS 上運行 Linux 的 EC2 執行個體,方法是定義新的私密金鑰 (blog02-temp.pem (在此情況下)。
ssh -i blog02-temp.pem ubuntu@52.55.222.44
已成功使用新金鑰建立 AWS SSH 連線。現在您可以傳送新金鑰(blog02-temp.pem) 給需要建立 AWS SSH 連線的使用者。當您需要停用該使用者對此 AWS EC2 執行個體的 SSH 存取權限時,請從 .ssh/authorized_keys 在您於 AWS EC2 上運行的遠端 Linux 執行個體上。由於使用這兩組金鑰(第一組是建立 EC2 執行個體時產生的,第二組是您先前為其他使用者連線至 AWS EC2 而建立的)進行的 AWS SSH 設定運作正常,您可以關閉 SSH 終端機視窗。
如果您在 Network & Security > Key pairs 從 EC2 管理主控台(即我們在 AWS 管理主控台的網頁介面中建立第二把金鑰的位置)來看,該特定 EC2 執行個體內的金鑰並不會被刪除。
若遺失 AWS EC2 SSH 金鑰該怎麼辦
如果您遺失了用於連線至 AWS EC2 執行個體的私密金鑰(該金鑰是在建立新 EC2 執行個體時所產生),您將無法再連線至該執行個體。您無法產生新的金鑰,並將新金鑰插入當前 EC2 執行個體中的 AWS SSH 設定檔中。在此情況下,您可以使用一個您具有 SSH 存取權限的臨時 EC2 執行個體。請嘗試以下工作流程,以恢復對該執行個體的 AWS EC2 SSH 存取權限。
- 停止原始的 EC2 執行個體,您已遺失對應的 AWS SSH 私密金鑰。
- 檢查附加至 EC2 執行個體的 EBS 儲存卷資訊。您需要找出那個已掛載至 Linux 系統根目錄 (/) 的 EBS 儲存卷。請記下此 EBS 儲存卷的識別碼。
- 在 AWS EC2 上啟動一個臨時執行個體。您可以使用與原始機器上安裝的 Linux 發行版相同的執行個體(同類型的 AMI)。
- 在 AWS 管理主控台中產生一組用於連線至 AWS 的新金鑰對。請儲存私密金鑰並備妥公開金鑰。您需要產生公開金鑰的金鑰字串,以便修復原始執行個體所使用的根磁碟區中儲存的 AWS SSH 設定。
- 在運行於臨時 EC2 執行個體上的 Linux 系統中建立一個目錄,並將包含原始 EC2 執行個體根目錄 / 分區的 EBS 卷掛載至該臨時 EC2 執行個體。請根據您先前記錄的卷 ID 來確定所需的 EBS 卷的位置。
- 開啟 AWS SSH 金鑰設定檔(該檔案原本位於類似 /home/Ubuntu/.ssh/authorized_keys 的位置中)。實際路徑會因您將原始 EC2 執行個體的根分割區掛載至何處而有所不同。請將新公開金鑰的金鑰字串新增至 AWS SSH 金鑰設定檔中。
- 請卸載原始 EC2 執行個體所使用的 EBS 卷,該卷目前已掛載至臨時 EC2 執行個體上。
- 將包含已更新 AWS SSH 金鑰設定檔的 EBS 卷掛載回原始的 EC2 執行個體。
- 啟動原始的 EC2 執行個體,並使用新的金鑰對透過 SSH 連線至此執行個體。
使用 EC2 Instance Connect
金鑰管理是 AWS 管理的重要環節,因為您需要將用於存取 EC2 執行個體的 AWS EC2 SSH 金鑰妥善保管於安全之處,並防止其遺失。 當使用者數量龐大時,為其他使用者建立和刪除臨時存取所需的金鑰,可能會成為例行性工作。因此,Amazon 提供了透過 Amazon EC2 Instance Connect 經由 SSH 連線至 Amazon EC2 執行個體的功能。此特點可讓您自動化連線至 Amazon EC2 執行個體的 SSH 金鑰管理。
使用 EC2 Instance Connect 的概念在於建立身分 & 透過存取管理 (IAM) 政策,可集中控制對 EC2 執行個體的 AWS SSH 存取權限,無需手動管理(建立、分享、刪除)SSH 金鑰。 最後,使用者可透過 SSH 客戶端、Amazon EC2 控制台的瀏覽器版客戶端,或 Amazon EC2 Instance Connect CLI 來連線至 Amazon EC2 執行個體。
Amazon Instance Connect API 會將一個僅限使用一次的公開 SSH 金鑰推送至執行個體的元資料中,有效期為 60 秒。 與 IAM 使用者關聯的 IAM 政策會授權該使用者。使用者必須在 60 秒內使用此金鑰連線至 EC2 執行個體。金鑰過期後,必須使用新的金鑰。
Amazon Instance Connect 支援安裝了 Ubuntu 16(或更高版本)及 Amazon Linux 2 的 EC2 執行個體。Amazon Instance Connect 必須安裝在 EC2 Linux 執行個體上。 另一項先決條件是在 AWS 環境中運行的遠端 Linux 機器上安裝 AWS CLI。
安裝完成後,EC2 Instance Connect 會執行一個腳本,將資料寫入 SSH 伺服器守護程式的配置檔案(/etc/ssh/sshd_config)中的以下參數:
AuthorizedKeysCommand
授權金鑰命令使用者
更新後的 AuthorizedKeysCommand 此設定用於從 EC2 執行個體的元資料中讀取公開的 AWS EC2 SSH 金鑰。若這些參數已輸入自訂值,Instance Connect 不會更新(覆寫)這些值,但在此情況下您將無法使用此特點。
您需要建立一個 JSON 格式的設定檔。開啟 IAM 控制台,然後前往"政策"並點選"建立政策"。此外,您也可以在已安裝 AWS CLI 的 Linux 機器上使用命令列介面。以下為設定範例。此政策可透過實例 ID 識別實例,以授予存取權限。
{
"Version": "2021-10-17",
"Statcodeent": [
{
"Effect": "Allow",
"Action": "ec2-instance-connect:SendSSHPublicKey",
"Resource": [
"arn:aws:ec2:region:account-id:instance/i-00000000000000000",
"arn:aws:ec2:region:account-id:instance/i-00000000000000001"
],
"Condition": {
"StringEquals": {
"ec2:osuser": "ami-username"
}
}
},
{
"Effect": "Allow",
"Action": "ec2:DescribeInstances",
"Resource": "*"
}
]
}
接著必須啟用該政策。用於啟用政策的 AWS CLI 指令大致如下:
aws iam create-policy --policy-name my-policy --policy-document file://JSON-file-name
您可以將已啟用的政策指派給相應的使用者。
aws iam attach-user-policy --policy-arn arn:aws:iam::account-id:policy/my-policy --user-name IAM-friendly-name
若要連線至 Amazon EC2 執行個體 EC2 控制台,選取所需的 EC2 執行個體,然後按下 Connect 按鈕。在 連線至執行個體 頁面,選取 EC2 Instance Connect tab 並點擊 Connect.
結論
透過 SSH 連線至 AWS EC2 執行個體,是 AWS EC2 管理流程中的重要環節。這篇部落格文章說明了如何進行 AWS EC2 SSH 設定,以及如何從本地的 Linux 和 Windows 電腦連線至執行 Linux 的 AWS EC2 執行個體。必須使用金鑰對來建立與 EC2 執行個體的 SSH 連線。 公開金鑰儲存於 AWS EC2 上運行的 Linux 系統設定中,而私有金鑰則由安裝在使用者電腦上的本地 SSH 客戶端使用。請將金鑰存放在安全處,並定期備份,以避免造成資料、時間及成本的損失。






























