了解如何使用 Amazon gMSAs 的 ECS for EC2 Windows 容器 - Amazon Elastic Container Service

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

了解如何使用 Amazon gMSAs 的 ECS for EC2 Windows 容器

Amazon ECS 透過稱為群組受管服務帳戶 (gMSA) 的特殊類型服務帳戶支援 Windows 容器的 Active Directory 身分驗證。

Windows 型網路應用程式,例如 .NET 應用程式通常會使用 Active Directory 來促進使用者和服務之間的身分驗證和授權管理。開發人員通常會針對此目的設計其應用程式,以與 Active Directory 整合,並在已加入網域的伺服器上執行。由於 Windows 容器無法加入網域,因此您必須將 Windows 容器設定為使用 gMSA 執行。

使用 gMSA 執行的 Windows 容器依賴其主機 Amazon EC2 執行個體從 Active Directory 網域控制器擷取 gMSA 憑證,並將其提供給容器執行個體。如需詳細資訊,請參閱 Create gMSAs for Windows 容器

注意

Fargate 上的 Windows 容器不支援此功能。

考量事項

使用 gMSAs for Windows 容器時,應考慮下列事項:

  • 為您的容器執行個體使用 Amazon ECS 最佳化 Windows Server 2016 完整 AMI 時,容器主機名稱必須與憑證規格檔案中定義的 gMSA 帳戶名稱相同。若要指定容器的主機名稱,請使用 hostname 容器定義參數。如需詳細資訊,請參閱Network settings (網路設定)

  • 您在無網域之間選擇 gMSA 並將每個執行個體加入單一網域。透過使用無網域 gMSA,容器執行個體不會加入網域,執行個體上的其他應用程式無法使用憑證存取網域,而加入不同網域的任務可以在同一個執行個體上執行。

    然後,選擇 的資料儲存體 CredSpec 以及針對無網域的 Active Directory 使用者憑證 gMSA.

    Amazon ECS 使用 Active Directory 憑證規格檔案 (CredSpec)。 此檔案包含 gMSA 用來傳播 的中繼資料 gMSA 容器的帳戶內容。您可以產生 CredSpec 檔案,然後將其存放在其中一個 CredSpec 下表中的儲存選項,特定於容器執行個體的作業系統。若要使用無網域方法,請在 中的選用區段 CredSpec 檔案可以在其中一個 中指定憑證 domainless user credentials 下表中的儲存選項,特定於容器執行個體的作業系統。

    儲存位置 Linux Windows
    Amazon Simple Storage Service CredSpec CredSpec
    AWS Secrets Manager 無網域使用者憑證 無網域使用者憑證
    Amazon EC2 Systems Manager 參數存放區 CredSpec CredSpec,無網域使用者憑證
    本機檔案 N/A CredSpec

必要條件

在使用 之前 gMSA 對於使用 Amazon ECS 的 Windows 容器功能,請務必完成下列事項:

  • 您可以使用您希望容器存取的資源來設定 Active Directory 網域。Amazon ECS 支援下列設定:

    • AWS Directory Service Active Directory. AWS Directory Service 是託管在 Amazon EC2 上的 AWS 受管 Active Directory。如需詳細資訊,請參閱 AWS Directory Service 管理指南中的 AWS Managed Microsoft AD 入門

    • 內部部署 Active Directory。您必須確保 Amazon ECS Linux 容器執行個體可以加入網域。如需詳細資訊,請參閱AWS Direct Connect

  • 您有現有的 gMSA Active Directory 中的 帳戶。如需詳細資訊,請參閱 Create gMSAs for Windows 容器

  • 您選擇使用無網域 gMSA 或託管 Amazon ECS 任務的 Amazon ECS Windows 容器執行個體必須是加入 Active Directory 的網域,並且是有權存取 gMSA 帳戶的 Active Directory 安全群組的成員。

    透過使用無網域 gMSA,容器執行個體不會加入網域,執行個體上的其他應用程式無法使用憑證存取網域,而加入不同網域的任務可以在同一個執行個體上執行。

  • 您已新增必要的 IAM 許可。所需的許可取決於您為初始憑證選擇的方法以及儲存憑證規格的方法:

    • 如果您使用無網域 gMSA 對於初始憑證,Amazon IAM 執行個體角色 AWS Secrets Manager 需要 的 EC2 許可。

    • 如果您在 SSM 參數存放區中存放憑證規格,則任務執行角色需要 Amazon EC2 Systems Manager 參數存放區的 IAM 許可。

    • 如果您在 Amazon S3 中存放憑證規格,則任務執行角色需要 Amazon Simple Storage Service 的 IAM 許可。

設定 gMSA 適用於 Amazon ECS 上的 Windows 容器

設定 gMSA 對於 Amazon ECS 上的 Windows Containers,您可以遵循完整的教學課程,其中包含設定先決條件 將 Amazon ECS Windows 容器與無網域搭配使用 gMSA 使用 AWS CLI

下列各節涵蓋 CredSpec 組態的詳細資訊。

範例 CredSpec

Amazon ECS 使用包含 的憑證規格檔案 gMSA 用來傳播 的中繼資料 gMSA Windows 容器的帳戶內容。您可以產生登入資料規格檔案,並在任務定義的 credentialSpec 欄位中參考該檔案。登入資料規格檔案不包含任何秘密。

以下是範例登入資料規格檔案:

{ "CmsPlugins": [ "ActiveDirectory" ], "DomainJoinConfig": { "Sid": "S-1-5-21-2554468230-2647958158-2204241789", "MachineAccountName": "WebApp01", "Guid": "8665abd4-e947-4dd0-9a51-f8254943c90b", "DnsTreeName": "contoso.com", "DnsName": "contoso.com", "NetBiosName": "contoso" }, "ActiveDirectoryConfig": { "GroupManagedServiceAccounts": [ { "Name": "WebApp01", "Scope": "contoso.com" } ] } }

無網域 gMSA setup

我們建議無網域 gMSA 而不是將容器執行個體加入單一網域。透過使用無網域 gMSA,容器執行個體不會加入網域,執行個體上的其他應用程式無法使用憑證存取網域,而加入不同網域的任務可以在同一個執行個體上執行。

  1. 上傳 之前 CredSpec 至其中一個儲存選項,將資訊新增至 CredSpec 在 Secrets Manager 或 ARN 參數存放區中使用秘密的 SSM。如需詳細資訊,請參閱 Microsoft Learn 網站上的 non-domain-joined 容器主機使用案例的其他憑證規格組態

    無網域 gMSA 憑證格式

    以下是無網域的 JSON 格式 gMSA Active Directory 的 憑證。將憑證存放在 Secrets Manager 或 SSM 參數存放區。

    { "username":"WebApp01", "password":"Test123!", "domainName":"contoso.com" }
  2. 將下列資訊新增至 CredSpec 檔案ActiveDirectoryConfig。將 ARN 取代為 Secrets Manager 或 SSM 參數存放區中的秘密。

    請注意,該PluginGUID值必須與下列範例程式碼片段中的 GUID 相符,並且是必要的。

    "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": "{\"credentialArn\": \"arn:aws:secretsmanager:aws-region:111122223333:secret:gmsa-plugin-input\"}" }

    您也可以使用此格式的 ARN,在 SSM 參數存放區中使用秘密:\"arn:aws:ssm:aws-region:111122223333:parameter/gmsa-plugin-input\"

  3. 在您修改 之後 CredSpec 檔案,看起來應該如下所示:

    { "CmsPlugins": [ "ActiveDirectory" ], "DomainJoinConfig": { "Sid": "S-1-5-21-4066351383-705263209-1606769140", "MachineAccountName": "WebApp01", "Guid": "ac822f13-583e-49f7-aa7b-284f9a8c97b6", "DnsTreeName": "contoso", "DnsName": "contoso", "NetBiosName": "contoso" }, "ActiveDirectoryConfig": { "GroupManagedServiceAccounts": [ { "Name": "WebApp01", "Scope": "contoso" }, { "Name": "WebApp01", "Scope": "contoso" } ], "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": "{\"credentialArn\": \"arn:aws:secretsmanager:aws-region:111122223333:secret:gmsa-plugin-input\"}" } } }

在任務定義中參考登入資料規格檔案

Amazon ECS 支援下列方法,可在任務定義credentialSpecs欄位中參考檔案路徑。對於每個選項,您可以提供 credentialspec:domainlesscredentialspec:,取決於您是將容器執行個體加入單一網域,還是使用無網域 gMSA,分別是 。

Amazon S3 儲存貯體

將憑證規格新增至 Amazon S3 儲存貯體,然後在任務定義credentialSpecs欄位中參考 Amazon S3 儲存貯體的 Amazon Resource Name (ARN)。

{ "family": "", "executionRoleArn": "", "containerDefinitions": [ { "name": "", ... "credentialSpecs": [ "credentialspecdomainless:arn:aws:s3:::${BucketName}/${ObjectName}" ], ... } ], ... }

您還必須將下列許可作為內嵌政策新增至 Amazon ECS 任務執行 IAM 角色,以授予任務對 Amazon S3 儲存貯體的存取權。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::{bucket_name}", "arn:aws:s3:::{bucket_name}/{object}" ] } ] }

SSM 參數存放區參數

將憑證規格新增至 SSM Parameter Store 參數,然後在任務定義credentialSpecs欄位中參考 SSM Parameter Store 參數的 Amazon Resource Name (ARN)。

{ "family": "", "executionRoleArn": "", "containerDefinitions": [ { "name": "", ... "credentialSpecs": [ "credentialspecdomainless:arn:aws:ssm:region:111122223333:parameter/parameter_name" ], ... } ], ... }

您還必須將下列許可作為內嵌政策新增至 Amazon ECS 任務執行 IAM 角色,以授予任務對 SSM 參數存放區參數的存取權。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:region:111122223333:parameter/parameter_name" ] } ] }

本機檔案

使用本機檔案中的登入資料規格詳細資訊,在任務定義的 credentialSpecs 欄位中參考檔案路徑。參照的檔案路徑必須相對於 C:\ProgramData\Docker\CredentialSpecs 目錄,並使用反斜線 (「\」) 作為檔案路徑分隔符號。

{ "family": "", "executionRoleArn": "", "containerDefinitions": [ { "name": "", ... "credentialSpecs": [ "credentialspec:file://CredentialSpecDir\CredentialSpecFile.json" ], ... } ], ... }