Fargate에서 Linux 컨테이너용 gMSA 사용하기
Fargate에서 Linux 컨테이너용 gMSA 사용하기
Amazon ECS는 group Managed Service Account(gMSA)라는 특별한 종류의 서비스 계정을 통해 Fargate의 Linux 컨테이너에 대한 Active Directory 인증을 지원해요. .NET Core 애플리케이션 같은 Linux 기반 네트워크 애플리케이션은 Active Directory를 사용해 사용자와 서비스 사이의 인증·권한 부여 관리를 용이하게 할 수 있습니다.
출처: 문서
본문
이 기능은 Active Directory와 통합되고 도메인에 가입된 서버에서 실행되도록 설계된 애플리케이션으로 사용할 수 있어요. 그러나 Linux 컨테이너는 도메인에 가입될 수 없으므로, Linux 컨테이너를 gMSA로 실행하도록 구성해야 합니다.
고려 사항
Fargate에서 Linux 컨테이너용 gMSA를 사용하기 전에 다음을 고려하세요:
- 플랫폼 버전 1.4 이상을 실행 중이어야 해요.
- 사전 요구 사항을 완료하려면 도메인에 가입된 Windows 컴퓨터가 필요할 수 있어요. 예를 들어 PowerShell로 Active Directory에서 gMSA를 만들려면 도메인에 가입된 Windows 컴퓨터가 필요할 수 있습니다. RSAT Active Directory PowerShell 도구는 Windows에서만 사용할 수 있어요. 자세한 내용은 Active Directory 관리 도구 설치(Installing the Active Directory administration tools)를 참고하세요.
- 도메인리스 gMSA(domainless gMSA)를 사용해야 해요. Amazon ECS는 Active Directory 자격 증명 사양 파일(CredSpec)을 사용합니다. 이 파일에는 gMSA 계정 컨텍스트를 컨테이너에 전파하는 데 사용되는 gMSA 메타데이터가 포함돼요. CredSpec 파일을 생성한 뒤 Amazon S3 버킷에 저장합니다.
- 태스크는 하나의 Active Directory만 지원할 수 있어요.
사전 요구 사항
Amazon ECS에서 Linux 컨테이너용 gMSA 기능을 사용하기 전에 다음을 완료했는지 확인하세요:
- 컨테이너가 액세스할 리소스가 있는 Active Directory 도메인을 설정합니다. Amazon ECS는 다음 구성을 지원해요:
- Directory Service Active Directory. Directory Service는 Amazon EC2에 호스팅된 AWS 관리형 Active Directory예요. 자세한 내용은 AWS Directory Service Administration Guide의 AWS Managed Microsoft AD 시작하기(Getting Started with AWS Managed Microsoft AD)를 참고하세요.
- 온프레미스 Active Directory. Amazon ECS Linux 컨테이너 인스턴스가 도메인에 가입할 수 있는지 확인해야 해요. 자세한 내용은 AWS Direct Connect를 참고하세요.
- Active Directory에 기존 gMSA 계정과 gMSA 서비스 계정에 액세스할 권한이 있는 사용자가 있어요. 자세한 내용은 도메인리스 gMSA용 Active Directory 사용자 만들기(Make an Active Directory user for domainless gMSA)를 참고하세요.
- Amazon S3 버킷이 있어요. 자세한 내용은 Amazon S3 사용자 가이드의 버킷 만들기(Creating a bucket)를 참고하세요.
Amazon ECS에서 gMSA 지원 Linux 컨테이너 설정
인프라 준비
다음 단계는 한 번만 수행하는 고려 사항과 설정이에요.
도메인리스 gMSA용 Active Directory 사용자 만들기
도메인리스 gMSA를 사용할 때 컨테이너는 도메인에 가입되지 않아요. 컨테이너에서 실행되는 다른 애플리케이션은 자격 증명을 사용해 도메인에 액세스할 수 없습니다. 다른 도메인을 사용하는 태스크는 같은 컨테이너에서 실행될 수 있어요. CredSpec 파일에 AWS Secrets Manager의 시크릿 이름을 제공합니다. 시크릿에는 로그인할 사용자 이름, 비밀번호, 도메인이 포함되어야 해요. 이 기능은 비도메인 가입 컨테이너 호스트에 대한 gMSA 지원과 비슷합니다. Windows 기능에 대한 자세한 내용은 Microsoft Learn 웹사이트의 gMSA 아키텍처와 개선 사항(gMSA architecture and improvements)을 참고하세요.
- Active Directory 도메인에 사용자를 구성합니다. Active Directory의 사용자는 태스크에서 사용하는 gMSA 서비스 계정에 액세스할 권한이 있어야 해요.
- Active Directory 도메인 이름을 해석할 수 있는 VPC와 서브넷이 있어요. Active Directory 서비스 이름을 가리키는 도메인 이름으로 VPC를 DHCP 옵션으로 구성합니다. VPC용 DHCP 옵션 구성 방법은 Amazon Virtual Private Cloud 사용자 가이드의 DHCP 옵션 집합 작업(Work with DHCP option sets)을 참고하세요.
- AWS Secrets Manager에 시크릿을 만듭니다.
- 자격 증명 사양 파일(credential specification file)을 만듭니다.
권한과 시크릿 설정
각 애플리케이션과 각 태스크 정의에 대해 다음 단계를 한 번 수행하세요. 최소 권한(least privilege)을 부여하고 정책에 사용되는 권한을 좁히는 모범 사례를 따를 것을 권장해요. 이렇게 하면 각 태스크가 필요한 시크릿만 읽을 수 있습니다.
- Active Directory 도메인에 사용자를 만듭니다. Active Directory의 사용자는 태스크에서 사용하는 gMSA 서비스 계정에 액세스할 권한이 있어야 해요.
- Active Directory 사용자를 만든 뒤 AWS Secrets Manager에 시크릿을 만듭니다. 자세한 내용은 AWS Secrets Manager 시크릿 만들기(Create an AWS Secrets Manager secret)를 참고하세요.
- 사용자의 사용자 이름, 비밀번호, 도메인을 각각
username,password,domainName이라는 JSON 키-값 쌍에 입력합니다.
{"username":"username","password":"passw0rd", "domainName":"example.com"}
- 태스크 실행 IAM 역할에 다음 권한을 인라인 정책으로 추가해야 해요. 이렇게 하면 credentials-fetcher 데몬이 Secrets Manager 시크릿에 액세스할 수 있습니다.
Resource목록에서MySecret예시를 시크릿의 Amazon Resource Name(ARN)으로 바꾸세요.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:111122223333:secret:MySecret"
]
}
]
}
참고: 시크릿을 암호화하는 데 자체 KMS 키를 사용한다면 이 역할에 필요한 권한을 추가하고 이 역할을 AWS KMS 키 정책에 추가해야 해요.
- 자격 증명 사양을 Amazon S3 버킷에 추가합니다. 그런 다음 태스크 정의의
credentialSpecs필드에서 Amazon S3 버킷의 Amazon Resource Name(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:GetObjectVersion",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::{bucket_name}",
"arn:aws:s3:::{bucket_name}/{object}"
]
}
]
}
자격 증명 사양 파일
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"
}
}
}
}
CredSpec 생성 및 Amazon S3에 업로드
도메인에 가입된 Windows 컴퓨터에서 CredSpec PowerShell 모듈을 사용해 CredSpec을 만들어요. Microsoft Learn 웹사이트의 자격 증명 사양 만들기(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 및 호환 셸이 사용하는 백슬래시 연속 문자를 사용해요:
$ aws s3 cp gmsa-cred-spec.json \
s3://amzn-s3-demo-bucket/ecs-domainless-gmsa-credspec