Active Directory 통합 - AWS ParallelCluster

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Active Directory 통합

이 자습서에서는 다중 사용자 환경을 생성합니다. 이 환경에는 corp.example.com에서 AWS Managed Microsoft AD(Active Directory)와 통합된 AWS ParallelCluster가 포함되어 있습니다. Admin 사용자는 디렉터리를 관리하고, ReadOnly 사용자는 디렉터리를 읽고, user000 사용자는 클러스터에 로그인하도록 구성합니다. 자동 경로 또는 수동 경로를 사용하여 AD를 구성하는 데 사용하는 네트워킹 리소스, Active Directory(AD) 및 EC2 인스턴스를 만들 수 있습니다. 경로에 관계없이, 생성하는 인프라는 다음 방법 중 하나를 사용하여 AWS ParallelCluster를 통합하도록 미리 구성됩니다.

  • 인증서 검증이 포함된 LDAPS(가장 안전한 옵션으로 권장)

  • 인증서 검증이 없는 LDAPS

  • LDAP

LDAP 자체로는 암호화를 제공하지 않습니다. 잠재적으로 민감한 정보를 안전하게 전송하려면 AD와 통합된 클러스터에는 LDAPS(LDAP over TLS/SSL)를 사용하는 것이 좋습니다. 자세한 내용은 AWS Directory Service 관리 안내서에서 AWS Managed Microsoft AD를 사용하여 서버 측 LDAPS 활성화를 참조하세요.

이러한 리소스를 만든 후에는 Active Directory(AD)와 통합된 클러스터를 구성하고 생성하세요. 클러스터가 생성된 후에는 생성한 사용자로 로그인합니다. 이 자습서에서 생성하는 구성에 대한 자세한 내용은 클러스터에 대한 다중 사용자 액세스DirectoryService 구성 섹션을 참조하세요.

이 자습서에서는 클러스터에 대한 다중 사용자 액세스를 지원하는 환경을 만드는 방법을 다룹니다. 이 가이드에서는 AWS Directory Service AD를 만들고 사용하는 방법을 다루지 않습니다. 이 자습서에서 AWS Managed Microsoft AD를 설정하는 단계는 테스트 목적으로만 제공됩니다. AWS Directory Service 관리 안내서AWS Managed Microsoft ADSimple AD에서 찾을 수 있는 공식 설명서 및 모범 사례를 대체하기 위해 제공되는 것은 아닙니다.

참고

디렉터리 사용자 암호는 디렉터리 암호 정책 속성 정의에 따라 만료됩니다. 자세한 내용은 지원되는 정책 설정을 참조하세요. AWS ParallelCluster를 사용하여 디렉터리 암호를 재설정하려면 사용자 암호 및 만료된 암호를 재설정하는 방법을 참조하세요.

참고

디렉터리 도메인 컨트롤러 IP 주소는 도메인 컨트롤러 변경 및 디렉터리 유지 보수로 인해 변경될 수 있습니다. 디렉터리 인프라를 생성하기 위해 자동화된 빠른 생성 방법을 선택한 경우 디렉터리 IP 주소가 변경될 때 디렉터리 컨트롤러 앞에 로드 밸런서를 수동으로 정렬해야 합니다. 빠른 생성 메서드를 사용하는 경우 디렉터리 IP 주소가 로드 밸런서와 자동으로 정렬되지 않습니다.

AWS ParallelCluster 명령줄 인터페이스 (CLI) 또는 API를 사용하는 경우 AWS ParallelCluster 이미지 및 클러스터를 생성하거나 업데이트할 때 생성된 AWS 리소스에 대한 비용만 지불하면 됩니다. 자세한 내용은 AWS ParallelCluster가 사용하는 AWS 서비스 항목을 참조하세요.

AWS ParallelCluster UI는 서버리스 아키텍처를 기반으로 하며 대부분의 경우 AWS 프리 티어 범주 내에서 사용할 수 있습니다. 자세한 내용은 AWS ParallelCluster UI 비용 항목을 참조하세요.

사전 조건

자습서를 진행하면서 region-idd-abcdef01234567890과 같은 inputs highlighted in red를 자신의 이름과 ID로 바꾸세요. 0123456789012를 사용자의 AWS 계정 숫자로 바꿉니다.

자동 탭을 선택하여 AWS CloudFormation 빠른 생성 템플릿으로 Active Directory(AD) 인프라를 만들 수 있습니다.

수동 탭을 선택하여 AD 인프라를 수동으로 생성합니다.

  1. AWS Management Console에 로그인합니다.

  2. CloudFormation 빠른 생성 (지역 us-east-1) 을 열어 콘솔에서 다음 리소스를 생성합니다. CloudFormation

    • VPC가 지정되지 않은 경우 서브넷 2개와 퍼블릭 액세스를 위한 라우팅이 있는 VPC.

    • AWS Managed Microsoft AD.

    • 디렉터리를 관리하는 데 사용할 수 있는 AD에 조인된 EC2 인스턴스.

  3. 빠른 스택 생성 페이지 파라미터 섹션에서 다음 파라미터의 암호를 입력합니다.

    • AdminPassword

    • ReadOnlyPassword

    • UserPassword

    암호를 기록해 둡니다. 이 자습서 뒷부분에서 이 정보가 필요합니다.

  4. DomainNamecorp.example.com를 입력합니다.

  5. Keypair에는 EC2 키 페어의 이름을 입력합니다.

  6. 페이지 하단에서 각 액세스 기능이 필요함을 확인하는 확인란을 선택합니다.

  7. 스택 생성을 선택합니다.

  8. CloudFormation 스택이 CREATE_COMPLETE 상태에 도달하면 스택의 출력 탭을 선택합니다. 출력 리소스 이름과 ID는 이후 단계에서 사용해야 하므로 기록해 두세요. 출력은 클러스터를 생성하는 데 필요한 정보를 제공합니다.

    AWS Management Console에서 생성된 스택 출력을 보여주는 다이어그램.
  9. (선택 사항)2단계: AD 사용자 및 그룹 관리 연습을 완료하려면 디렉터리 ID가 필요합니다. 리소스를 선택하고 아래로 스크롤하여 디렉터리 ID를 기록해 둡니다.

  10. (선택 사항)2단계: AD 사용자 및 그룹 관리 또는 3단계: 클러스터 생성에서 계속하세요.

다양한 가용 영역 및 AWS Managed Microsoft AD에 있는 두 개의 서브넷으로 디렉터리 서비스용 VPC를 생성합니다.

참고
  • 디렉터리 및 도메인 이름은 corp.example.com입니다. 짧은 이름은 CORP입니다.

  • 스크립트에서 Admin 암호를 변경합니다.

  • Active Directory(AD)를 생성하는 데 최소 15분이 걸립니다.

다음 Python 스크립트를 사용하여 로컬 AWS 리전에 VPC, 서브넷, AD 리소스를 생성합니다. 이 파일을 ad.py로 저장하고 실행하세요.

import boto3 import time from pprint import pprint vpc_name = "PclusterVPC" ad_domain = "corp.example.com" admin_password = "asdfASDF1234" ec2 = boto3.client("ec2") ds = boto3.client("ds") region = boto3.Session().region_name # Create the VPC, Subnets, IGW, Routes vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16")["Vpc"] vpc_id = vpc["VpcId"] time.sleep(30) ec2.create_tags(Resources=[vpc_id], Tags=[{"Key": "Name", "Value": vpc_name}]) subnet1 = ec2.create_subnet(VpcId=vpc_id, CidrBlock="10.0.0.0/17", AvailabilityZone=f"{region}a")["Subnet"] subnet1_id = subnet1["SubnetId"] time.sleep(30) ec2.create_tags(Resources=[subnet1_id], Tags=[{"Key": "Name", "Value": f"{vpc_name}/subnet1"}]) ec2.modify_subnet_attribute(SubnetId=subnet1_id, MapPublicIpOnLaunch={"Value": True}) subnet2 = ec2.create_subnet(VpcId=vpc_id, CidrBlock="10.0.128.0/17", AvailabilityZone=f"{region}b")["Subnet"] subnet2_id = subnet2["SubnetId"] time.sleep(30) ec2.create_tags(Resources=[subnet2_id], Tags=[{"Key": "Name", "Value": f"{vpc_name}/subnet2"}]) ec2.modify_subnet_attribute(SubnetId=subnet2_id, MapPublicIpOnLaunch={"Value": True}) igw = ec2.create_internet_gateway()["InternetGateway"] ec2.attach_internet_gateway(InternetGatewayId=igw["InternetGatewayId"], VpcId=vpc_id) route_table = ec2.describe_route_tables(Filters=[{"Name": "vpc-id", "Values": [vpc_id]}])["RouteTables"][0] ec2.create_route(RouteTableId=route_table["RouteTableId"], DestinationCidrBlock="0.0.0.0/0", GatewayId=igw["InternetGatewayId"]) ec2.modify_vpc_attribute(VpcId=vpc_id, EnableDnsSupport={"Value": True}) ec2.modify_vpc_attribute(VpcId=vpc_id, EnableDnsHostnames={"Value": True}) # Create the Active Directory ad = ds.create_microsoft_ad( Name=ad_domain, Password=admin_password, Description="ParallelCluster AD", VpcSettings={"VpcId": vpc_id, "SubnetIds": [subnet1_id, subnet2_id]}, Edition="Standard", ) directory_id = ad["DirectoryId"] # Wait for completion print("Waiting for the directory to be created...") directories = ds.describe_directories(DirectoryIds=[directory_id])["DirectoryDescriptions"] directory = directories[0] while directory["Stage"] in {"Requested", "Creating"}: time.sleep(3) directories = ds.describe_directories(DirectoryIds=[directory_id])["DirectoryDescriptions"] directory = directories[0] dns_ip_addrs = directory["DnsIpAddrs"] pprint({"directory_id": directory_id, "vpc_id": vpc_id, "subnet1_id": subnet1_id, "subnet2_id": subnet2_id, "dns_ip_addrs": dns_ip_addrs})

다음은 Python 스크립트의 출력 예제입니다.

{ "directory_id": "d-abcdef01234567890", "dns_ip_addrs": ["192.0.2.254", "203.0.113.237"], "subnet1_id": "subnet-021345abcdef6789", "subnet2_id": "subnet-1234567890abcdef0", "vpc_id": "vpc-021345abcdef6789" }

출력 리소스 이름 및 ID를 적어 두세요. 이후 단계에서 사용하게 됩니다.

스크립트가 완료되면 다음 단계를 계속합니다.

New EC2 console
  1. AWS Management Console에 로그인합니다.

  2. 첨부된 4단계에 나열된 정책에 해당하는 역할이 없는 경우 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 여세요. 그렇지 않으면 5단계로 건너뛰세요.

  3. ResetUserPassword 정책을 생성하여 빨간색으로 강조 표시된 콘텐츠를 AWS 리전 ID, 계정 ID, AD 생성 시 실행한 스크립트 출력의 디렉터리 ID로 대체합니다.

    ResetUserPassword

    { "Statement": [ { "Action": [ "ds:ResetUserPassword" ], "Resource": "arn:aws:ds:region-id:123456789012:directory/d-abcdef01234567890", "Effect": "Allow" } ] }
  4. 다음과 같은 정책을 연결하여 IAM 역할을 생성합니다.

  5. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  6. EC2 대시보드에서 인스턴스 시작을 선택합니다.

  7. 애플리케이션 및 OS 이미지에서 최신 Amazon Linux 2 AMI를 선택합니다.

  8. 인스턴스 유형에서 t2.micro를 선택합니다.

  9. 키 페어(로그인)에서 키 페어를 선택합니다.

  10. 네트워크 설정에서 편집을 선택합니다.

  11. VPC에서 디렉터리 VPC를 선택합니다.

  12. 아래로 스크롤하여 고급 세부 정보를 선택합니다.

  13. 고급 세부 정보도메인 가입 디렉터리에서 corp.example.com을 선택합니다.

  14. IAM 인스턴스 프로파일에서 1단계에서 생성한 역할 또는 4단계에서 나열된 정책이 연결된 역할을 선택합니다.

  15. 요약에서 인스턴스 시작을 선택합니다.

  16. 인스턴스 ID(예: i-1234567890abcdef0)를 기록하고 인스턴스 시작이 완료될 때까지 기다립니다.

  17. 인스턴스가 시작된 후 이어서 다음 단계를 수행합니다.

Old EC2 console
  1. AWS Management Console에 로그인합니다.

  2. 첨부된 4단계에 나열된 정책에 해당하는 역할이 없는 경우 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 여세요. 그렇지 않으면 5단계로 건너뛰세요.

  3. ResetUserPassword 정책을 생성합니다. 빨간색으로 강조 표시된 콘텐츠를 Active Directory(AD)를 생성하기 위해 실행한 스크립트 출력의 AWS 리전 ID, AWS 계정 ID 및 디렉터리 ID로 바꾸세요.

    ResetUserPassword

    { "Statement": [ { "Action": [ "ds:ResetUserPassword" ], "Resource": "arn:aws:ds:region-id:123456789012:directory/d-abcdef01234567890", "Effect": "Allow" } ] }
  4. 다음과 같은 정책을 연결하여 IAM 역할을 생성합니다.

  5. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  6. EC2 대시보드에서 인스턴스 시작을 선택합니다.

  7. 애플리케이션 및 OS 이미지에서 최신 Amazon Linux 2 AMI를 선택합니다.

  8. 인스턴스 유형에서 t2.micro를 선택합니다.

  9. 키 페어(로그인)에서 키 페어를 선택합니다.

  10. 네트워크 설정에서 편집을 선택합니다.

  11. 네트워크 설정, VPC에서 디렉터리 VPC를 선택합니다.

  12. 아래로 스크롤하여 고급 세부 정보를 선택합니다.

  13. 고급 세부 정보도메인 가입 디렉터리에서 corp.example.com을 선택합니다.

  14. 고급 세부 정보, 인스턴스 프로파일에서 1단계에서 생성한 역할 또는 4단계에서 나열한 정책이 연결된 역할을 선택합니다.

  15. 요약에서 인스턴스 시작을 선택합니다.

  16. 인스턴스 ID(예:i-1234567890abcdef0) 를 메모하고 인스턴스 시작이 완료될 때까지 기다립니다.

  17. 인스턴스가 시작된 후 이어서 다음 단계를 수행합니다.

  1. 인스턴스에 연결하고 admin로서 AD Realm에 조인하세요.

    인스턴스에 연결하고 다음 명령을 실행합니다.

    $ INSTANCE_ID="i-1234567890abcdef0"
    $ PUBLIC_IP=$(aws ec2 describe-instances \ --instance-ids $INSTANCE_ID \ --query "Reservations[0].Instances[0].PublicIpAddress" \ --output text)
    $ ssh -i ~/.ssh/keys/keypair.pem ec2-user@$PUBLIC_IP
  2. 필요한 소프트웨어를 설치하고 Realm에 조인하세요.
    $ sudo yum -y install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python
  3. 관리자 암호를 admin 암호로 바꿉니다.
    $ ADMIN_PW="asdfASDF1234"
    $ echo $ADMIN_PW | sudo realm join -U Admin corp.example.com Password for Admin:

    위의 방법이 성공하면 Realm에 조인되어 다음 단계를 진행할 수 있습니다.

  1. ReadOnlyUser 및 추가 사용자를 생성합니다.

    이 단계에서는 이전 단계에서 설치한 adcliopenldap-client 도구를 사용합니다.

    $ echo $ADMIN_PW | adcli create-user -x -U Admin --domain=corp.example.com --display-name=ReadOnlyUser ReadOnlyUser
    $ echo $ADMIN_PW | adcli create-user -x -U Admin --domain=corp.example.com --display-name=user000 user000
  2. 사용자가 생성되었는지 확인합니다.

    디렉터리 DNS IP 주소는 Python 스크립트의 출력입니다.

    $ DIRECTORY_IP="192.0.2.254"
    $ ldapsearch -x -h $DIRECTORY_IP -D Admin -w $ADMIN_PW -b "cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com"
    $ ldapsearch -x -h $DIRECTORY_IP -D Admin -w $ADMIN_PW -b "cn=user000,ou=Users,ou=CORP,dc=corp,dc=example,dc=com"

    기본적으로 ad-cli를 사용하여 사용자를 생성하면 해당 사용자는 비활성화됩니다.

  3. 로컬 시스템에서 사용자 암호 재설정 및 활성화:

    EC2 인스턴스에서 로그아웃합니다.

    참고
    • ro-p@ssw0rd는 AWS Secrets Manager에서 검색한 ReadOnlyUser의 암호입니다.

    • user-p@ssw0rd는 클러스터에 연결(ssh)할 때 제공되는 클러스터 사용자의 암호입니다.

    directory-id는 Python 스크립트의 출력입니다.

    $ DIRECTORY_ID="d-abcdef01234567890"
    $ aws ds reset-user-password \ --directory-id $DIRECTORY_ID \ --user-name "ReadOnlyUser" \ --new-password "ro-p@ssw0rd" \ --region "region-id"
    $ aws ds reset-user-password \ --directory-id $DIRECTORY_ID \ --user-name "user000" \ --new-password "user-p@ssw0rd" \ --region "region-id"
  4. Secrets Manager 보안 암호에 암호를 추가합니다.

    ReadOnlyUser를 생성하고 암호를 설정했으니, AWS ParallelCluster가 로그인을 검증하는 데 사용하는 보안 암호에 암호를 저장하세요.

    Secrets Manager를 사용하여 ReadOnlyUser의 암호를 값으로 보관할 새 보안 암호를 생성합니다. 보안 암호 값 형식은 JSON 형식이 아닌 일반 텍스트만 사용해야 합니다. 향후 단계를 위해 보안 암호 ARN을 기록해 두세요.

    $ aws secretsmanager create-secret --name "ADSecretPassword" \ --region region_id \ --secret-string "ro-p@ssw0rd" \ --query ARN \ --output text arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234

리소스 ID를 기록해 두세요. 이후 단계에서 사용하게 됩니다.

  1. 로컬에서 도메인 인증서를 생성합니다.
    $ PRIVATE_KEY="corp-example-com.key" CERTIFICATE="corp-example-com.crt" printf ".\n.\n.\n.\n.\ncorp.example.com\n.\n" | openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout $PRIVATE_KEY -days 365 -out $CERTIFICATE
  2. 인증서를 Secrets Manager에 저장하여 나중에 클러스터 내에서 검색할 수 있도록 합니다.
    $ aws secretsmanager create-secret --name example-cert \ --secret-string file://$CERTIFICATE \ --region region-id { "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "VersionId": "14866070-092a-4d5a-bcdd-9219d0566b9c" }
  3. EC2 인스턴스를 AD 도메인에 조인하기 위해 생성한 IAM 역할에 다음 정책을 추가합니다.

    PutDomainCertificateSecrets

    { "Statement": [ { "Action": [ "secretsmanager:PutSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", ], "Effect": "Allow" } ] }
  4. AWS Certificate Manager(ACM)로 인증서를 가져오세요.
    $ aws acm import-certificate --certificate fileb://$CERTIFICATE \ --private-key fileb://$PRIVATE_KEY \ --region region-id { "CertificateArn": "arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72" }
  5. Active Directory 엔드포인트 앞에 배치되는 로드 밸런서를 생성합니다.
    $ aws elbv2 create-load-balancer --name CorpExampleCom-NLB \ --type network \ --scheme internal \ --subnets subnet-1234567890abcdef0 subnet-021345abcdef6789 \ --region region-id { "LoadBalancers": [ { "LoadBalancerArn": "arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4", "DNSName": "CorpExampleCom-NLB-3afe296bf4ba80d4.elb.region-id.amazonaws.com", "CanonicalHostedZoneId": "Z2IFOLAFXWLO4F", "CreatedTime": "2022-05-05T12:56:55.988000+00:00", "LoadBalancerName": "CorpExampleCom-NLB", "Scheme": "internal", "VpcId": "vpc-021345abcdef6789", "State": { "Code": "provisioning" }, "Type": "network", "AvailabilityZones": [ { "ZoneName": "region-idb", "SubnetId": "subnet-021345abcdef6789", "LoadBalancerAddresses": [] }, { "ZoneName": "region-ida", "SubnetId": "subnet-1234567890abcdef0", "LoadBalancerAddresses": [] } ], "IpAddressType": "ipv4" } ] }
  6. Active Directory 엔드포인트를 대상으로 하는 대상 그룹을 만드세요.
    $ aws elbv2 create-target-group --name CorpExampleCom-Targets --protocol TCP \ --port 389 \ --target-type ip \ --vpc-id vpc-021345abcdef6789 \ --region region-id { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81", "TargetGroupName": "CorpExampleCom-Targets", "Protocol": "TCP", "Port": 389, "VpcId": "vpc-021345abcdef6789", "HealthCheckProtocol": "TCP", "HealthCheckPort": "traffic-port", "HealthCheckEnabled": true, "HealthCheckIntervalSeconds": 30, "HealthCheckTimeoutSeconds": 10, "HealthyThresholdCount": 3, "UnhealthyThresholdCount": 3, "TargetType": "ip", "IpAddressType": "ipv4" } ] }
  7. Active Directory(AD) 엔드포인트를 대상 그룹에 등록합니다.
    $ aws elbv2 register-targets --target-group-arn arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81 \ --targets Id=192.0.2.254,Port=389 Id=203.0.113.237,Port=389 \ --region region-id
  8. 인증서를 사용하여 LB 리스너를 생성합니다.
    $ aws elbv2 create-listener --load-balancer-arn arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4 \ --protocol TLS \ --port 636 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81 \ --ssl-policy ELBSecurityPolicy-TLS-1-2-2017-01 \ --certificates CertificateArn=arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72 \ --region region-id "Listeners": [ { "ListenerArn": "arn:aws:elasticloadbalancing:region-id:123456789012:listener/net/CorpExampleCom-NLB/3afe296bf4ba80d4/a8f9d97318743d4b", "LoadBalancerArn": "arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4", "Port": 636, "Protocol": "TLS", "Certificates": [ { "CertificateArn": "arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72" } ], "SslPolicy": "ELBSecurityPolicy-TLS-1-2-2017-01", "DefaultActions": [ { "Type": "forward", "TargetGroupArn": "arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81" } ] } } ] } ] }
  9. 클러스터 VPC 내에서 도메인을 검색할 수 있도록 호스팅 영역을 생성합니다.
    $ aws route53 create-hosted-zone --name corp.example.com \ --vpc VPCRegion=region-id,VPCId=vpc-021345abcdef6789 \ --caller-reference "ParallelCluster AD Tutorial" { "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z09020002B5MZQNXMSJUB", "HostedZone": { "Id": "/hostedzone/Z09020002B5MZQNXMSJUB", "Name": "corp.example.com.", "CallerReference": "ParallelCluster AD Tutorial", "Config": { "PrivateZone": true }, "ResourceRecordSetCount": 2 }, "ChangeInfo": { "Id": "/change/C05533343BF3IKSORW1TQ", "Status": "PENDING", "SubmittedAt": "2022-05-05T13:21:53.863000+00:00" }, "VPC": { "VPCRegion": "region-id", "VPCId": "vpc-021345abcdef6789" } }
  10. 다음 콘텐츠가 포함된 recordset-change.json라는 이름의 파일을 추가합니다. HostedZoneId는 로드 밸런서의 표준 호스팅 영역 ID입니다.
    { "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "corp.example.com", "Type": "A", "Region": "region-id", "SetIdentifier": "example-active-directory", "AliasTarget": { "HostedZoneId": "Z2IFOLAFXWLO4F", "DNSName": "CorpExampleCom-NLB-3afe296bf4ba80d4.elb.region-id.amazonaws.com", "EvaluateTargetHealth": true } } } ] }
  11. 이번에는 호스팅 영역 ID를 사용하여 레코드세트 변경 내용을 호스팅 영역에 제출합니다.
    $ aws route53 change-resource-record-sets --hosted-zone-id Z09020002B5MZQNXMSJUB \ --change-batch file://recordset-change.json { "ChangeInfo": { "Id": "/change/C0137926I56R3GC7XW2Y", "Status": "PENDING", "SubmittedAt": "2022-05-05T13:40:36.553000+00:00" } }
  12. 다음 콘텐츠가 포함된 정책 문서 policy.json을 생성합니다.
    { "Version": "2012-10-17", "Statement": [ { "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-abc123" ], "Effect": "Allow" } ] }
  13. 다음 콘텐츠가 포함된 policy.json라는 정책 문서를 생성합니다.
    $ aws iam create-policy --policy-name ReadCertExample \ --policy-document file://policy.json { "Policy": { "PolicyName": "ReadCertExample", "PolicyId": "ANPAUUXUVBC42VZSI4LDY", "Arn": "arn:aws:iam::123456789012:policy/ReadCertExample-efg456", "Path": "/", "DefaultVersionId": "v1", "AttachmentCount": 0, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "CreateDate": "2022-05-05T13:42:18+00:00", "UpdateDate": "2022-05-05T13:42:18+00:00" } }
  14. (선택 사항)2단계: AD 사용자 및 그룹 관리 또는 3단계: 클러스터 생성의 단계를 계속 따르세요.

이 단계에서는 Active Delivery(AD) 도메인에 연결된 EC2 Amazon Linux 2 인스턴스에서 사용자와 그룹을 관리합니다.

자동 경로를 따랐다면 자동화의 일부로 생성된 AD 조인 인스턴스를 다시 시작하고 로그인하세요.

수동 경로를 따랐다면 이전 단계에서 만들고 AD에 연결한 인스턴스를 다시 시작하고 로그인하세요.

이 단계에서는 이전 단계의 일부로 인스턴스에 설치된 adcliopenldap-client 도구를 사용합니다.

AD 도메인에 연결된 EC2 인스턴스에 로그인합니다.
  1. EC2 콘솔에서 이전 단계에서 생성한 제목 없는 EC2 인스턴스를 선택합니다. 인스턴스가 중지된 상태여야 합니다.

  2. 인스턴스 상태가 중지된 경우 [인스턴스 상태] 를 선택한 다음 [인스턴스 시작] 을 선택합니다.

  3. 상태 확인이 통과되면 인스턴스를 선택하고 연결 및 SSH를 선택하고 인스턴스에 로그인합니다.

AD에 조인된 EC2 Amazon Linux 2 인스턴스에 로그인한 사용자 및 그룹을 관리합니다.

-U "Admin" 옵션을 사용하여 adcli 명령을 실행하면 AD Admin 암호를 입력하라는 메시지가 표시됩니다. AD Admin 암호를 ldapsearch 명령의 일부로 포함합니다.

  1. 사용자를 생성합니다.
    $ adcli create-user "clusteruser" --domain "corp.example.com" -U "Admin"
  2. 사용자 암호를 재설정합니다.
    $ aws --region "region-id" ds reset-user-password --directory-id "d-abcdef01234567890" --user-name "clusteruser" --new-password "new-p@ssw0rd"
  3. 그룹을 생성합니다.
    $ adcli create-group "clusterteam" --domain "corp.example.com" -U "Admin"
  4. 그룹에 사용자를 추가합니다.
    $ adcli add-member "clusterteam" "clusteruser" --domain "corp.example.com" -U "Admin"
  5. 사용자 및 그룹을 설명합니다.

    모든 사용자를 설명합니다.

    $ ldapsearch "(&(objectClass=user))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    특정 사용자를 설명합니다.

    $ ldapsearch "(&(objectClass=user)(cn=clusteruser))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    이름 패턴으로 모든 사용자를 설명합니다.

    $ ldapsearch "(&(objectClass=user)(cn=user*))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    특정 그룹에 속한 모든 사용자를 설명합니다.

    $ ldapsearch "(&(objectClass=user)(memberOf=CN=clusterteam,OU=Users,OU=CORP,DC=corp,DC=example,DC=com))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    모든 그룹을 설명합니다.

    $ ldapsearch "objectClass=group" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"

    특정 그룹을 설명합니다.

    $ ldapsearch "(&(objectClass=group)(cn=clusterteam))" -x -h "192.0.2.254" -b "DC=corp,DC=example,DC=com" -D "CN=Admin,OU=Users,OU=CORP,DC=corp,DC=example,DC=com" -w "p@ssw0rd"
  6. 그룹에서 사용자를 제거합니다.
    $ adcli remove-member "clusterteam" "clusteruser" --domain "corp.example.com" -U "Admin"
  7. 사용자를 삭제합니다.
    $ adcli delete-user "clusteruser" --domain "corp.example.com" -U "Admin"
  8. 그룹을 삭제합니다.
    $ adcli delete-group "clusterteam" --domain "corp.example.com" -U "Admin"

EC2 인스턴스를 종료하지 않았다면 지금 종료하세요.

환경은 Active Directory(AD)에 대해 사용자를 인증할 수 있는 클러스터를 생성하도록 설정되어 있습니다.

간단한 클러스터 구성을 만들고 AD 연결과 관련된 설정을 제공합니다. 자세한 내용은 DirectoryService(을)를 참조하세요.

다음 클러스터 구성 중 하나를 선택하고 ldaps_config.yaml, ldaps_nocert_config.yaml 또는 ldap_config.yaml이라는 이름의 파일에 복사합니다.

인증서 검증이 있는 LDAPS 구성을 선택하는 것이 좋습니다. 이 구성을 선택하는 경우 부트스트랩 스크립트도 active-directory.head.post.sh로 이름이 지정된 파일에 복사해야 합니다. 그리고 구성 파일에 표시된 대로 Amazon S3 버킷에 저장해야 합니다.

참고
다음 구성 요소를 변경해야 합니다.
  • KeyName: EC2 키페어 중 하나입니다.

  • SubnetId / SubnetIds: CloudFormation 빠른 스택 생성 (자동 자습서) 또는 python 스크립트 (수동 자습서) 의 출력에 제공된 서브넷 ID 중 하나입니다.

  • Region: AD 인프라를 생성한 리전입니다.

  • DomainAddr: 이 IP 주소는 AD 서비스의 DNS 주소 중 하나입니다.

  • PasswordSecretArn: DomainReadOnlyUser의 암호가 포함된 보안 암호의 Amazon 리소스 이름(ARN)입니다.

  • BucketName: 부트스트랩 스크립트가 들어 있는 버킷의 이름입니다..

  • AdditionalPolicies/Policy: 읽기 도메인 인증 정책의 Amazon 리소스 이름 (ARN). ReadCertExample

  • CustomActions/OnNodeConfigured/Args: 도메인 인증 정책을 보유하는 보안 암호의 Amazon 리소스 이름(ARN).

보안 태세를 강화하려면HeadNode/Ssh/AllowedIps구성을 사용하여 헤드 노드에 대한 SSH 액세스를 제한하는 것이 좋습니다.

Region: region-id Image: Os: alinux2 HeadNode: InstanceType: t2.micro Networking: SubnetId: subnet-abcdef01234567890 Ssh: KeyName: keypair Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::123456789012:policy/ReadCertExample S3Access: - BucketName: my-bucket EnableWriteAccess: false KeyName: bootstrap/active-directory/active-directory.head.post.sh CustomActions: OnNodeConfigured: Script: s3://my-bucket/bootstrap/active-directory/active-directory.head.post.sh Args: - arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc - /opt/parallelcluster/shared/directory_service/domain-certificate.crt Scheduling: Scheduler: slurm SlurmQueues: - Name: queue0 ComputeResources: - Name: queue0-t2-micro InstanceType: t2.micro MinCount: 1 MaxCount: 10 Networking: SubnetIds: - subnet-abcdef01234567890 DirectoryService: DomainName: corp.example.com DomainAddr: ldaps://corp.example.com PasswordSecretArn: arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234 DomainReadOnlyUser: cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com LdapTlsCaCert: /opt/parallelcluster/shared/directory_service/domain-certificate.crt LdapTlsReqCert: hard

부트스트랩 스크립트

부트스트랩 파일을 생성한 후 S3 버킷에 업로드하기 전에 chmod +x active-directory.head.post.sh를 실행하여 AWS ParallelCluster에 실행 권한을 부여하세요.

#!/bin/bash set -e CERTIFICATE_SECRET_ARN="$1" CERTIFICATE_PATH="$2" [[ -z $CERTIFICATE_SECRET_ARN ]] && echo "[ERROR] Missing CERTIFICATE_SECRET_ARN" && exit 1 [[ -z $CERTIFICATE_PATH ]] && echo "[ERROR] Missing CERTIFICATE_PATH" && exit 1 source /etc/parallelcluster/cfnconfig REGION="${cfn_region:?}" mkdir -p $(dirname $CERTIFICATE_PATH) aws secretsmanager get-secret-value --region $REGION --secret-id $CERTIFICATE_SECRET_ARN --query SecretString --output text > $CERTIFICATE_PATH
참고
다음 구성 요소를 변경해야 합니다.
  • KeyName: EC2 키페어 중 하나입니다.

  • SubnetId / SubnetIds: CloudFormation 빠른 생성 스택 (자동 자습서) 또는 python 스크립트 (수동 자습서) 의 출력에 있는 서브넷 ID 중 하나입니다.

  • Region: AD 인프라를 생성한 리전입니다.

  • DomainAddr: 이 IP 주소는 AD 서비스의 DNS 주소 중 하나입니다.

  • PasswordSecretArn: DomainReadOnlyUser의 암호가 포함된 보안 암호의 Amazon 리소스 이름(ARN)입니다.

더 나은 보안 태세를 위해 HeadNode /Ssh/ AllowedIps 구성을 사용하여 헤드 노드에 대한 SSH 액세스를 제한하는 것이 좋습니다.

Region: region-id Image: Os: alinux2 HeadNode: InstanceType: t2.micro Networking: SubnetId: subnet-abcdef01234567890 Ssh: KeyName: keypair Scheduling: Scheduler: slurm SlurmQueues: - Name: queue0 ComputeResources: - Name: queue0-t2-micro InstanceType: t2.micro MinCount: 1 MaxCount: 10 Networking: SubnetIds: - subnet-abcdef01234567890 DirectoryService: DomainName: corp.example.com DomainAddr: ldaps://corp.example.com PasswordSecretArn: arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234 DomainReadOnlyUser: cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com LdapTlsReqCert: never
참고
다음 구성 요소를 변경해야 합니다.
  • KeyName: EC2 키페어 중 하나입니다.

  • SubnetId / SubnetIds: CloudFormation 빠른 생성 스택 (자동 자습서) 또는 python 스크립트 (수동 자습서) 의 출력에 제공된 서브넷 ID 중 하나입니다.

  • Region: AD 인프라를 생성한 리전입니다.

  • DomainAddr: 이 IP 주소는 AD 서비스의 DNS 주소 중 하나입니다.

  • PasswordSecretArn: DomainReadOnlyUser의 암호가 포함된 보안 암호의 Amazon 리소스 이름(ARN)입니다.

더 나은 보안 태세를 위해 HeadNode /Ssh/ AllowedIps 구성을 사용하여 헤드 노드에 대한 SSH 액세스를 제한하는 것이 좋습니다.

Region: region-id Image: Os: alinux2 HeadNode: InstanceType: t2.micro Networking: SubnetId: subnet-abcdef01234567890 Ssh: KeyName: keypair Scheduling: Scheduler: slurm SlurmQueues: - Name: queue0 ComputeResources: - Name: queue0-t2-micro InstanceType: t2.micro MinCount: 1 MaxCount: 10 Networking: SubnetIds: - subnet-abcdef01234567890 DirectoryService: DomainName: dc=corp,dc=example,dc=com DomainAddr: ldap://192.0.2.254,ldap://203.0.113.237 PasswordSecretArn: arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234 DomainReadOnlyUser: cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com AdditionalSssdConfigs: ldap_auth_disable_tls_never_use_in_production: True

다음 명령을 사용하여 클러스터를 생성합니다.

$ pcluster create-cluster --cluster-name "ad-cluster" --cluster-configuration "./ldaps_config.yaml" { "cluster": { "clusterName": "pcluster", "cloudformationStackStatus": "CREATE_IN_PROGRESS", "cloudformationStackArn": "arn:aws:cloudformation:region-id:123456789012:stack/ad-cluster/1234567-abcd-0123-def0-abcdef0123456", "region": "region-id", "version": 3.7.0, "clusterStatus": "CREATE_IN_PROGRESS" } }

다음 명령을 사용하여 클러스터의 상태를 확인할 수 있습니다.

$ pcluster describe-cluster -n ad-cluster --region "region-id" --query "clusterStatus"

출력값은 다음과 같습니다.

"CREATE_IN_PROGRESS" / "CREATE_COMPLETE"

상태가 "CREATE_COMPLETE"가 되면 생성한 사용자 이름과 암호로 로그인합니다.

$ HEAD_NODE_IP=$(pcluster describe-cluster -n "ad-cluster" --region "region-id" --query headNode.publicIpAddress | xargs echo)
$ ssh user000@$HEAD_NODE_IP

/home/user000@HEAD_NODE_IP/.ssh/id_rsa에서 새 사용자를 위해 만든 SSH 키를 입력하면 암호 없이 로그인할 수 있습니다.

ssh 명령이 성공하면 Active Director (AD)를 사용하도록 인증된 사용자로 클러스터에 성공적으로 연결한 것입니다.

  1. 로컬 시스템에서 클러스터를 삭제합니다.
    $ pcluster delete-cluster --cluster-name "ad-cluster" --region "region-id" { "cluster": { "clusterName": "ad-cluster", "cloudformationStackStatus": "DELETE_IN_PROGRESS", "cloudformationStackArn": "arn:aws:cloudformation:region-id:123456789012:stack/ad-cluster/1234567-abcd-0123-def0-abcdef0123456", "region": "region-id", "version": "3.7.0", "clusterStatus": "DELETE_IN_PROGRESS" } }
  2. 삭제 중인 클러스터의 진행 상태를 확인합니다.
    $ pcluster describe-cluster --cluster-name "ad-cluster" --region "region-id" --query "clusterStatus" "DELETE_IN_PROGRESS"

    클러스터가 성공적으로 삭제되면 다음 단계를 진행합니다.

Active Directory 리소스를 삭제합니다.
  1. https://console.aws.amazon.com/cloudformation/으로 이동합니다.

  2. 탐색 창에서 스택을 선택합니다.

  3. 스택 목록에서 AD 스택(예:pcluster-ad)을 선택합니다.

  4. Delete를 선택합니다.

  1. EC2 인스턴스를 삭제합니다.
    1. https://console.aws.amazon.com/ec2/ 에서 탐색 창에서 인스턴스를 선택합니다.

    2. 디렉터리에 사용자를 추가하기 위해 생성한 인스턴스를 인스턴스 목록에서 선택합니다.

    3. 인스턴스 상태를 선택한 뒤 인스턴스 종료를 선택하세요.

  2. 호스팅 영역을 삭제합니다.
    1. 다음과 같은 콘텐츠로 recordset-delete.json을 생성합니다. 이 예시에서는 HostedZoneId 가 로드 밸런서의 표준 호스팅 영역 ID입니다.

      { "Changes": [ { "Action": "DELETE", "ResourceRecordSet": { "Name": "corp.example.com", "Type": "A", "Region": "region-id", "SetIdentifier": "pcluster-active-directory", "AliasTarget": { "HostedZoneId": "Z2IFOLAFXWLO4F", "DNSName": "CorpExampleCom-NLB-3afe296bf4ba80d4.elb.region-id.amazonaws.com", "EvaluateTargetHealth": true } } } ] }
    2. 호스팅 영역 ID를 사용하여 레코드세트 변경 내용을 호스팅 영역에 제출하세요.

      $ aws route53 change-resource-record-sets --hosted-zone-id Z09020002B5MZQNXMSJUB \ --change-batch file://recordset-delete.json { "ChangeInfo": { "Id": "/change/C04853642A0TH2TJ5NLNI", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:25:51.046000+00:00" } }
    3. 호스팅 영역을 삭제합니다.

      $ aws route53 delete-hosted-zone --id Z09020002B5MZQNXMSJUB { "ChangeInfo": { "Id": "/change/C0468051QFABTVHMDEG9", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:26:13.814000+00:00" } }
  3. LB 리스너를 삭제합니다.
    $ aws elbv2 delete-listener \ --listener-arn arn:aws:elasticloadbalancing:region-id:123456789012:listener/net/CorpExampleCom-NLB/3afe296bf4ba80d4/a8f9d97318743d4b --region region-id
  4. 대상 그룹을 삭제합니다.
    $ aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region-id:123456789012:targetgroup/CorpExampleCom-Targets/44577c583b695e81 --region region-id
  5. 로드 밸런서를 삭제합니다.
    $ aws elbv2 delete-load-balancer \ --load-balancer-arn arn:aws:elasticloadbalancing:region-id:123456789012:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4 --region region-id
  6. 클러스터가 Secrets Manager에서 인증서를 읽는 데 사용하는 정책을 삭제합니다.
    $ aws iam delete-policy --policy-arn arn:aws:iam::123456789012:policy/ReadCertExample
  7. 도메인 인증서가 포함된 암호를 삭제합니다.
    $ aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc \ --region region-id { "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "DeletionDate": "2022-06-04T16:27:36.183000+02:00" }
  8. ACM에서 인증서를 삭제합니다.
    $ aws acm delete-certificate \ --certificate-arn arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72 --region region-id
  9. Active Directory(AD) 리소스를 삭제합니다.
    1. Python 스크립트 ad.py의 출력에서 다음 리소스 ID를 가져옵니다.

      • AD ID

      • AD 서브넷 ID

      • AD VPC ID

    2. 다음 명령을 실행하여 디렉터리를 삭제합니다.

      $ aws ds delete-directory --directory-id d-abcdef0123456789 --region region-id { "DirectoryId": "d-abcdef0123456789" }
    3. VPC의 보안 그룹을 나열합니다.

      $ aws ec2 describe-security-groups --filters '[{"Name":"vpc-id","Values":["vpc-07614ade95ebad1bc"]}]' --region region-id
    4. 사용자 지정 보안 그룹을 삭제합니다.

      $ aws ec2 delete-security-group --group-id sg-021345abcdef6789 --region region-id
    5. 서브넷을 삭제합니다.

      $ aws ec2 delete-subnet --subnet-id subnet-1234567890abcdef --region region-id
      $ aws ec2 delete-subnet --subnet-id subnet-021345abcdef6789 --region region-id
    6. 인터넷 게이트웨이를 설명합니다.

      $ aws ec2 describe-internet-gateways \ --filters Name=attachment.vpc-id,Values=vpc-021345abcdef6789 \ --region region-id { "InternetGateways": [ { "Attachments": [ { "State": "available", "VpcId": "vpc-021345abcdef6789" } ], "InternetGatewayId": "igw-1234567890abcdef", "OwnerId": "123456789012", "Tags": [] } ] }
    7. 인터넷 게이트웨이를 분리합니다.

      $ aws ec2 detach-internet-gateway \ --internet-gateway-id igw-1234567890abcdef \ --vpc-id vpc-021345abcdef6789 \ --region region-id
    8. 인터넷 게이트웨이를 삭제합니다.

      $ aws ec2 delete-internet-gateway \ --internet-gateway-id igw-1234567890abcdef \ --region region-id
    9. VPC를 삭제합니다.

      $ aws ec2 delete-vpc \ --vpc-id vpc-021345abcdef6789 \ --region region-id
    10. ReadOnlyUser 암호가 포함된 보안 암호를 삭제합니다.

      $ aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234" \ --region region-id