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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

gMSAs用于Linux容器

Amazon ECS 支持通过一种名为群组托管服务账户 (gMSA) 的特殊服务账户对 Linux 容器进行 Active Directory 身份验证。

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

使用运行的Linux容器gMSA依赖于在容器主机 Amazon EC2 实例上运行的credentials-fetcher守护程序。也就是说,守护程序从 Active Directory 域控制器检索gMSA凭证,然后将这些凭据传输到容器实例。有关服务帐户的更多信息,请参阅 Microsoft Learn 网站上的gMSAs为 Windows 创建容器

注意

Fargate 不支持此功能。Linux在 Fargate 上,你可以按照在 Amazon ECS 上对Linux容器使用Windows身份验证的示例进行操作。

注意事项

在使用gMSALinux容器之前,请考虑以下几点:

  • 如果您的容器在 EC2 上运行,则可以gMSA用于Windows容器和Linux容器。不支持 Fargate。

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

  • 您可以在无域gMSA和将每个实例加入单个域之间进行选择。通过使用 domainlessgMSA,容器实例不会加入该域,实例上的其他应用程序无法使用凭证访问该域,并且加入不同域的任务可以在同一个实例上运行。

    然后,为无域gMSA的 Active Directory 用户凭证选择数据存储,也可以选择数据存储。CredSpec

    亚马逊 ECS 使用 Active Directory 凭证规范文件 (CredSpec)。此文件包含用于将gMSA账户上下文传播到容器的gMSA元数据。您可以生成该CredSpec文件,然后将其存储在下表中的一个CredSpec存储选项中,该存储选项特定于容器实例的操作系统。要使用无域方法,CredSpec文件中的可选部分可以在下表中的domainless user credentials存储选项之一中指定凭据,这些凭据特定于容器实例的操作系统。

    gMSA按操作系统划分的数据存储选项
    存储位置 Linux Windows
    Amazon Simple Storage Service CredSpec CredSpec
    Amazon Secrets Manager 无域用户凭证 无域用户凭证
    亚马逊 EC2 Systems Manager 参数存储 CredSpec CredSpec,无域用户凭证
    本地文件 不适用 CredSpec

先决条件

在 Amazon ECS 上使用gMSA适用于 Linux 的容器功能之前,请务必完成以下操作:

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

    • Amazon Directory Service活动目录。 Amazon Directory Service是一个Amazon托管在 Amazon EC2 上的托管活动目录。有关更多信息,请参阅 Amazon Directory Service 管理指南中的 Amazon 托管 Microsoft AD 入门

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

  • 您在活动目录中已有gMSA账户。有关更多信息,请参阅gMSAs用于Linux容器

  • 您已在 Amazon ECS Linux 容器实例credentials-fetcher上安装并正在运行该守护程序。您还向credentials-fetcher守护程序添加了一组初始凭证,以便通过 Active Directory 进行身份验证。

    注意

    credentials-fetcher守护程序仅适用于亚马逊 Linux 2023 和 Fedora 37 及更高版本。该守护程序不适用于亚马逊 Linux 2。有关更多信息,请参阅上的 aws/creden als-fetcher。 GitHub

  • 您可以为credentials-fetcher守护程序设置凭证,以便通过 Active Directory 进行身份验证。凭证必须是有权访问该gMSA账户的 Active Directory 安全组的成员。里面有多个选项决定是要将实例加入域,还是要使用无域名。gMSA

  • 您添加了所需的 IAM 权限。所需的权限取决于您为初始证书和存储凭证规范选择的方法:

    • 如果您使用无域gMSA作为初始证书,则任务执行角色需要Amazon Secrets Manager的 IAM 权限。

    • 如果您将证书规范存储在 SSM 参数存储中,则任务执行角色需要获得 Amazon EC2 Systems Manager 参数存储的 IAM 权限。

    • 如果您将证书规范存储在 Amazon S3 中,则任务执行角色需要亚马逊简单存储服务的 IAM 权限。

在亚马逊 gMSA ECS 上设置支持Linux容器

准备基础架构

以下步骤是仅执行一次的注意事项和设置。完成这些步骤后,您可以自动创建容器实例以重复使用此配置。

决定如何提供初始证书,并在可重复使用的 EC2 启动模板中配置 EC2 用户数据以安装credentials-fetcher守护程序。

  1. 决定是要将实例加入域,还是要使用无域名。gMSA
    • 将 EC2 实例加入活动目录域

      • 通过用户数据加入实例

        在 EC2 启动模板中将加入 Active Directory 域的步骤添加到 EC2 用户数据中。多个 Amazon EC2 Auto Scaling 组可以使用相同的启动模板。

        你可以在 Fedora 文档中使用这些步骤加入活动目录或FreeIPA域名

    • 为无域名创建活动目录用户 gMSA

      credentials-fetcher守护程序有一个叫做无域gMSA的功能。此功能需要一个域,但是 EC2 实例不需要加入该域。通过使用 domainlessgMSA,容器实例不会加入该域,实例上的其他应用程序无法使用凭证访问该域,并且加入不同域的任务可以在同一个实例上运行。相反,您可以在CredSpec文件Amazon Secrets Manager中提供密钥的名称。密钥必须包含用户名、密码和要登录的域。

      该功能受支持,并且可以用于 Linux 和 Windows 容器。

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

      1. 在你的活动目录域中注册一个用户。Active Directory 中的用户必须具有访问您在任务中使用的gMSA服务帐户的权限。

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

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

        {"username":"username","password":"passw0rd", "domainName":"example.com"}
      4. 向CredSpec文件中添加服务帐户的配置。附加HostAccountConfig内容包含 Secrets Manager 中密钥的亚马逊资源名称 (ARN)。

        在 Windows 上,PluginGUID必须与以下示例片段中的 GUID 相匹配。在 Linux 上,会PluginGUID被忽略。用您的MySecret密钥的亚马逊资源名称 (ARN) 替换为示例。

        "ActiveDirectoryConfig": { "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": { "CredentialArn": "arn:aws:secretsmanager:aws-region:111122223333:secret:MySecret" } }
      5. 无域gMSA功能需要任务执行角色中的额外权限。按照步骤操作(可选)无域密钥 gMSA

  2. 配置实例并安装credentials-fetcher守护程序

    您可以credentials-fetcher在 EC2 启动模板中安装带有用户数据脚本的守护程序。以下示例演示了两种类型的用户数据cloud-configYAML或bash脚本。这些示例适用于亚马逊 Linux 2023 (AL2023)。MyCluster替换为您希望这些实例加入的 Amazon ECS 集群的名称。

    • cloud-config YAML
      Content-Type: text/cloud-config package_reboot_if_required: true packages: # prerequisites - dotnet - realmd - oddjob - oddjob-mkhomedir - sssd - adcli - krb5-workstation - samba-common-tools # https://github.com/aws/credentials-fetcher gMSA credentials management for containers - credentials-fetcher write_files: # configure the ECS Agent to join your cluster. # replace MyCluster with the name of your cluster. - path: /etc/ecs/ecs.config owner: root:root permissions: '0644' content: | ECS_CLUSTER=MyCluster ECS_GMSA_SUPPORTED=true runcmd: # start the credentials-fetcher daemon and if it succeeded, make it start after every reboot - "systemctl start credentials-fetcher" - "systemctl is-active credentials-fetch && systemctl enable credentials-fetcher"
    • bash脚本

      如果您更熟悉bash脚本并且有多个变量要写入/etc/ecs/ecs.config,请使用以下heredoc格式。此格式会将以 catEOF 开头的行之间的所有内容写入到配置文件。

      #!/usr/bin/env bash set -euxo pipefail # prerequisites timeout 30 dnf install -y dotnet realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation samba-common-tools # install https://github.com/aws/credentials-fetcher gMSA credentials management for containers timeout 30 dnf install -y credentials-fetcher # start credentials-fetcher systemctl start credentials-fetcher systemctl is-active credentials-fetch && systemctl enable credentials-fetcher cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyCluster ECS_GMSA_SUPPORTED=true EOF

    您可以为credentials-fetcher守护程序设置一些可选的配置变量。/etc/ecs/ecs.config我们建议您在 YAML 块中设置用户数据中的变量,或者heredoc类似于前面的示例。这样可以防止多次编辑文件时可能出现的部分配置问题。有关 ECS 代理配置的更多信息,请参阅上的 Amazon ECS 容器代理 GitHub。

    • 或者,CREDENTIALS_FETCHER_HOST如果您更改credentials-fetcher守护程序配置以将套接字移到其他位置,则可以使用该变量。

设置权限和机密

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

  1. (可选)无域密钥 gMSA

    如果您使用无域方法,但实例未加入域,请按照此步骤操作。

    您必须将以下权限作为内联策略添加到任务执行 IAM 角色中。这样做可以让credentials-fetcher守护程序访问 Secrets Manager 密钥。将MySecret示例替换为列表中您的密钥的亚马逊资源名称 (ARN)。Resource

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

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

  2. 决定是使用 SSM 参数存储还是 S3 来存储 CredSpec

    Amazon ECS 支持使用以下方法在任务定义的 credentialSpecs 字段中引用文件路径。

    如果您将实例加入单个域,请使用字符串中 ARN 开头的前缀credentialspec:。如果您使用无域名gMSA,则使用。credentialspecdomainless:

    有关 CredSpec 的更多信息,请参阅 凭证规格文件

    • Amazon S3 存储桶

      将凭证规范添加到 Amazon S3 存储桶。然后,在任务定义credentialSpecs字段中引用 Amazon S3 存储桶的亚马逊资源名称 (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:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::{bucket_name}", "arn:aws:s3:::{bucket_name}/{object}" ] } ] }
    • SSM Parameter Store 参数

      将凭证规范添加到 SSM 参数存储参数中。然后,在任务定义credentialSpecs字段中引用 SSM 参数存储参数的亚马逊资源名称 (ARN)。

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

      要向您的任务授予访问 SSM Parameter Store 参数的权限,请将以下权限作为内联策略添加到 Amazon ECS 任务执行 IAM 角色中。

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

凭证规格文件

亚马逊 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

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