透過 Amazon ECS 環境變數擷取秘密管理員機密 - Amazon Elastic Container Service

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

透過 Amazon ECS 環境變數擷取秘密管理員機密

當您將秘密作為環境變數插入時,可以指定秘密的完整內容、秘密內的特定 JSON 金鑰或要插入的特定秘密版本。這可協助您控制向容器公開的敏感資料。如需有關秘密版本控制的詳細資訊,請參閱《AWS Secrets Manager 使用者指南》中的 AWS Secrets Manager重要術語和概念

使用環境變數將 Secret Manager 密碼插入容器時,應考慮下列事項。

  • 敏感資料會在初次啟動容器時,嵌入您的容器。如果後續更新或輪換秘密,則容器不會自動收到更新的值。您必須啟動新的任務,或如果任務是服務的一部分,您可以更新服務,並使用 Force new deployment (強制新的部署) 選項強制服務來啟動新的任務。

  • 對於上的 Amazon ECS 任務 AWS Fargate,應考慮下列事項:

  • 對於 EC2 上的 Amazon ECS 任務,應考慮下列事項:

    • 若要使用秘密的特定 JSON 索引鍵或版本插入秘密,您的容器執行個體必須有 1.37.0 版或更新版本的容器代理程式。不過,我們建議您使用最新版的容器代理程式。如需檢查代理程式版本及更新至最新版本的資訊,請參閱「更新 Amazon ECS 容器代理程式」。

      若要插入秘密的完整內容做為環境變數,或在日誌組態中插入秘密,則容器執行個體必須有 1.22.0 版或更新版本的容器代理程式。

  • 使用介面 VPC 私人雲端端點來增強安全性控制,並透過私有子網路連線至 Secrets Manager。您必須建立 Secrets Manager 的介面 VPC 端點。如需有關 VPC 端點的資訊,請參閱《AWS Secrets Manager 使用者指南》中的建立VPC 端點。如需有關使用 Secrets Manager 和 Amazon VPC 的詳細資訊,請參閱如何在 Amazon VPC 中連接到 Secrets Manager 服務

  • 對於設定為使用 awslogs 日誌記錄驅動程式的 Windows 任務,您也必須在容器執行個體上設定 ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE 環境變數。這可以透過使用者資料完成,語法如下:

    <powershell> [Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine") Initialize-ECSAgent -Cluster <cluster name> -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' </powershell>

IAM 許可

若要使用此功能,您必須擁有 Amazon ECS 任務執行角色,並在您的任務定義中參考它。如需詳細資訊,請參閱 Amazon ECS 任務執行 IAM 角色

若要將存取提供給您建立的 Secrets Manager 秘密,請將以下許可做為內嵌政策,手動新增到任務執行角色。如需詳細資訊,請參閱新增和移除 IAM 政策

  • secretsmanager:GetSecretValue - 如果您要參考 Secrets Manager 秘密,則需要此項目。新增從 Secrets Manager 擷取密碼的許可。

  • kms:Decrypt – 只有在秘密使用客戶受管金鑰而非預設金鑰時,此項目為必要。客戶受管金鑰的 ARN 應該新增為資源。新增解密客戶受管金鑰的許可。

下列政策範例新增必要許可:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name", "arn:aws:kms:region:aws_account_id:key/key_id" ] } ] }

建立 AWS Secrets Manager 秘密

您可以使用 Secrets Manager 主控台為您的敏感資料建立秘密。若要取得更多資訊,請參閱《AWS Secrets Manager 使用指南》中的〈建立 AWS Secrets Manager 密碼

將環境變數新增至容器定義

您可以在容器定義中指定下列項目:

  • 包含要在容器中設定之環境變數名稱的 secrets 物件。

  • Secrets Manager 秘密的 Amazon Resource Name (ARN)

  • 包含要提供給容器之敏感資料的其他參數

下列範例示範了必須為 Secrets Manager 秘密指定的完整語法。

arn:aws:secretsmanager:region:aws_account_id:secret:secret-name:json-key:version-stage:version-id

以下部分說明其他參數。這些參數雖然是選用,但如果您不使用,則必須包含冒號 : 來使用預設值。以下提供範例深入說明。

json-key

使用您要設為環境變數值的值,來指定金鑰/值對中的金鑰名稱。僅支援 JSON 格式的值。如果您沒有指定 JSON 金鑰,則會使用秘密的完整內容。

version-stage

指定您要使用之秘密版本的預備標籤。如果指定了版本預備標籤,就無法指定版本 ID。如果未指定版本階段,則預設會擷取具有 AWSCURRENT 階段標籤的秘密。

預備標籤會用來在不同版本的秘密更新或輪換時加以追蹤。每個版本的秘密都有一或多個預備標籤和 ID。如需詳細資訊,請參閱 《AWS Secrets Manager 使用者指南》中的 AWS Secrets Manager的重要術語和概念

version-id

針對您要使用的秘密版本,指定其唯一識別符。如果指定了版本 ID,就無法指定版本預備標籤。如果未指定版本 ID,則預設會擷取具有 AWSCURRENT 階段標籤的秘密。

版本 ID 會用來在不同版本的秘密更新或輪換時加以追蹤。每個版本的秘密都有 ID。如需詳細資訊,請參閱 《AWS Secrets Manager 使用者指南》中的 AWS Secrets Manager的重要術語和概念

容器定義範例

下列範例示範您可以在容器定義中參考 Secrets Manager 秘密的方法。

範例 參考完整秘密

以下是任務定義的程式碼片段,顯示參考 Secrets Manager 秘密全文時的格式。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }

若要從容器內存取此秘密的值,您需要呼叫 $environment_variable_name

範例 參考秘密中的特定金鑰

以下示範 get-secret-value 命令的範例輸出,會顯示秘密的內容,以及與其相關的版本預備標籤和版本 ID。

{ "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf", "Name": "appauthexample", "VersionId": "871d9eca-18aa-46a9-8785-981ddEXAMPLE", "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}", "VersionStages": [ "AWSCURRENT" ], "CreatedDate": 1581968848.921 }

在 ARN 結尾指定金鑰名稱,來在容器定義中參考上一個輸出的特定金鑰。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::" }] }] }
範例 參考特定秘密版本

以下示範 describe-secret 命令的範例輸出,會顯示秘密的未加密內容,以及所有版本秘密的中繼資料。

{ "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf", "Name": "appauthexample", "Description": "Example of a secret containing application authorization data.", "RotationEnabled": false, "LastChangedDate": 1581968848.926, "LastAccessedDate": 1581897600.0, "Tags": [], "VersionIdsToStages": { "871d9eca-18aa-46a9-8785-981ddEXAMPLE": [ "AWSCURRENT" ], "9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE": [ "AWSPREVIOUS" ] } }

在 ARN 結尾指定金鑰名稱,來在容器定義中參考上一個輸出的特定版本預備標籤。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:" }] }] }

在 ARN 結尾指定金鑰名稱,來在容器定義中參考上一個輸出的特定版本 ID。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }
範例 參考秘密的特定金鑰和版本預備標籤

以下說明如何參考秘密中的特定金鑰和特定版本預備標籤。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1:AWSPREVIOUS:" }] }] }

若要指定特定的金鑰和版本 ID,請使用下列語法。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }

如需有關如何使用環境變數中指定的秘密建立任務定義的資訊,請參閱使用主控台建立 Amazon ECS 任務定義