

# 将 gMSA 用于 Fargate 上的 Linux 容器
<a name="fargate-linux-gmsa"></a>

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

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

## 注意事项
<a name="fargate-linux-gmsa-considerations"></a>

在将 gMSA 用于 Fargate 上的 Linux 容器之前，请注意以下各项：
+ 您必须运行平台版本 1.4 或更高版本。
+ 您可能需要一台已加入域的 Windows 计算机才能完成先决条件。例如，您可能需要一台已加入域的 Windows 计算机才能使用 PowerShell 在 Active Directory 中创建 gMSA。RSAT Active Director PowerShell 工具仅适用于 Windows。有关更多信息，请参阅[安装 Active Directory 管理工具](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_install_ad_tools.html)。
+ 您必须使用**无域 gMSA**。

  Amazon ECS 使用 Active Directory 凭证规范文件（CredSpec）。该文件包含用于将 gMSA 账户上下文传播到容器的 gMSA 元数据。您将生成 CredSpec 文件，然后将其存储在 Amazon S3 存储桶中。
+ 一个任务只能支持一个 Active Directory。

## 先决条件
<a name="fargate-linux-gmsa-prerequisites"></a>

在 Amazon ECS 上为 Linux 容器使用 gMSA 之前，请确保完成以下操作：
+ 您可以使用您希望容器访问的资源设置 Active Directory 域。Amazon ECS 支持以下设置：
  + Directory Service Active Directory。Directory Service 是托管在 Amazon EC2 上的 AWS 托管式 Active Directory。有关更多信息，请参阅 *AWS Directory Service 管理指南*中的 [AWS 托管 Microsoft AD 入门](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html)。
  + 本地 Active Directory。您必须确保 Amazon ECS Linux 容器实例可以加入域。有关更多信息，请参阅 [AWS Direct Connect](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-direct-connect-network-to-amazon.html)。
+ 您在 Active Directory 中有一个现有 gMSA 账户，以及一个有权访问 gMSA 服务账户的用户。有关更多信息，请参阅 [为无域 gMSA 创建 Active Directory 用户](#fargate-linux-gmsa-initial-domainless)。
+ 您拥有 Amazon S3 存储桶。有关更多信息，请参阅《Amazon S3 用户指南》**中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

## 在 Amazon ECS 上设置支持 gMSA 的 Linux 容器
<a name="fargate-linux-gmsa-setup"></a>
<a name="linux-gmsa-setup-infra"></a>
**准备基础设施**  
以下步骤是仅执行一次的注意事项和设置。
+ <a name="fargate-linux-gmsa-initial-domainless"></a>

**为无域 gMSA 创建 Active Directory 用户**

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

  此功能与该 *gMSA support for non-domain-joined container hosts* 功能类似。有关 Windows 功能的更多信息，请参阅 Microsoft Learn 网站上的 [gMSA 架构和改进](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts#gmsa-architecture-and-improvements)。

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

  1. 您有一个 VPC 和可以解析 Active Directory 域名的子网。使用指向 Active Directory 服务名称的域名配置具有 DHCP 选项的 VPC。有关如何为 VPC 配置 DHCP 选项的信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的[使用 DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/DHCPOptionSet.html)。

  1. 在 AWS Secrets Manager 中创建密钥。

  1. 创建凭证规范文件。

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

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

1. 创建 Active Directory 用户后，请在 AWS Secrets Manager 中创建密钥。有关更多信息，请参阅[创建一个 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。

1. 将用户的用户名、密码和域分别输入名为 `username`、`password` 和 `domainName` 的 JSON 键值对。

   ```
   {"username":"username","password":"passw0rd", "domainName":"example.com"}
   ```

1. <a name="fargate-linux-gmsa-domainless-secret"></a>您还必须将以下权限作为内联策略添加到任务执行 IAM 角色。这样做可以让 `credentials-fetcher` 进程守护程序访问 Secrets Manager 密钥。将 `MySecret` 示例替换为 `Resource` 列表中的密钥的 Amazon 资源名称（ARN）。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue"
               ],
               "Resource": [
               "arn:aws:secretsmanager:us-east-1:111122223333:secret:MySecret"
               ]
           }
       ]
   }
   ```

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

1. <a name="linux-gmsa-credspec-ssm"></a>将凭证规范添加到 Amazon S3 存储桶。然后在任务定义的 `credentialSpecs` 字段中引用 Amazon S3 存储桶的 Amazon 资源名称（ARN）。

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

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

------
#### [ JSON ]

****  

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

------

## 凭证规范文件
<a name="fargate-linux-gmsa-credentialspec"></a>

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"
            }
        }
    }
}
```
<a name="fargate-linux-gmsa-credentialspec-create"></a>
**创建 CredSpec 并将其上传到 Amazon S3**  
您可以通过在已加入域的 Windows 计算机上使用 CredSpec PowerShell 模块来创建 CredSpec。按照 Microsoft Learn 网站上的[创建凭证规范](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts#create-a-credential-spec)中的步骤进行操作。

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

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

对于 PowerShell，使用以下命令：

```
$ Write-S3Object -BucketName "amzn-s3-demo-bucket" -Key "ecs-domainless-gmsa-credspec" -File "gmsa-cred-spec.json"
```

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

```
$ aws s3 cp gmsa-cred-spec.json \
s3://amzn-s3-demo-bucket/ecs-domainless-gmsa-credspec
```