EC2 Windows 컨테이너용 gMSA 사용 방법 배우기

EC2 Windows 컨테이너용 gMSA 사용 방법 배우기

Amazon ECS는 그룹 관리 서비스 계정(group Managed Service Account, gMSA)이라는 특별한 종류의 서비스 계정을 통해 Windows 컨테이너용 Active Directory 인증을 지원해요. .NET 애플리케이션 같은 Windows 기반 네트워크 애플리케이션은 종종 Active Directory를 사용해 사용자와 서비스 간의 인증 및 권한 부여 관리를 용이하게 해요. 개발자는 이런 목적으로 애플리케이션을 Active Directory와 통합해 도메인에 조인된 서버에서 실행되도록 설계하는 경우가 흔해요. Windows 컨테이너는 도메인에 조인될 수 없으므로 gMSA로 실행되도록 Windows 컨테이너를 구성해야 해요.

출처: 문서

본문

gMSA로 실행되는 Windows 컨테이너는 호스트 Amazon EC2 인스턴스에 의존해 Active Directory 도메인 컨트롤러에서 gMSA 자격 증명을 검색해 컨테이너 인스턴스에 제공해요. 자세한 내용은 Create gMSAs for Windows containers를 참고하세요. 참고: 이 기능은 Fargate의 Windows 컨테이너에서 지원되지 않아요.

토픽

  • 고려 사항 (Considerations)
  • 사전 준비 (Prerequisites)
  • Amazon ECS에서 Windows 컨테이너용 gMSA 설정

고려 사항 (Considerations)

Windows 컨테이너에 gMSA를 사용할 때 다음을 고려해야 해요.

  • 컨테이너 인스턴스에 Amazon ECS-optimized Windows Server 2016 Full AMI를 사용할 때, 컨테이너 호스트 이름은 credential spec 파일에 정의된 gMSA 계정 이름과 같아야 해요. 컨테이너의 호스트 이름을 지정하려면 hostname 컨테이너 정의 파라미터를 사용하세요. 자세한 내용은 Network settings를 참고하세요.
  • domainless gMSA와 각 인스턴스를 단일 도메인에 조인하는 방법 중에서 선택할 수 있어요. domainless gMSA를 사용하면 컨테이너 인스턴스가 도메인에 조인되지 않고, 인스턴스의 다른 애플리케이션은 자격 증명을 사용해 도메인에 접근할 수 없으며, 서로 다른 도메인에 조인하는 태스크가 같은 인스턴스에서 실행될 수 있어요. 그런 다음 CredSpec과 (domainless gMSA용으로) 선택적으로 Active Directory 사용자 자격 증명의 데이터 저장소를 선택합니다.
  • Amazon ECS는 Active Directory 자격 증명 사양 파일(CredSpec)을 사용해요. 이 파일에는 컨테이너에 gMSA 계정 컨텍스트를 전파하는 데 사용되는 gMSA 메타데이터가 포함돼요. CredSpec 파일을 생성한 다음 컨테이너 인스턴스의 운영 체제에 특화된 다음 표의 CredSpec 저장소 옵션 중 하나에 저장해요. domainless 방법을 사용하려면 CredSpec 파일의 선택적 섹션에서 다음 표의 domainless 사용자 자격 증명 저장소 옵션 중 하나에 자격 증명을 지정할 수 있어요.
저장 위치 Linux Windows
Amazon Simple Storage Service CredSpec CredSpec
AWS Secrets Manager domainless 사용자 자격 증명 domainless 사용자 자격 증명
Amazon EC2 Systems Manager Parameter Store CredSpec CredSpec, domainless 사용자 자격 증명
로컬 파일 N/A CredSpec

사전 준비 (Prerequisites)

Amazon ECS와 함께 Windows 컨테이너용 gMSA 기능을 사용하기 전에 다음을 완료했는지 확인하세요.

  • 컨테이너가 접근하려는 리소스가 있는 Active Directory 도메인을 설정했습니다. Amazon ECS는 다음 설정을 지원해요.
    • Directory Service Active Directory. Directory Service는 Amazon EC2에서 호스팅되는 AWS 관리형 Active Directory예요. 자세한 내용은 AWS Directory Service Administration Guide의 Getting Started with AWS Managed Microsoft AD를 참고하세요.
    • 온프레미스 Active Directory. Amazon ECS Linux 컨테이너 인스턴스가 도메인에 조인할 수 있는지 확인해야 해요. 자세한 내용은 AWS Direct Connect를 참고하세요.
  • Active Directory에 기존 gMSA 계정이 있습니다. 자세한 내용은 Create gMSAs for Windows containers를 참고하세요.
  • domainless gMSA를 사용하기로 선택했거나, Amazon ECS 태스크를 호스팅하는 Amazon ECS Windows 컨테이너 인스턴스가 Active Directory에 도메인 조인되어 있고 gMSA 계정에 접근할 수 있는 Active Directory 보안 그룹의 구성원이어야 합니다. domainless gMSA를 사용하면 컨테이너 인스턴스가 도메인에 조인되지 않고, 인스턴스의 다른 애플리케이션은 자격 증명을 사용해 도메인에 접근할 수 없으며, 서로 다른 도메인에 조인하는 태스크가 같은 인스턴스에서 실행될 수 있어요.
  • 필수 IAM 권한을 추가했습니다. 필요한 권한은 초기 자격 증명과 자격 증명 사양 저장에 선택한 방법에 따라 달라져요.
    • 초기 자격 증명에 domainless gMSA를 사용한다면 Amazon EC2 인스턴스 역할에 AWS Secrets Manager용 IAM 권한이 필요해요.
    • 자격 증명 사양을 SSM Parameter Store에 저장한다면 태스크 실행 역할에 Amazon EC2 Systems Manager Parameter Store용 IAM 권한이 필요해요.
    • 자격 증명 사양을 Amazon S3에 저장한다면 태스크 실행 역할에 Amazon Simple Storage Service용 IAM 권한이 필요해요.

Amazon ECS에서 Windows 컨테이너용 gMSA 설정

Amazon ECS에서 Windows 컨테이너용 gMSA를 설정하려면 사전 준비 구성이 포함된 전체 튜토리얼인 Using Amazon ECS Windows containers with domainless gMSA using the AWS CLI를 따를 수 있어요. 다음 섹션에서는 CredSpec 구성을 자세히 다룹니다.

토픽

  • 예제 CredSpec
  • Domainless gMSA 설정
  • 태스크 정의에서 자격 증명 사양 파일 참조

예제 CredSpec

Amazon ECS는 Windows 컨테이너에 gMSA 계정 컨텍스트를 전파하는 데 사용되는 gMSA 메타데이터가 포함된 자격 증명 사양 파일을 사용해요. 자격 증명 사양 파일을 생성하고 태스크 정의의 credentialSpec 필드에서 참조할 수 있어요. 자격 증명 사양 파일에는 시크릿이 포함되지 않아요.

다음은 자격 증명 사양 파일의 예제예요.

{
    "CmsPlugins": [
        "ActiveDirectory"
    ],
    "DomainJoinConfig": {
        "Sid": "S-1-5-21-2554468230-2647958158-2204241789",
        "MachineAccountName": "WebApp01",
        "Guid": "8665abd4-e947-4dd0-9a51-f8254943c90b",
        "DnsTreeName": "contoso.com",
        "DnsName": "contoso.com",
        "NetBiosName": "contoso"
    },
    "ActiveDirectoryConfig": {
        "GroupManagedServiceAccounts": [
            {
                "Name": "WebApp01",
                "Scope": "contoso.com"
            }
        ]
    }
}

Domainless gMSA 설정

컨테이너 인스턴스를 단일 도메인에 조인하는 대신 domainless gMSA를 권장해요. domainless gMSA를 사용하면 컨테이너 인스턴스가 도메인에 조인되지 않고, 인스턴스의 다른 애플리케이션은 자격 증명을 사용해 도메인에 접근할 수 없으며, 서로 다른 도메인에 조인하는 태스크가 같은 인스턴스에서 실행될 수 있어요.

CredSpec을 저장소 옵션 중 하나에 업로드하기 전에 Secrets Manager 또는 SSM Parameter Store의 시크릿 ARN으로 CredSpec에 정보를 추가하세요. 자세한 내용은 Microsoft Learn 웹사이트의 Additional credential spec configuration for non-domain-joined container host use case를 참고하세요.

Domainless gMSA 자격 증명 형식 – 다음은 Active Directory용 domainless gMSA 자격 증명의 JSON 형식이에요. 자격 증명을 Secrets Manager 또는 SSM Parameter Store에 저장하세요.

{
    "username":"WebApp01",
    "password":"Test123!",
    "domainName":"contoso.com"
}

ActiveDirectoryConfig 내부의 CredSpec 파일에 다음 정보를 추가하세요. ARN을 Secrets Manager 또는 SSM Parameter Store의 시크릿으로 바꾸세요. PluginGUID 값은 다음 예제 스니펫의 GUID와 일치해야 하며 필수예요.


    "HostAccountConfig": {
        "PortableCcgVersion": "1",
        "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}",
        "PluginInput": "{\"credentialArn\": \"arn:aws:secretsmanager:aws-region:111122223333:secret:gmsa-plugin-input\"}"
    }

SSM Parameter Store의 시크릿을 이 형식의 ARN으로 사용할 수도 있어요: "arn:aws:ssm:aws-region:111122223333:parameter/gmsa-plugin-input".

CredSpec 파일을 수정한 후에는 다음 예제처럼 보여야 해요.

{
  "CmsPlugins": [
    "ActiveDirectory"
  ],
  "DomainJoinConfig": {
    "Sid": "S-1-5-21-4066351383-705263209-1606769140",
    "MachineAccountName": "WebApp01",
    "Guid": "ac822f13-583e-49f7-aa7b-284f9a8c97b6",
    "DnsTreeName": "contoso",
    "DnsName": "contoso",
    "NetBiosName": "contoso"
  },
  "ActiveDirectoryConfig": {
    "GroupManagedServiceAccounts": [
      {
        "Name": "WebApp01",
        "Scope": "contoso"
      },
      {
        "Name": "WebApp01",
        "Scope": "contoso"
      }
    ],
    "HostAccountConfig": {
      "PortableCcgVersion": "1",
      "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}",
      "PluginInput": "{\"credentialArn\": \"arn:aws:secretsmanager:aws-region:111122223333:secret:gmsa-plugin-input\"}"
    }
  }
}

태스크 정의에서 자격 증명 사양 파일 참조 (Referencing a Credential Spec File in a Task Definition)

Amazon ECS는 태스크 정의의 credentialSpecs 필드에서 파일 경로를 참조하는 다음 방법을 지원해요. 각 옵션에 대해 컨테이너 인스턴스를 단일 도메인에 조인하는지 또는 domainless gMSA를 사용하는지에 따라 각각 credentialspec: 또는 domainlesscredentialspec:을 제공할 수 있어요.

Amazon S3 버킷 – 자격 증명 사양을 Amazon S3 버킷에 추가한 다음 태스크 정의의 credentialSpecs 필드에서 Amazon S3 버킷의 Amazon Resource Name(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:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::{bucket_name}",
                "arn:aws:s3:::{bucket_name}/{object}"
            ]
        }
    ]
}

SSM Parameter Store 파라미터 – 자격 증명 사양을 SSM Parameter Store 파라미터에 추가한 다음 태스크 정의의 credentialSpecs 필드에서 SSM Parameter Store 파라미터의 Amazon Resource Name(ARN)을 참조하세요.

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

또한 태스크에 SSM Parameter Store 파라미터에 대한 접근을 주기 위해 Amazon ECS 태스크 실행 IAM 역할에 다음 권한을 인라인 정책으로 추가해야 해요.

JSON:

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

로컬 파일 (Local File) – 자격 증명 사양 세부 정보가 로컬 파일에 있을 때 태스크 정의의 credentialSpecs 필드에서 파일 경로를 참조하세요. 참조되는 파일 경로는 C:\ProgramData\Docker\CredentialSpecs 디렉터리에 상대적이어야 하며 백슬래시(‘\’)를 파일 경로 구분자로 사용해야 해요.

{
    "family": "",
    "executionRoleArn": "",
    "containerDefinitions": [
        {
            "name": "",
            ...
            "credentialSpecs": [
                "credentialspec:file://CredentialSpecDir\CredentialSpecFile.json"
            ],
            ...
        }
    ],
    ...
}