連線至 EC2 的三種方法與比較 – SSH、EC2 Instance Connect、System Manager
前言
遠端連線提供使用者由遠端透過文字或圖形介面的方式來登入系統, 讓你在遠端的工作機前面登入 Linux 主機以取得可操控主機之介面 (shell),而登入後的操作感覺上就像坐在系統前面一樣,使用者往往會因為某些原因,像是設置系統的記錄檔(log)、除錯或做一些細部的調校而從遠端連入主機當中。
隨著雲端產業的興起,遠端連線卻成了我們與這些看不到在哪的虛擬機唯一的溝通方式,而這也是我們此篇文章所要探討的主題。
我們將從最原始的 SSH 連線開始,並帶大家認識 AWS 所提供的遠端連線方式:EC2 Instance Connect 與 System Manager – Session Manager,並會針對兩者進行深入的探討與比較。
SSH 連線
SSH 連線是目前最廣泛使用的 Linux 主機的遠端連線方式。它是於 1995 年被制定的通訊協定,是一個建立在應用層和傳輸層基礎上的安全協定,而目前預設會被安裝在所有 Linux 主機上。
如何設置
當我們在 EC2 主控台中創建好執行個體後,我們便可以利用 SSH 來連入這台機器當中。
使用 SSH 連線有幾個基本條件:
-
-
記下 EC2 的公開 DNS 名稱
-
打開 SSH TCP/22 Port
-
準備好金鑰 (金鑰會於創建執行個體最後一步時要求使用者創建或使用現有的金鑰作為連線依據)
-
-
打開電腦的終端機,使用 ssh 指令來連線。
- 在此需要注意金鑰的權限以及路徑位置是否正確。
ssh -i /path/my-key-pair.pem ec2-user@ec2-xx-xx-xx-xx.compute-1.amazonaws.com
-
(IPv6) 倘若使用 IPv6 的話則要使用此指令。(基本上和 IPv4 大同小異)
ssh -i /path/my-key-pair.pem ec2-user@2001:db8:1234:1a00:9691:9503:25ad:1761
-
當我們輸入完指令後便會收到訊息,如下圖:
- 輸入
yes
後就能夠成功連線至主機內了。
以上就是最基本的 SSH 連線至 EC2 主機的方式。
EC2 Instance Connect
AWS 在 2019/06 月底時更新了一個更簡易的 SSH 遠端連線至 EC2 的新方式:EC2 Instance Connect,主打無需維護金鑰,可直接透過 EC2 主控台或指令(CLI)連線至 EC2 執行個體,並能夠輕鬆的透過 IAM 政策(Policy)來做權限控管。 這對常常使用 SSH 的使用者來說是一大福音,最大的好處莫過於不需要再管理眾多的金鑰了。 但此功能仍然有些待改善之處:因為是新功能,所以目前支援的 AMI 類型只有 Amazon Linux 2 以及 Ubuntu 16.04 以後的版本(含),但官方也承諾未來會持續新增支援的種類。
如何設置
想要使用此方法需要一些前置作業,在第一次使用的時候我們必須要先通過原本 SSH 的方法連入該台主機,並在主機中下載 Instance Connect 於機器中,接著於 IAM 中設定好權限並給予此主機。此後便能不用金鑰就從 EC2 主控台或於終端機中下指令迅速連入主機。
-
第一次的設置仍需要使用原先 SSH 連線,所以我們仍然需要先完成 SSH 連線的事前準備,主要包含三個項目:
- 確認該主機的相關資訊,例如:Public IP 等。
- 準備好該主機的金鑰。
- 確認網路流量設定
確保流入的流量設定(Inbound)中 SSH 的 22 埠是開啟的,並允許你的 IP 位址進入。
-
當我們連線進入主機後,就可以下指令安裝 Instance Connect 了。
-
__主機為 Amazon Linux 2:__
sudo yum install ec2-instance-connect
-
__主機為 Ubuntu:__
sudo apt-get install ec2-instance-connect
基本上 Amazon Linux 2 2.0.20190618 以後推出的 AMI 類型都有內建 Instance Connect,至於其他的支援的類型則需要手動連入安裝。 但在此我們仍然會連入主機並嘗試再次安裝 (應該會收到
Nothing to do
的回應,表示已經有安裝了)。注意:倘若先前有針對此主機設置
AuthorizedKeysCommand
和AuthorizedKeysCommandUser
等相關 SSH 授權的話,會因為下載 Instance Connect 後不會更動此設定,需要使用者手動更改或取消否則會導致無法使用 Instance Connect。 -
-
(Optional) 於本機端安裝 Instnace Connect CLI。
pip install ec2instanceconnectcli
Instnace Connect CLI 主要是提供非介面使用者能夠查詢這些 EC2 執行個體的資訊、產生並匯出暫時的公鑰、並與主機進行連線等相關指令。
-
確認主機是否有安裝 Instance Connect 後便能結束連線,接著要賦予使用者能夠推送 SSH 公鑰的權限。
-
切換到 IAM 主控台中設定 IAM 政策,並設定權限如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2-instance-connect:SendSSHPublicKey"
],
"Resource": [
"arn:aws:ec2:Your-Region-1:ACCOUNTID:instance/*"
],
"Condition": {
"StringEquals": {
"ec2:osuser": "ec2-user"
}
}
}
]
}
讀者只需要修改 Your-Region-1
與 ACCOUNTID
便能完成權限的設置。
-
當 IAM 政策創建完成,我們只需要將此政策給予 IAM 使用者或 IAM 群組便能完成權限配給。
使用此方法我們就能夠針對特定使用者給予使用 Instance Connect 連線至主機的權限。
-
接下來我們便可以進到 EC2 主控台進行測試,選擇該主機後點選 Connect。
- 有別於以往使用 SSH,這次我們點選 EC2 Instance Connect,並直接選擇 Connect。
- Instacne Connect 會透過 Web SSH 連線至主機。
-
(Optional)如果剛剛有下載 Instance Connect CLI 的話可以於本機終端機下指令:
使用者只需要打上該主機的 ID 便能迅速連線。mssh i-003234a4bf40dec41EXAMPLE
以上就是使用 Instance Connect 連線至 EC2 主機的方式。
運作方式
-
會先於用戶端產生一組公私鑰。
-
並將公鑰透過 API (SendSSHPublicKey) 推送至該主機。
-
Instnace Connect 會將此公鑰存於該主機的中繼資料(Metadata)中。
該公鑰的存活期限只有 60 秒,一但超過就會過期。 -
該主機內的 Instance Connect agent 會擷取這把公鑰。
-
並讓用戶端與該主機透過 SSH 連線。
-
這些連線紀錄都會被 CloudTrail 擷取並記錄。
System Manager – Session Manager
Session Manager 是 System Manager 服務中的其中一項功能,能夠讓使用者透過主控台或指令迅速的與 EC2 主機進行連線。與上述不同的是此種方法的連線方式並非使用 SSH,而是走 HTTPS 協定,也就是說網路設定會不太一樣,會在下文中詳細介紹。
此方法支援的 AMI 種類較多:
-
Amazon Linux 2、Linux
-
Ubuntu 18.04、16.04
-
Windows Server 2008 R2 ~ 2016
-
地端主機或虛擬機 (需要安裝 SSM agent)
如何設置
-
基本上所有的 Amazon Linux 的 EC2 主機皆以安裝 SSM agent,所以我們唯一需要做的是創建 IAM 角色 (Role),讓該主機擁有使用 System Manager 的權限。
可以直接使用內建的政策:
AmazonSSMManagedInstanceCore
來建立 IAM 角色。 -
將此 IAM 角色給予該主機。
賦予主機權限有兩種方式:- 在創建主機時(選擇 IAM 角色)。
- 若要將 IAM 角色給予已創建好的主機時,該主機必須為
Running
的狀態。
-
進入 System Manager 中的 Session Manager 功能,便會看到目前此 AWS 帳號中所有能夠使用 Session Manager 連線的主機(所有被賦予 IAM 角色的主機)。
- 選擇欲連線的主機後直接選擇 Start Session,便會開啟新視窗作為 Shell 連線至該主機。
運作方式
-
IAM 會授權該主機使用 System Manager – Session Manager 的權限。
-
使用者使用 AWS 主控台或指令發起連線至主機。
-
該主機中的 SSM agent 會自動與 System Manager 連線。
因此該主機必須要有網路連線能力。
-
使用者可以在 CloudWatch Logs 與 CloudTrail 中查看記錄檔,並可以指定 S3 作為記錄檔的儲存位置。
總結
當我們提到遠端連線至 Linux 主機的方法大多都會提到 SSH,你可能會針對不同的角色、部門與應用而有不同的金鑰,但這對管理者在管理金鑰上是一個非常大的難題。也有一些人選擇使用 Bastion (堡壘機) 來作為跳板機連入主機,方法雖然安全可行,但除了金鑰管理的問題外,管理人仍需要維護這台 Bastion 並設定好路由。
而 EC2 Instance Connect 提供可以替代複雜 SSH 金鑰管理的方法。 通過 整合 IAM,管理者可以使用安全的方式來分發短期金鑰並通過 IAM 策略控制權限,而無需再親自管理這些金鑰,這無疑對管理者來說是一大福音。再者,EC2 Instance Connect 也會自動將這些連線行為記錄在 CloudTrail 中,無論是對於安全性或者合規(稽核)方面來說都是很實用的一項功能。說完了優點後還是得聊聊一些美中不足的地方,因為是新功能,所以目前 支援的 EC2 類型並不多,再加上仍然是使用 SSH 連線所以需要顧及 EC2 執行個體的網路環境設定,也就是說使用者無法將這台目標主機放置在私有子網當中。但 Instance Connect 可以解決 Session Manager 的問題。
所以當某些場景下,使用者一定得把主機放在私有子網又不想使用 Bastion 連線,就推薦使用 System Manager – Session Manager 作為連線手段,因為可以使用 AWS PrivateLink 作為連線手段與私有子網內的機器溝通 (可以想像成打一條專屬的通道連接彼此之間)。使用者如果連線目標是自己地端的主機的話就只能用 Session Manager,只需要安裝 SSM agent 與一些基本設定,就可以透過 HTTPS 安全的與主機溝通 (如果雲端主機不用 PrivateLink 的話也是走 HTTPS)。
而使用 Session Manager 的所有連線也都會被 CloudWatch Logs 與 CloudTrail 所記錄下來,更可以指定這些資料的存放位置 (S3)。
最後針對 Instance Connect 與 Session Manager 之間的差異性:
-
相似處:
-
兩者皆與 IAM 服務進行整合,做權限控管 (IAM 政策取代金鑰)。
-
兩者皆不需要開啟堡壘主機與管理金鑰。
-
兩者皆提供了完善的稽核機制:
Instance Connect:CloudTrail
Session Manager:CloudTrail, CloudWatch Logs
-
-
相異處:
-
兩者連線的協定不同:
Instance Connect:SSH (22)
Session Manager:HTTPS (443)
(僅有 Session Manager 支援 AWS PrivateLink 進行私有連線) -
兩者使用情景不同:
Instance Connect:快速連線 Linux 2 與 Ubuntu 16.04 並允許開啟 TCP/22 port 的主機。
Session Manager:快速連線地端主機、虛擬機就一定得使用此方法。
-
使用者最終還是得根據自己的需求,選擇一個最適當的遠端連線方式。 而 AWS 仍在持續改善這兩種連線方式,目的就是為了讓使用者擁有更好的體驗。