選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

使用 Session Manager 和 Amazon EC2 Instance Connect 存取堡壘主機 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Session Manager 和 Amazon EC2 Instance Connect 存取堡壘主機

由 Piotr Chotkowski (AWS) 和 Witold Kowalik (AWS) 建立

Summary

堡壘主機有時稱為跳轉方塊,是一種伺服器,可提供從外部網路到私有網路中資源的單一存取點。向網際網路等外部公有網路公開的伺服器,會對未經授權的存取造成潛在的安全風險。請務必保護和控制對這些伺服器的存取。

此模式說明如何使用 Session ManagerAmazon 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 有基本了解的讀者。

先決條件和限制

先決條件

限制

  • 此模式旨在做為概念驗證 (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 安全群組和安全群組規則

目標架構

使用 Session Manager 存取堡壘主機的架構圖。

圖表顯示下列程序:

  1. 使用者擔任的 IAM 角色具有執行下列動作的許可:

    • 驗證、授權和連線至 EC2 執行個體

    • 使用 Session Manager 啟動工作階段

  2. 使用者透過 Session Manager 啟動 SSH 工作階段。

  3. Session Manager 會驗證使用者、驗證相關聯 IAM 政策中的許可、檢查組態設定,以及傳送訊息給 SSM Agent 以開啟雙向連線。

  4. 使用者透過 Amazon EC2 中繼資料將 SSH 公有金鑰推送至堡壘主機。這必須在每個連線之前完成。SSH 公有金鑰會保持可用 60 秒。

  5. 堡壘主機會與 Systems Manager 和 Amazon EC2 的介面 VPC 端點通訊。

  6. 使用者透過 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 文件中的下列主題:

史詩

任務描述所需的技能

複製程式碼儲存庫。

  1. 在命令列界面中,將工作目錄變更為您要存放範例檔案的位置。

  2. 輸入以下命令。

    git clone https://github.com/aws-samples/secured-bastion-host-terraform.git

DevOps 工程師、開發人員

初始化 Terraform 工作目錄。

只有第一個部署需要此步驟。如果您要重新部署模式,請跳至下一個步驟。

在複製儲存庫的根目錄中,輸入下列命令,其中:

  • $S3_STATE_BUCKET 是包含 Terraform 狀態的 S3 儲存貯體名稱

  • $PATH_TO_STATE_FILE 是 Terraform 狀態檔案的金鑰,例如 infra/bastion-host/tetfstate

  • $AWS_REGION 是部署 S3 儲存貯體的區域

terraform init \ -backend-config="bucket=$S3_STATE_BUCKET" \ -backend-config="key=$PATH_TO_STATE_FILE" \ -backend-config="region=$AWS_REGION
注意

或者,您可以開啟 config.tf 檔案,並在 terraform區段中手動提供這些值。

DevOps 工程師、開發人員、Terraform

部署 資源。

  1. 在複製儲存庫的根目錄中,輸入下列命令。

    terraform apply -var-file="dev.tfvars"
  2. 檢閱將套用至 AWS 帳戶的所有變更清單,然後確認部署。

  3. 等待所有資源部署完成。

DevOps 工程師、開發人員、Terraform

部署 資源

任務描述所需的技能

複製程式碼儲存庫。

  1. 在命令列界面中,將工作目錄變更為您要存放範例檔案的位置。

  2. 輸入以下命令。

    git clone https://github.com/aws-samples/secured-bastion-host-terraform.git

DevOps 工程師、開發人員

初始化 Terraform 工作目錄。

只有第一個部署需要此步驟。如果您要重新部署模式,請跳至下一個步驟。

在複製儲存庫的根目錄中,輸入下列命令,其中:

  • $S3_STATE_BUCKET 是包含 Terraform 狀態的 S3 儲存貯體名稱

  • $PATH_TO_STATE_FILE 是 Terraform 狀態檔案的金鑰,例如 infra/bastion-host/tetfstate

  • $AWS_REGION 是部署 S3 儲存貯體的區域

terraform init \ -backend-config="bucket=$S3_STATE_BUCKET" \ -backend-config="key=$PATH_TO_STATE_FILE" \ -backend-config="region=$AWS_REGION
注意

或者,您可以開啟 config.tf 檔案,並在 terraform區段中手動提供這些值。

DevOps 工程師、開發人員、Terraform

部署 資源。

  1. 在複製儲存庫的根目錄中,輸入下列命令。

    terraform apply -var-file="dev.tfvars"
  2. 檢閱將套用至 AWS 帳戶的所有變更清單,然後確認部署。

  3. 等待所有資源部署完成。

DevOps 工程師、開發人員、Terraform
任務描述所需的技能

設定 SSH 連線。

更新 SSH 組態檔案,以允許透過 Session Manager 進行 SSH 連線。如需指示,請參閱允許 Session Manager 的 SSH 連線。這可讓授權使用者輸入代理命令,以啟動 Session Manager 工作階段並透過雙向連線傳輸所有資料。

DevOps 工程師

產生 SSH 金鑰。

輸入下列命令來產生本機私有和公有 SSH 金鑰對。您可以使用此金鑰對來連線至堡壘主機。

ssh-keygen -t rsa -f my_key
DevOps 工程師、開發人員

設定本機環境

任務描述所需的技能

設定 SSH 連線。

更新 SSH 組態檔案,以允許透過 Session Manager 進行 SSH 連線。如需指示,請參閱允許 Session Manager 的 SSH 連線。這可讓授權使用者輸入代理命令,以啟動 Session Manager 工作階段並透過雙向連線傳輸所有資料。

DevOps 工程師

產生 SSH 金鑰。

輸入下列命令來產生本機私有和公有 SSH 金鑰對。您可以使用此金鑰對來連線至堡壘主機。

ssh-keygen -t rsa -f my_key
DevOps 工程師、開發人員
任務描述所需的技能

取得執行個體 ID。

  1. 若要連線至部署的堡壘主機,您需要 EC2 執行個體的 ID。執行下列其中一項來尋找 ID:

    • https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。在導覽窗格中,選擇 Instances (執行個體)。找到堡壘主機執行個體。

    • 在 AWS CLI 中,輸入下列命令。

      aws ec2 describe-instances

      若要篩選結果,請輸入下列命令,其中 $BASTION_HOST_TAG是您指派給堡壘主機的標籤。此標籤的預設值為 sandbox-dev-bastion-host

      aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$BASTION_HOST_TAG" \ --output text \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text
  2. 複製 EC2 執行個體的 ID。您稍後使用此 ID。

一般 AWS

傳送 SSH 公有金鑰。

注意

在本節中,您將公有金鑰上傳至堡壘主機的執行個體中繼資料。上傳金鑰後,您有 60 秒的時間開始與堡壘主機的連線。60 秒後,會移除公有金鑰。如需詳細資訊,請參閱此模式的故障診斷一節。快速完成後續步驟,以防止金鑰在您連線到堡壘主機之前遭到移除。

  1. 使用 EC2 Instance Connect 將 SSH 金鑰傳送至堡壘主機。輸入下列命令,其中:

    • $INSTANCE_ID 是 EC2 執行個體的 ID

    • $PUBLIC_KEY_FILE 是您公有金鑰檔案的路徑,例如 my_key.pub

      重要

      請務必使用公有金鑰,而非私有金鑰。

    aws ec2-instance-connect send-ssh-public-key \ --instance-id $INSTANCE_ID \ --instance-os-user ec2-user \ --ssh-public-key file://$PUBLIC_KEY_FILE
  2. 等到您收到訊息,指出金鑰已成功上傳。立即繼續下一個步驟。

一般 AWS

連線至堡壘主機。

  1. 輸入下列命令,透過 Session Manager 連線至堡壘主機,其中:

    • $PRIVATE_KEY_FILE 是您私有金鑰的路徑,例如 my_key

    • $INSTANCE_ID 是 EC2 執行個體的 ID

    ssh -i $PRIVATE_KEY_FILE ec2-user@$INSTANCE_ID
  2. 輸入 以確認連線yes。這會使用 Session Manager 開啟 SSH 連線。

注意

有其他選項可用來開啟與堡壘主機的 SSH 連線。如需詳細資訊,請參閱此模式的其他資訊區段中的與堡壘主機建立 SSH 連線的替代方法

一般 AWS

使用 Session Manager 連線至堡壘主機

任務描述所需的技能

取得執行個體 ID。

  1. 若要連線至部署的堡壘主機,您需要 EC2 執行個體的 ID。執行下列其中一項來尋找 ID:

    • https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。在導覽窗格中,選擇 Instances (執行個體)。找到堡壘主機執行個體。

    • 在 AWS CLI 中,輸入下列命令。

      aws ec2 describe-instances

      若要篩選結果,請輸入下列命令,其中 $BASTION_HOST_TAG是您指派給堡壘主機的標籤。此標籤的預設值為 sandbox-dev-bastion-host

      aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$BASTION_HOST_TAG" \ --output text \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text
  2. 複製 EC2 執行個體的 ID。您稍後使用此 ID。

一般 AWS

傳送 SSH 公有金鑰。

注意

在本節中,您將公有金鑰上傳至堡壘主機的執行個體中繼資料。上傳金鑰後,您有 60 秒的時間開始與堡壘主機的連線。60 秒後,會移除公有金鑰。如需詳細資訊,請參閱此模式的故障診斷一節。快速完成後續步驟,以防止金鑰在您連線到堡壘主機之前遭到移除。

  1. 使用 EC2 Instance Connect 將 SSH 金鑰傳送至堡壘主機。輸入下列命令,其中:

    • $INSTANCE_ID 是 EC2 執行個體的 ID

    • $PUBLIC_KEY_FILE 是您公有金鑰檔案的路徑,例如 my_key.pub

      重要

      請務必使用公有金鑰,而非私有金鑰。

    aws ec2-instance-connect send-ssh-public-key \ --instance-id $INSTANCE_ID \ --instance-os-user ec2-user \ --ssh-public-key file://$PUBLIC_KEY_FILE
  2. 等到您收到訊息,指出金鑰已成功上傳。立即繼續下一個步驟。

一般 AWS

連線至堡壘主機。

  1. 輸入下列命令,透過 Session Manager 連線至堡壘主機,其中:

    • $PRIVATE_KEY_FILE 是您私有金鑰的路徑,例如 my_key

    • $INSTANCE_ID 是 EC2 執行個體的 ID

    ssh -i $PRIVATE_KEY_FILE ec2-user@$INSTANCE_ID
  2. 輸入 以確認連線yes。這會使用 Session Manager 開啟 SSH 連線。

注意

有其他選項可用來開啟與堡壘主機的 SSH 連線。如需詳細資訊,請參閱此模式的其他資訊區段中的與堡壘主機建立 SSH 連線的替代方法

一般 AWS
任務描述所需的技能

移除部署的資源。

  1. 若要移除所有部署的資源,請從複製的儲存庫根目錄執行下列命令。

    terraform destroy -var-file="dev.tfvars"
  2. 確認資源的移除。

DevOps 工程師、開發人員、Terraform

(選用) 清除

任務描述所需的技能

移除部署的資源。

  1. 若要移除所有部署的資源,請從複製的儲存庫根目錄執行下列命令。

    terraform destroy -var-file="dev.tfvars"
  2. 確認資源的移除。

DevOps 工程師、開發人員、Terraform

故障診斷

問題解決方案

TargetNotConnected 嘗試連線至堡壘主機時發生錯誤

  1. 根據 Amazon EC2 文件中的重新啟動執行個體中的指示重新啟動堡壘主機。

  2. 執行個體成功重新啟動後,將公有金鑰重新傳送至堡壘主機,然後重新嘗試連線。

Permission denied 嘗試連線至堡壘主機時發生錯誤

將公有金鑰上傳到堡壘主機後,您只有 60 秒的時間開始連線。60 秒後,金鑰會自動移除,且您無法用來連線至執行個體。如果發生這種情況,您可以重複 步驟,將金鑰重新傳送至執行個體。

相關資源

AWS 文件

其他資源

其他資訊

與堡壘主機建立 SSH 連線的替代方法

網路埠轉遞

您可以使用 -D 8888選項來開啟具有動態連接埠轉送的 SSH 連線。如需詳細資訊,請參閱這些說明,網址為 https://explainshell.com。以下是使用連接埠轉送開啟 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
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。