

# Fargate의 Linux 컨테이너에서 gMSA 사용
<a name="fargate-linux-gmsa"></a>

Amazon ECS는 *그룹 관리형 서비스 계정*(gMSA)이라는 특수한 종류의 서비스 계정을 통해 Fargate의 Linux 컨테이너에 대한 Active Directory 인증을 지원합니다.

.NET Core 애플리케이션과 같은 Linux 기반 네트워크 애플리케이션은 Active Directory를 사용하여 사용자와 서비스 간의 인증 및 권한 부여 관리를 용이하게 할 수 있습니다. Active Directory와 통합되고 도메인 가입된 서버에서 실행되는 애플리케이션을 설계하여 이 기능을 사용할 수 있습니다. 하지만 Linux 컨테이너는 도메인에 가입할 수 없으므로 gMSA로 실행할 Linux 컨테이너를 구성해야 합니다.

## 고려 사항
<a name="fargate-linux-gmsa-considerations"></a>

Fargate의 Linux 컨테이너에 gMSA를 사용하기 전에 다음을 고려합니다.
+ 플랫폼 버전 1.4 이상을 실행해야 합니다.
+ 사전 조건을 완료하려면 도메인에 가입된 Windows 컴퓨터가 필요할 수 있습니다. 예를 들어, PowerShell을 사용하여 Active Directory에서 gMSA를 생성하려면 도메인에 가입된 Windows 컴퓨터가 필요할 수 있습니다. RSAT Active Director PowerShell 도구는 Windows에서만 사용할 수 있습니다. 자세한 내용은 [Installing the Active Directory administration tools](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를 사용하는 경우 컨테이너는 도메인에 참여하지 않습니다. 컨테이너에서 실행되는 다른 애플리케이션은 자격 증명을 사용하여 도메인에 액세스할 수 없습니다. 다른 도메인을 사용하는 작업은 동일한 컨테이너에서 실행할 수 있습니다. AWS Secrets Manager에서 CredSpec 파일에 보안 암호의 이름을 제공합니다. 보안 암호에는 사용자 이름, 암호 및 로그인할 도메인이 포함되어야 합니다.

  이 기능은 *gMSA support for non-domain-joined container hosts* 기능과 유사합니다. Windows 기능에 대한 자세한 내용은 Microsoft Learn 웹 사이트의 [gMSA architecture and improvements](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts#gmsa-architecture-and-improvements)를 참조하세요.

  1. Active Directory 도메인에서 사용자를 구성합니다. Active Directory의 사용자는 작업에서 사용하는 gMSA 서비스 계정에 액세스할 수 있는 권한이 있어야 합니다.

  1. Active Directory 도메인 이름을 확인할 수 있는 VPC와 서브넷이 있습니다. Active Directory 서비스 이름을 가리키는 도메인 이름을 사용하여 DHCP 옵션을 통해 VPC를 구성합니다. VPC에 대한 DHCP 옵션 구성 방법에 대한 자세한 내용은 **Amazon Virtual Private Cloud 사용 설명서의 [Work with DHCP option sets](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` 대몬(daemon)이 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}"
               ],
               ...
           }
       ],
       ...
   }
   ```

   또한 작업에 Amazon 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 웹 사이트에서 [Create a credential spec](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts#create-a-credential-spec)의 단계를 따릅니다.

자격 증명 사양 파일을 생성한 후 Amazon S3 버킷에 업로드합니다. AWS CLI 명령을 실행 중인 컴퓨터나 환경에 CredSpec 파일을 복사합니다.

다음 AWS CLI 명령을 실행하여 Amazon S3에 CredSpec를 업로드합니다. `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` 및 호환 쉘에서 사용되는 백슬래시 연속 문자를 사용합니다.

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