本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Session Manager 和 Amazon EC2 Instance Connect 存取堡壘主機
由 Piotr Chotkowski (AWS) 和 Witold Kowalik (AWS) 建立
Summary
堡壘主機有時稱為跳轉方塊,是一種伺服器,可提供從外部網路到私有網路中資源的單一存取點。向網際網路等外部公有網路公開的伺服器,會對未經授權的存取造成潛在的安全風險。請務必保護和控制對這些伺服器的存取。
此模式說明如何使用 Session Manager 和 Amazon EC2 Instance Connect 安全地連線至 AWS 帳戶中部署的 Amazon Elastic Compute Cloud (Amazon EC2) 堡壘主機。Session Manager 是 AWS Systems Manager 的功能。此模式的優點包括:
已部署的堡壘主機沒有任何開放的傳入連接埠,會公開至公有網際網路。這可減少潛在的攻擊面。
您不需要在 AWS 帳戶中存放和維護長期 Secure Shell (SSH) 金鑰。反之,每個使用者每次連接到堡壘主機時都會產生新的 SSH 金鑰對。連接至使用者 AWS 登入資料之 AWS Identity and Access Management (IAM) 政策控制對堡壘主機的存取。
目標對象
此模式適用於對 Amazon EC2、Amazon Virtual Private Cloud (VPC) 和 Hashicorp Terraform 有基本了解的讀者。
先決條件和限制
先決條件
作用中的 AWS 帳戶
安裝https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html和設定 AWS Command Line Interface (AWS CLI) 第 2 版
已安裝 AWS CLI 的 Session Manager 外掛程式 https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
Terraform CLI,已安裝
Terraform 狀態
的儲存體,例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體和 Amazon DynamoDB 資料表,可做為遠端後端來存放 Terraform 狀態。如需使用遠端後端處理 Terraform 狀態的詳細資訊,請參閱 S3 後端 (Terraform 文件)。如需使用 S3 後端設定遠端狀態管理的程式碼範例,請參閱 remote-state-s3-backend (Terraform Registry)。請注意以下要求: SSH 用戶端,已安裝
限制
此模式旨在做為概念驗證 (PoC) 或進一步開發的基礎。其不應在生產環境中以其目前形式使用。部署之前,請調整儲存庫中的範例程式碼,以符合您的需求和使用案例。
此模式假設目標堡壘主機使用 Amazon Linux 2 做為其作業系統。雖然可以使用其他 Amazon Machine Image (AMIs),但其他作業系統超出此模式的範圍。
注意
Amazon Linux 2 即將結束支援。如需詳細資訊,請參閱 Amazon Linux 2 FAQs
。 在此模式中,堡壘主機位於沒有 NAT 閘道和網際網路閘道的私有子網路中。此設計會將 EC2 執行個體與公有網際網路隔離。您可以新增特定網路組態,以允許其與網際網路通訊。如需詳細資訊,請參閱《Amazon VPC 文件》中的將您的虛擬私有雲端 (VPC) 連線至其他網路。同樣地,遵循最低權限原則,除非您明確授予許可,否則堡壘主機無法存取您 AWS 帳戶中的任何其他資源。如需詳細資訊,請參閱 IAM 文件中的資源型政策。
產品版本
AWS CLI 第 2 版
Terraform 1.3.9 版
架構
目標技術堆疊
具有單一私有子網路的 VPC
下列界面 VPC 端點:
amazonaws.<region>.ssm
– Systems Manager 服務的端點。amazonaws.<region>.ec2messages
– Systems Manager 使用此端點從 SSM Agent 呼叫 Systems Manager 服務。amazonaws.<region>.ssmmessages
– Session Manager 使用此端點,透過安全的資料管道連線至 EC2 執行個體。
執行 Amazon Linux 2 的
t3.nano
EC2 執行個體IAM 角色和執行個體描述檔
端點和 EC2 執行個體的 Amazon VPC 安全群組和安全群組規則
目標架構

圖表顯示下列程序:
使用者擔任的 IAM 角色具有執行下列動作的許可:
驗證、授權和連線至 EC2 執行個體
使用 Session Manager 啟動工作階段
使用者透過 Session Manager 啟動 SSH 工作階段。
Session Manager 會驗證使用者、驗證相關聯 IAM 政策中的許可、檢查組態設定,以及傳送訊息給 SSM Agent 以開啟雙向連線。
使用者透過 Amazon EC2 中繼資料將 SSH 公有金鑰推送至堡壘主機。這必須在每個連線之前完成。SSH 公有金鑰會保持可用 60 秒。
堡壘主機會與 Systems Manager 和 Amazon EC2 的介面 VPC 端點通訊。
使用者透過 Session Manager 使用 TLS 1.2 加密雙向通訊管道存取堡壘主機。
自動化和擴展
下列選項可用於自動化部署或擴展此架構:
您可以透過持續整合和持續交付 (CI/CD) 管道部署架構。
您可以修改程式碼來變更堡壘主機的執行個體類型。
您可以修改程式碼以部署多個堡壘主機。在
bastion-host/main.tf
檔案aws_instance
的資源區塊中,新增count
中繼引數。如需詳細資訊,請參閱 Terraform 文件。
工具
AWS 服務
AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列 shell 中的命令與 AWS 服務互動。
Amazon Elastic Compute Cloud (Amazon EC2) 在 AWS Cloud 中提供可擴展的運算容量。您可以視需要啟動任意數量的虛擬伺服器,,並快速進行擴展或縮減。
AWS Identity and Access Management (IAM) 可透過控制誰經過身分驗證和授權,協助您安全地管理對 AWS 資源的存取。
AWS Systems Manager 可協助您管理在 AWS 雲端中執行的應用程式和基礎設施。它可簡化應用程式和資源管理、縮短偵測和解決操作問題的時間,並協助您大規模安全地管理 AWS 資源。此模式使用 Systems Manager 功能的 Session Manager。
Amazon Virtual Private Cloud (Amazon VPC) 可協助您將 AWS 資源啟動至您定義的虛擬網路。這個虛擬網路類似於傳統網路,您會在自己的資料中心中運作,並享有使用 AWS 可擴展基礎設施的優勢。
其他工具
HashiCorp Terraform
是一種開放原始碼基礎設施做為程式碼 (IaC) 工具,可協助您使用程式碼來佈建和管理雲端基礎設施和資源。此模式使用 Terraform CLI 。
程式碼儲存庫
此模式的程式碼可在 GitHub 中使用 Session Manager 和 Amazon EC2 Instance Connect 儲存庫來存取堡壘主機
最佳實務
我們建議您使用自動程式碼掃描工具來改善程式碼的安全性和品質。此模式是使用 Checkov
進行掃描,這是 IaC 的靜態程式碼分析工具。我們建議您至少使用 和 terraform fmt -check -recursive
Terraform 命令來執行基本的驗證terraform validate
和格式檢查。為 IaC 新增自動化測試是很好的做法。如需測試 Terraform 程式碼的不同方法的詳細資訊,請參閱測試 HashiCorp Terraform
(Terraform 部落格文章)。 在部署期間,每次偵測到新版本的 Amazon Linux 2 AMI 時,Terraform 都會使用 取代 EC2 執行個體。 https://aws.amazon.com/marketplace/pp/prodview-zc4x2k7vt6rpu?sr=0-1&ref_=beagle&applicationId=AWSMPContessa
這會部署新版本的作業系統,包括修補程式和升級。如果部署排程不常發生,這可能會帶來安全風險,因為執行個體沒有最新的修補程式。請務必經常更新並套用安全修補程式到部署的 EC2 執行個體。如需詳細資訊,請參閱在 Amazon EC2 中更新管理。 由於此模式是一種概念驗證,因此會使用 AWS 受管政策,例如
AmazonSSMManagedInstanceCore
。AWS 受管政策涵蓋常見的使用案例,但不授予最低權限許可。根據您的使用案例需要,我們建議您建立自訂政策,以授予此架構中所部署資源的最低權限許可。如需詳細資訊,請參閱開始使用 AWS 受管政策並移至最低權限許可。使用密碼來保護對 SSH 金鑰的存取,並將金鑰存放在安全的位置。
設定堡壘主機的記錄和監控。從營運和安全性的角度來看,記錄和監控是維護系統的重要部分。監控堡壘主機中的連線和活動有多種方式。如需詳細資訊,請參閱 Systems Manager 文件中的下列主題:
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
複製程式碼儲存庫。 |
| DevOps 工程師、開發人員 |
初始化 Terraform 工作目錄。 | 只有第一個部署需要此步驟。如果您要重新部署模式,請跳至下一個步驟。 在複製儲存庫的根目錄中,輸入下列命令,其中:
注意或者,您可以開啟 config.tf 檔案,並在 | DevOps 工程師、開發人員、Terraform |
部署 資源。 |
| DevOps 工程師、開發人員、Terraform |
任務 | 描述 | 所需的技能 |
---|---|---|
設定 SSH 連線。 | 更新 SSH 組態檔案,以允許透過 Session Manager 進行 SSH 連線。如需指示,請參閱允許 Session Manager 的 SSH 連線。這可讓授權使用者輸入代理命令,以啟動 Session Manager 工作階段並透過雙向連線傳輸所有資料。 | DevOps 工程師 |
產生 SSH 金鑰。 | 輸入下列命令來產生本機私有和公有 SSH 金鑰對。您可以使用此金鑰對來連線至堡壘主機。
| DevOps 工程師、開發人員 |
任務 | 描述 | 所需的技能 |
---|---|---|
取得執行個體 ID。 |
| 一般 AWS |
傳送 SSH 公有金鑰。 | 注意
| 一般 AWS |
連線至堡壘主機。 |
注意有其他選項可用來開啟與堡壘主機的 SSH 連線。如需詳細資訊,請參閱此模式的其他資訊區段中的與堡壘主機建立 SSH 連線的替代方法。 | 一般 AWS |
任務 | 描述 | 所需的技能 |
---|---|---|
移除部署的資源。 |
| DevOps 工程師、開發人員、Terraform |
故障診斷
問題 | 解決方案 |
---|---|
|
|
| 將公有金鑰上傳到堡壘主機後,您只有 60 秒的時間開始連線。60 秒後,金鑰會自動移除,且您無法用來連線至執行個體。如果發生這種情況,您可以重複 步驟,將金鑰重新傳送至執行個體。 |
相關資源
AWS 文件
AWS Systems Manager Session Manager (Systems Manager 文件)
安裝 AWS CLI 的 Session Manager 外掛程式 (Systems Manager 文件)
允許 Session Manager 的 SSH 連線 (Systems Manager 文件)
關於使用 EC2 Instance Connect (Amazon EC2 文件)
使用 EC2 Instance Connect 連線 (Amazon EC2 文件)
Amazon EC2 的身分和存取管理 (Amazon EC2 文件)
IAM 中的安全最佳實務 (IAM 文件)
使用安全群組控制資源的流量 (Amazon VPC 文件)
其他資源
命令:驗證
(Terraform 文件) 命令:fmt
(Terraform 文件) 測試 HashiCorp Terraform
(HashiCorp 部落格文章)
其他資訊
與堡壘主機建立 SSH 連線的替代方法
網路埠轉遞
您可以使用 -D 8888
選項來開啟具有動態連接埠轉送的 SSH 連線。如需詳細資訊,請參閱這些說明
ssh -i $PRIVATE_KEY_FILE -D 8888 ec2-user@$INSTANCE_ID
這種連線會開啟 SOCKS 代理,透過堡壘主機從本機瀏覽器轉送流量。如果您使用的是 Linux 或 MacOS,若要查看所有選項,請輸入 man ssh
。這會顯示 SSH 參考手冊。
使用提供的指令碼
與其使用 Epics 區段中的 Session Manager 手動執行連線至堡壘主機中所述的步驟,您可以使用程式碼儲存庫中包含的 connect.sh 指令碼。此指令碼會產生 SSH 金鑰對、將公有金鑰推送至 EC2 執行個體,以及啟動與堡壘主機的連線。執行指令碼時,您會將標籤和金鑰名稱傳遞為引數。以下是執行指令碼的 命令範例。
./connect.sh sandbox-dev-bastion-host my_key