如何將機密或敏感資訊安全地傳遞至 Amazon ECS 任務中的容器?
我想將秘密或敏感資訊安全地傳遞至 Amazon 彈性容器服務 (Amazon ECS) 任務中的容器。
簡短描述
以純文字格式傳遞敏感資料可能會導致安全問題,因為這些資料可在 AWS 管理主控台或透過 AWS API (例如 DescribeTaskDefinition 或 DescribeTasks) 探索。
安全性最佳作法是將敏感資訊當做環境變數傳遞至容器。您可以在 Amazon ECS 任務定義的容器定義中參考存放在 AWS Systems Manager Parameter Store 或 AWS Secrets Manager 中的值,將資料安全地插入容器。然後,您可以將敏感資訊公開為環境變數或容器的記錄組態中。
AWS 僅支援下列項目的資料插入:
- 使用 AWS Fargate 平台 1.3.0 版或更高版本搭配 AWS Fargate 啟動類型的任務
- 使用 amazon-ecs-agent 版本 1.22.0 或更高版本與 Amazon Elastic Compute Cloud (Amazon EC2) 啟動類型的容器執行個體
解決方案
完成先決條件
1. 將您的敏感資訊存放在 AWS Systems Manager Parameter Store 或 Secrets Manager 中。
對於 AWS Systems Manager Parameter Store,請執行下列命令。用您自己的參數替換 awsExampleParameter 參數,並用您的安全值替換 awsExampleValue 值:
aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue
若為密碼管理員,請執行下列命令。用您自己的參數替換 awsExampleParameter 參數,並用您的密鑰值替換 awsExampleValue 值:
aws secretsmanager create-secret --name awsExampleParameter --secret-string awsExampleValue
**注意:**Amazon ECS 容器代理程式使用任務執行 AWS 身分和存取管理 (IAM) 角色,從 AWS Systems Manager Parameter Store 或 Secrets Manager 擷取資訊。任務執行 IAM 角色必須授予以下動作的許可:ssm:GetParameters、secretsmanager:GetSecretValue 及 kms:Decrypt。
2. 開啟 IAM 主控台,然後為 ecs-tasks.amazonaws.com 建立具有信任關係的角色。例如:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
3. 若要在 IAM 主控台中為您的角色建立內嵌政策,請選擇角色,選取您在步驟 2 中建立的角色,然後在權限索引標籤上選擇新增內嵌政策。選擇 JSON索引標籤,然後使用下列程式碼建立原則。以存放參數的 AWS 區域和帳戶取代 us-east-1 及 awsExampleAccountID 。以您在步驟 1 中建立的參數名稱取代 awsExampleParameter 參數:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters", "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter", "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter*" ] } ] }
注意: 如果您使用客戶受管 KMS 金鑰來加密 AWS Systems Manager Parameter Store 或 Secrets Manager 中的資料,您必須取得 kms:Decrypt 的許可。
4. (選擇性) 將受管理原則 AmazonECSTaskExecutionRolePolicy 附加至您在步驟 2 中建立的角色。
重要事項: 對於使用存放在 Amazon 彈性容器登錄 (Amazon ECR) 中的映像或將日誌傳送到 Amazon CloudWatch 的任務,則需要使用受管政策。
在 ECS 任務定義中參照敏感資訊
從 AWS 管理主控台:
1. 開啟 Amazon ECS 主控台。
2. 從導覽窗格中選擇工作定義,然後選擇建立新工作定義。
3. 選擇您的啟動類型,然後選擇下一步。
4.對於工作執行角色,請選擇您先前建立的工作執行 IAM 角色。
5. 在容器定義區段中,選擇新增容器。
6. 在環境下的環境變數區段中,在 Key 輸入環境變數的金鑰。
7. 在值下拉式清單中,選擇值來源。
8. 在金鑰的文字方塊中,輸入參數存放區或秘密管理員資源的 Amazon 資源名稱 (ARN)。
注意: 您也可以在記錄驅動程式組態中指定密碼。
從 AWS Command Line Interface (AWS CLI):
注意: 如果您在執行 AWS CLI 命令時收到錯誤訊息,請確定您使用的是最新版本的 AWS CLI。
1.使用秘密部分,將任務定義中的 AWS Systems Manager Parameter Store 或 Secrets Manager 資源參考為環境變數,或使用秘密選項部分做為日誌組態選項。在以下範例中,將 us-east-1 及 awsExampleAccountID 取代為您的 AWS 區域和帳戶 ID。使用您先前建立的參數取代 awsExampleParameter。以您先前建立的角色取代 awsExampleRoleName。
{ "requiresCompatibilities": [ "EC2" ], "networkMode": "awsvpc", "containerDefinitions": [ { "name": "web", "image": "httpd", "memory": 128, "essential": true, "portMappings": [ { "containerPort": 80, "protocol": "tcp" } ], "logConfiguration": { "logDriver": "splunk", "options": { "splunk-url": "https://sample.splunk.com:8080" }, "secretOptions": [ { "name": "splunk-token", "valueFrom": "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter" } ] }, "secrets": [ { "name": "DATABASE_PASSWORD", "valueFrom": "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter" } ] } ], "executionRoleArn": "arn:aws:iam::awsExampleAccountID:role/awsExampleRoleName" }
2.若要註冊工作定義,請執行下列命令:
aws ecs register-task-definition --family-name yourTaskDefinitionFamily --cli-input-json file://pathToYourJsonFile
使用您建立的任務定義啟動任務時,Amazon ECS 容器代理程式會自動解析密碼,並將這些值做為環境變數注入容器。
重要事項: 當容器初始啟動時,會將敏感資料插入您的容器中。如果密碼或參數存放區參數已更新或輪換,容器不會自動接收更新的值。您必須啟動新任務。如果您的任務屬於服務的一部分,請更新服務。然後,使用強制新部署選項強制服務啟動全新工作。
若要強制執行新部署:
1. 開啟 Amazon ECS 主控台。
2.選擇叢集,然後選取您服務的叢集。
3.選取強制新部署核取方塊,然後選擇更新服務。
注意: 若要從 AWS CLI 強制執行新部署,請使用 --force-new-deployment 旗標執行 update-service 命令。
相關內容
- 已提問 2 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 6 個月前