跳至內容

如何安全地將機密或敏感資訊傳遞至 Amazon ECS 任務的容器?

3 分的閱讀內容
0

我想安全地將機密或敏感資訊傳遞至 Amazon 彈性容器服務 (Amazon ECS) 任務中的容器。

簡短描述

如果以純文字形式傳遞敏感資料,則可能會導致安全性問題。這些資料可能可以在 AWS 管理主控台中或透過 DescribeTaskDefinition AWS API 找到。

最佳安全實踐是,將敏感資訊當做環境變數傳遞給容器。若要將資料安全地注入容器,請參考 Parameter Store (AWS Systems Manager 的一項功能) 中儲存的值。您也可以在 Amazon ECS 任務定義中使用 AWS Secrets Manager。然後,您可以將敏感資訊當作環境變數或容器的日誌組態公開。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

先決條件:

  • 您的任務必須使用 AWS Fargate 平台版本 1.3.0 或更新版本,以及 AWS Fargate 啟動類型。
  • 您的容器執行個體必須使用 amazon-ecs-agent 版本 1.22.0 或更新版本,以及 Amazon Elastic Compute Cloud (Amazon EC2) 啟動類型。如需詳細資訊,請參閱 GitHub 網站上的變更日誌
  • 您的 Fargate 平台必須具有 Linux 版本 1.4.0 或更新版本,或 Windows 版本 1.0.0 才能注入 JSON 金鑰。
  • 若要使用特定的 JSON 金鑰或機密版本,容器執行個體的 ECS 容器代理程式必須執行 1.37.0 或更新版本才能進行金鑰注入。
  • 容器執行個體的 ECS 容器代理程式必須執行 1.22.0 或更新版本,才能將機密的完整內容注入日誌組態或環境變數中。

建立 IAM 角色和政策

請完成下列步驟:

  1. 將您的敏感資訊儲存在 Parameter Store 或 Secrets Manager 中。

    對於 Parameter Store,請執行以下 put-parameter AWS CLI 命令:

    aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue

    **注意:**將 awsExampleParameter 替換為您自己的參數。將 awsExampleValue 替換為您的機密值。

    對於 Secrets Manager,請執行以下 create-secret AWS CLI 命令:

    aws secretsmanager create-secret --name awsExampleParameter --secret-string awsExampleValue

    **注意:**將 awsExampleParameter 替換為您自己的參數。將 awsExampleValue 替換為您的機密值。ECS 容器代理程式使用任務執行角色從 Parameter Store 或 Secrets Manager 取得資訊。任務執行角色必須授予 ssm:GetParameterssecretsmanager:GetSecretValuekms:Decrypt 動作的權限。

  2. 開啟 AWS Identity and Access Management (IAM) 主控台

  3. ecs-tasks.amazonaws.com 建立具有信任關係的角色
    角色信任政策範例:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "ecs-tasks.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  4. 選擇 Roles (角色),然後選取您建立的角色。

  5. Permissions (權限) 索引標籤下,選擇 Add permissions (新增權限) 下拉式清單。

  6. 選擇 Create inline policy (建立內嵌政策),然後選擇 JSON 索引標籤。

  7. 附加以下政策:

    {
      "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*"
          ]
        }
      ]
    }

    **注意:**將 us-east-1awsExampleAccountID 替換為您儲存參數的 AWS 區域和帳戶。將 awsExampleParameter 替換為您所建立參數的名稱。您可以使用 AWS Key Management Service (AWS KMS) 客戶自管金鑰來加密 Parameter Store 或 Secrets Manager 中的資料。若要使用客戶自管金鑰,請取得 kms:Decrypt 的權限。

  8. (選用) 將受管政策 AmazonECSTaskExecutionRolePolicy 附加到您建立的角色。

**重要:**將日誌傳送至 Amazon CloudWatch 或使用儲存在 Amazon Elastic Container Registry (Amazon ECR) 中映像檔的任務,必須具有受管政策。

在 ECS 任務定義中參考敏感訊息

使用 Amazon ECS 主控台或 AWS CLI 在 ECS 任務定義中參考敏感資訊。

使用 Amazon ECS 主控台

請完成下列步驟:

  1. 開啟 Amazon ECS console (Amazon ECS 主控台)。
  2. 在導覽窗格中,選擇 Task Definitions (任務定義),然後選擇 Create new task definition (建立新任務定義)。
    Task definition family (任務定義系列),輸入一個名稱。
    Launch type (啟動類型),啟動類型請選擇 AWS FargateAmazon EC2 執行個體
  3. Task execution role (任務執行角色),選擇您建立的任務執行 IAM 角色。
  4. Container Definitions (容器定義) 區段的 Environment variables (環境變數) 區段下,選擇 Add environment variable (新增環境變數)。
  5. Key (金鑰),輸入環境變數的金鑰。
  6. ValueType 下拉式清單中,選擇 ValueFrom
  7. 在金鑰的文字方塊中,輸入 Parameter Store 或 Secrets Manager 資源的 Amazon Resource Name (ARN)。
    **注意:**您也可以在日誌驅動程式組態中指定機密。

使用 AWS CLI

使用 secrets 區段,將任務定義中的 Parameter Store 或 Secrets Manager 資源做為環境變數參考。或者,使用 secretOptions 區段,將 Parameter Store 或 Secrets Manager 做為日誌組態選項參考。

任務定義範例:

{
  "requiresCompatibilities": [
    "EC2"
  ],
  "family": "Web",
  "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"
}

**注意:**將 us-east-1awsExampleAccountID 替換為您的區域和帳戶 ID。將 awsExampleParameter 替換為您建立的參數。將 awsExampleRoleName 替換為您建立的角色。

然後,執行以下 register-task-definition AWS CLI 命令來註冊任務定義:

aws ecs register-task-definition --family-name yourTaskDefinitionFamily --cli-input-json file://pathToYourJsonFile

**注意:**將 yourTaskDefinitionFamily 替換為您的任務定義系列名稱。

當您啟動具有此定義的任務時,ECS 容器代理程式會自動解析機密。然後,容器代理程式會將這些值做為環境變數注入容器中。

更新機密並部署變更

當您啟動 ECS 容器時,容器會將敏感資料注入其中。如果您更新或輪換機密或 Parameter Store 參數,則容器不會自動接收更新的值。您必須啟動一項新任務。如果您的任務是服務的一部分,那麼請更新該服務。若要強制服務啟動新任務,請使用 Force new deployment (強制執行新部署) 選項。

若要強制執行新部署,請完成以下步驟:

  1. 開啟 Amazon ECS console (Amazon ECS 主控台)。
  2. 選擇 叢集,然後選取包含您服務的叢集。
  3. Update (更新) 下拉式清單中選取 Force New Deployment (強制執行新部署)。
    **注意:**若要從 AWS CLI 強制執行新部署,請執行 update-service 命令並加上 --force-new-deployment 旗標。

相關資訊

更新 Amazon ECS 容器代理程式