本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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/credenals-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
守护程序。
-
决定是要将实例加入域,还是要使用无域名。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架构和改进
。 -
在你的活动目录域中注册一个用户。Active Directory 中的用户必须具有访问您在任务中使用的gMSA服务帐户的权限。
-
在 Amazon Secrets Manager Active Directory 中创建用户后,在中创建密钥。有关更多信息,请参阅创建Amazon Secrets Manager密钥。
-
将用户的用户名、密码和域分别输入名为
password
和domainName
的 JSON 键值对。username
{"username":"
username
","password":"passw0rd
", "domainName":"example.com"} -
向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 -
无域gMSA功能需要任务执行角色中的额外权限。按照步骤操作(可选)无域密钥 gMSA。
-
-
-
配置实例并安装
credentials-fetcher
守护程序您可以
credentials-fetcher
在 EC2 启动模板中安装带有用户数据脚本的守护程序。以下示例演示了两种类型的用户数据cloud-config
YAML或bash脚本。这些示例适用于亚马逊 Linux 2023 (AL2023)。MyCluster
替换为您希望这些实例加入的 Amazon ECS 集群的名称。-
cloud-config
YAMLContent-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
格式。此格式会将以 cat 和EOF
开头的行之间的所有内容写入到配置文件。#!/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
守护程序配置以将套接字移到其他位置,则可以使用该变量。
-
设置权限和机密
对每个应用程序和每个任务定义执行一次以下步骤。我们建议您使用授予最小权限的最佳实践,并缩小策略中使用的权限。这样,每个任务只能读取它需要的秘密。
-
(可选)无域密钥 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密钥策略中。
-
决定是使用 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 网站上创建凭证规范