将 gMSA 用于 Fargate 上的 Linux 容器 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 gMSA 用于 Fargate 上的 Linux 容器

Amazon ECS 通过称为组托管服务账户(gMSA)的特殊服务账户支持 Fargate 上的 Linux 容器的 Active Directory 身份验证。

基于 Linux 的网络应用程序(例如 .NET Core 应用程序)可以使用 Active Directory 来促进用户和服务之间的身份验证和授权管理。通过设计与 Active Directory 集成并在加入域的服务器上运行的应用程序,您可以使用此功能。但是,由于 Linux 容器无法加入域,因此您需要配置一个 Linux 容器来使用 gMSA 运行。

注意事项

在将 gMSA 用于 Fargate 上的 Linux 容器之前,请注意以下各项:

  • 您必须运行平台版本 1.4 或更高版本。

  • 您可能需要一台已加入域的 Windows 计算机才能完成先决条件。例如,您可能需要一台已加入域的 Windows 计算机才能使用 PowerShell 在 Active Directory 中创建 gMSA。RSAT Active Director PowerShell 工具仅适用于 Windows。有关更多信息,请参阅安装 Active Directory 管理工具

  • 您必须使用无域 gMSA

    Amazon ECS 使用 Active Directory 凭证规范文件(CredSpec)。该文件包含用于将 gMSA 账户上下文传播到容器的 gMSA 元数据。您将生成 CredSpec 文件,然后将其存储在 Amazon S3 存储桶中。

  • 一个任务只能支持一个 Active Directory。

先决条件

在 Amazon ECS 上为 Linux 容器使用 gMSA 之前,请确保完成以下操作:

  • 您可以使用您希望容器访问的资源设置 Active Directory 域。Amazon ECS 支持以下设置:

    • Amazon Directory Service Active Directory。Amazon Directory Service 是托管在 Amazon EC2 上的 Amazon 托管式 Active Directory。有关更多信息,请参阅 Amazon Directory Service 管理指南中的 Amazon 托管 Microsoft AD 入门

    • 本地 Active Directory。您必须确保 Amazon ECS Linux 容器实例可以加入域。有关更多信息,请参阅 Amazon Direct Connect

  • 您在 Active Directory 中有一个现有 gMSA 账户,以及一个有权访问 gMSA 服务账户的用户。有关更多信息,请参阅 为无域 gMSA 创建 Active Directory 用户

  • 您拥有 Amazon S3 存储桶。有关更多信息,请参阅《Amazon S3 用户指南》中的创建存储桶

在 Amazon ECS 上设置支持 gMSA 的 Linux 容器

准备基础设施

以下步骤是仅执行一次的注意事项和设置。

  • 为无域 gMSA 创建 Active Directory 用户

    当您使用无域 gMSA 时,该容器未加入该域。在容器上运行的其他应用程序无法使用凭证访问该域。使用不同域的任务可以在同一个容器上运行。您可以在 CredSpec 文件中的 Amazon Secrets Manager 中提供密钥的名称。密钥必须包含用户名、密码和要登录到的域。

    此功能与该 gMSA support for non-domain-joined container hosts 功能类似。有关 Windows 功能的更多信息,请参阅 Microsoft Learn 网站上的 gMSA 架构和改进

    1. 在 Active Directory 域中配置用户。Active Directory 中的用户必须具有访问您在任务中使用的 gMSA 服务账户的权限。

    2. 您有一个 VPC 和可以解析 Active Directory 域名的子网。使用指向 Active Directory 服务名称的域名配置具有 DHCP 选项的 VPC。有关如何为 VPC 配置 DHCP 选项的信息,请参阅《Amazon Virtual Private Cloud 用户指南》中的使用 DHCP 选项集

    3. 在 Amazon Secrets Manager 中创建密钥。

    4. 创建凭证规范文件。

设置权限和密钥

针对每个应用程序和每个任务定义,执行一次以下步骤。建议您使用以下最佳实践:授予最低权限和限制策略中使用的权限。这样,每个任务只能读取它需要的密钥。

  1. 在 Active Directory 域中创建用户。Active Directory 中的用户必须具有访问您在任务中使用的 gMSA 服务账户的权限。

  2. 创建 Active Directory 用户后,请在 Amazon Secrets Manager 中创建密钥。有关更多信息,请参阅创建一个 Amazon Secrets Manager 密钥

  3. 将用户的用户名、密码和域分别输入名为 usernamepassworddomainName 的 JSON 键值对。

    {"username":"username","password":"passw0rd", "domainName":"example.com"}
  4. 您还必须将以下权限作为内联策略添加到任务执行 IAM 角色。这样做可以让 credentials-fetcher 进程守护程序访问 Secrets Manager 密钥。将 MySecret 示例替换为 Resource 列表中的密钥的 Amazon 资源名称(ARN)。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:aws-region:111122223333:secret:MySecret" ] } ] }
    注意

    如果您使用自己的 KMS 密钥来加密您的密钥,则必须向该角色添加必要的权限并将此角色添加到 Amazon KMS 密钥政策中。

  5. 将凭证规范添加到 Amazon S3 存储桶。然后在任务定义的 credentialSpecs 字段中引用 Amazon S3 存储桶的 Amazon 资源名称(ARN)。

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

    为了让您的任务可以访问 S3 存储桶,请将以下权限作为内联策略添加到 Amazon ECS 任务执行 IAM 角色中。

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

凭证规范文件

Amazon ECS 使用 Active Directory 凭证规范文件(CredSpec)。该文件包含用于将 gMSA 账户上下文传播到 Linux 容器的 gMSA 元数据。您可以生成 CredSpec 并在任务定义的 credentialSpecs 字段中引用该文件。CredSpec 文件不包含任何机密。

下面是一个 CredSpec 示例文件。

{ "CmsPlugins": [ "ActiveDirectory" ], "DomainJoinConfig": { "Sid": "S-1-5-21-2554468230-2647958158-2204241789", "MachineAccountName": "WebApp01", "Guid": "8665abd4-e947-4dd0-9a51-f8254943c90b", "DnsTreeName": "example.com", "DnsName": "example.com", "NetBiosName": "example" }, "ActiveDirectoryConfig": { "GroupManagedServiceAccounts": [ { "Name": "WebApp01", "Scope": "example.com" } ], "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": { "CredentialArn": "arn:aws:secretsmanager:aws-region:111122223333:secret:MySecret" } } } }
创建 CredSpec 并将其上传到 Amazon S3

您可以通过在已加入域的 Windows 计算机上使用 CredSpec PowerShell 模块来创建 CredSpec。按照 Microsoft Learn 网站上的创建凭证规范中的步骤进行操作。

创建凭证规范文件后,将其上传到 Amazon S3 存储桶。将 CredSpec 文件复制到您正在其中运行 Amazon CLI 命令的计算机或环境中。

运行以下 Amazon CLI 命令以将 CredSpec 上载到 Amazon S3。将 MyBucket 替换为您的 Amazon S3 存储桶的名称。您可以将文件作为对象存储在任何存储桶和位置,但您必须允许访问该存储桶和您附加到任务执行角色的策略中的位置。

对于 PowerShell,使用以下命令:

$ Write-S3Object -BucketName "MyBucket" -Key "ecs-domainless-gmsa-credspec" -File "gmsa-cred-spec.json"

以下 Amazon CLI 命令使用由 sh 和兼容的 shell 使用的反斜杠连续字符。

$ aws s3 cp gmsa-cred-spec.json \ s3://MyBucket/ecs-domainless-gmsa-credspec