集成 Active Directory - Amazon ParallelCluster
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

集成 Active Directory

在本教程中,您将创建一个多用户环境。此环境包括与 corp.example.com 上的 Amazon Managed Microsoft AD (Active Directory) 集成的 Amazon ParallelCluster。您将配置一个 Admin 用户来管理目录,一个 ReadOnly 用户来读取目录,以及一个 user000 用户来登录到集群。您可以使用自动路径或手动路径来创建网络资源、Active Directory (AD) 和用于配置 AD 的 EC2 实例。无论采用何种路径,您创建的基础架构都已预先配置为使用以下方法之一来集成 Amazon ParallelCluster:

  • 具有证书验证功能的 LDAPS(最安全的选项,建议使用)

  • 没有证书验证功能的 LDAPS

  • LDAP

LDAP 本身 提供加密。为确保安全传输潜在敏感信息,我们强烈建议您对与 AD 集成的集群使用 LDAPS(基于 TLS/SSL 的 LDAP)。有关更多信息,请参阅 Amazon Directory Service Administration Guide 中的 Enable server-side LDAPS using Amazon Managed Microsoft AD

创建这些资源后,继续配置和创建与 Active Directory (AD) 集成的集群。创建集群之后,以您创建的用户身份登录。有关在本教程中创建的配置的更多信息,请参阅集群的多用户访问DirectoryService 配置部分。

本教程介绍如何创建支持多用户访问集群的环境。本教程不介绍如何创建和使用 Amazon Directory Service AD。本教程中提供的 Amazon Managed Microsoft AD 设置步骤仅用于测试目的。它们不能 取代 Amazon Directory Service Administration GuideAmazon Managed Microsoft ADSimple AD 章节中所述的官方文档和最佳实践。

注意

目录用户密码根据目录密码策略属性定义过期。有关更多信息,请参阅支持的策略设置。要使用 Amazon ParallelCluster 重置目录密码,请参阅如何重置用户密码和过期的密码

注意

目录域控制器 IP 地址可能会因域控制器更改和目录维护而更改。如果您选择自动快速创建方法来创建目录基础架构,则当目录 IP 地址更改时,必须手动使目录控制器前面的负载均衡器保持一致。使用快速创建方法时,目录 IP 地址不会自动与负载均衡器保持一致。

使用 Amazon ParallelCluster 命令行界面 (CLI) 或 API 时,您只需为创建或更新 Amazon ParallelCluster 映像和集群时创建的 Amazon 资源付费。有关更多信息,请参阅Amazon ParallelCluster 使用的 Amazon 服务

Amazon ParallelCluster UI 基于无服务器的架构而构建,在大多数情况下,可以在 Amazon Free Tier 类别中使用。有关更多信息,请参阅Amazon ParallelCluster UI 成本

先决条件

在学习本教程时,请替换inputs highlighted in red,例如用自己的名称和 ID 替换 region-idd-abcdef01234567890。用您的 Amazon Web Services 账户号替换 0123456789012

选择自动 选项卡可利用 Amazon CloudFormation 快速创建模板创建 Active Directory (AD) 基础架构。

选择手动选项卡可手动创建 AD 基础架构。

  1. 登录到 Amazon Web Services Management Console。

  2. 打开CloudFormation 快速创建(区域 us-east-1),在控制台中创建以下资源: CloudFormation

    • 具有两个子网的 VPC 和公有访问路由(如果未指定 VPC)。

    • Amazon Managed Microsoft AD。

    • 已加入 AD 并可用于管理目录的 EC2 实例。

  3. 快速创建堆栈页面的参数部分,输入以下参数的密码:

    • AdminPassword

    • ReadOnlyPassword

    • UserPassword

    记下这些密码。本教程后面将会用到这些密码。

  4. 对于 DomainName,输入 corp.example.com

  5. 密钥对中,输入 EC2 密钥对的名称。

  6. 在页面底部选中各个框以确认各项访问功能。

  7. 选择创建堆栈

  8. CloudFormation 堆栈达到CREATE_COMPLETE状态后,选择堆栈的输出选项卡。记下输出资源名称和 ID,因为后面的步骤中需要用到它们。输出提供了创建集群所需的信息。

    
         显示在 Amazon Web Services Management Console中创建的堆栈输出的示意图。
  9. 要完成练习(可选)步骤 2:管理 AD 用户和组,您需要目录 ID。选择资源并向下滚动,记下目录 ID。

  10. 继续(可选)步骤 2:管理 AD 用户和组步骤 3:创建集群

为目录服务创建在不同可用区中具有两个子网的 VPC 以及 Amazon Managed Microsoft AD。

注意
  • 目录和域名是 corp.example.com。短名称是 CORP

  • 在脚本中更改 Admin 密码。

  • 创建 Active Directory (AD) 至少需要 15 分钟。

使用以下 Python 脚本在您的本地 Amazon Web Services 区域创建 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. 登录到 Amazon Web Services Management Console。

  2. 如果您没有附加了步骤 4 中所列策略的角色,请打开 IAM 控制台 (https://console.aws.amazon.com/iam/)。否则,请跳至步骤 5。

  3. 创建 ResetUserPassword 策略,将红色突出显示的内容替换为您的 Amazon Web Services 区域 ID、账户 ID 和为创建 AD 而运行的脚本的输出中的目录 ID。

    ResetUserPassword

    { "Statement": [ { "Action": [ "ds:ResetUserPassword" ], "Resource": "arn:aws:ds:region-id:123456789012:directory/d-abcdef01234567890", "Effect": "Allow" } ] }
  4. 创建附加了以下策略的 IAM 角色。

  5. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  6. EC2 控制面板上,选择启动实例

  7. 应用程序和操作系统映像中,选择最近的 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. 登录到 Amazon Web Services Management Console。

  2. 如果您没有附加了步骤 4 中所列策略的角色,请打开 IAM 控制台 (https://console.aws.amazon.com/iam/)。否则,请跳至步骤 5。

  3. 创建 ResetUserPassword 策略。将红色突出显示的内容替换为您的 Amazon Web Services 区域 ID、Amazon Web Services 账户 ID 和为创建 Active Directory (AD) 而运行的脚本的输出中的目录 ID。

    ResetUserPassword

    { "Statement": [ { "Action": [ "ds:ResetUserPassword" ], "Resource": "arn:aws:ds:region-id:123456789012:directory/d-abcdef01234567890", "Effect": "Allow" } ] }
  4. 创建附加了以下策略的 IAM 角色。

  5. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  6. EC2 控制面板上,选择启动实例

  7. 应用程序和操作系统映像中,选择最近的 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 领域。

    运行以下命令连接到实例。

    $ 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. 安装必要的软件并加入该领域。
    $ 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:

    如果上述操作成功,您就加入到了该领域,并可以继续下一步操作。

  1. 创建 ReadOnlyUser 和其他用户。

    在此步骤中,您将使用在前一步中安装的 adcliopenldap-clients 工具。

    $ 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@ssw0rdReadOnlyUser 的密码,从 Amazon Secrets Manager 中检索。

    • 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 并设置了密码,请将其存储在 Amazon 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. 将证书导入 Amazon 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 Directory (AD) 域的 EC2 Amazon Linux 2 实例中的用户和组。

如果您使用的是自动 方法,请重启并登录到在自动操作过程中创建并加入 AD 的实例。

如果您使用的是手动 方法,请重启并登录到您在前面的步骤中创建并加入 AD 的实例。

在这些步骤中,您将使用前一步在实例中安装的 adcliopenldap-clients 工具。

登录到已加入 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.yamlldaps_nocert_config.yamlldap_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:读取域名认证政策的亚马逊资源名称 (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 以向 Amazon 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 Directory (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. 选择删除

  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