本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
集成 Active Directory
在本教程中,您将创建一个多用户环境。此环境包括与 AWS Managed Microsoft AD
(A AWS ParallelCluster ctive Directory)集成的环境corp.example.com
。您将配置一个 Admin
用户来管理目录,一个 ReadOnly
用户来读取目录,以及一个 user000
用户来登录到集群。您可以使用自动路径或手动路径来创建网络资源、活动目录 (AD) 和用于配置 AD 的 Amazon EC2 实例。无论采用何种路径,您创建的基础架构都已预先配置为 AWS ParallelCluster 使用以下方法之一进行集成:
-
具有证书验证功能的 LDAPS(最安全的选项,建议使用)
-
没有证书验证功能的 LDAPS
-
LDAP
LDAP 本身不 提供加密。为确保安全传输潜在敏感信息,我们强烈建议您对与 AD 集成的集群使用 LDAPS(基于 TLS/SSL 的 LDAP)。有关更多信息,请参阅《 AWS Directory Service 管理指南》 AWS Managed Microsoft AD中的使用启用服务器端 LDAPS。
创建这些资源后,继续配置和创建与 Active Directory (AD) 集成的集群。创建集群之后,以您创建的用户身份登录。有关在本教程中创建的配置的更多信息,请参阅集群的多用户访问和 DirectoryService 配置部分。
本教程介绍如何创建支持多用户访问集群的环境。本教程不介绍如何创建和使用 AWS Directory Service 广告。本教程 AWS Managed Microsoft AD 中提供的设置步骤仅用于测试目的。它们不能 取代 AWS Directory Service Administration Guide 的 AWS Managed Microsoft AD 和 Simple AD 章节中所述的官方文档和最佳实践。
注意
目录用户密码根据目录密码策略属性定义过期。有关更多信息,请参阅支持的策略设置。要使用重置目录密码 AWS ParallelCluster,请参阅如何重置用户密码和过期的密码。
注意
目录域控制器 IP 地址可能会因域控制器更改和目录维护而更改。如果您选择自动快速创建方法来创建目录基础架构,则当目录 IP 地址更改时,必须手动使目录控制器前面的负载均衡器保持一致。使用快速创建方法时,目录 IP 地址不会自动与负载均衡器保持一致。
使用 AWS ParallelCluster 命令行界面 (CLI) 或 API 时,您只需为创建或更新 AWS ParallelCluster 映像和集群时创建的 AWS 资源付费。有关更多信息,请参阅 AWS 使用的服务 AWS ParallelCluster。
AWS ParallelCluster 用户界面基于无服务器架构构建,在大多数情况下,您可以在 AWS 免费套餐类别中使用它。有关更多信息,请参阅 AWS ParallelCluster UI 成本。
先决条件
-
AWS ParallelCluster 已安装。
-
AWS CLI 已安装并配置。
-
你有一个 A mazon EC2 密钥对。
在学习本教程时,请替换
,例如用自己的名称和 ID 替换 inputs highlighted in red
和 region-id
。d-abcdef01234567890
用你的 AWS 账户 号码替换。0123456789012
选择 “自动” 选项卡,使用 AWS CloudFormation 快速创建模板创建 Active Directory (AD) 基础架构。
选择手动选项卡可手动创建 AD 基础架构。
-
登录到 AWS Management Console。
-
打开CloudFormation 快速创建(区域 us-east-1
),在控制台中创建以下资源: CloudFormation -
具有两个子网的 VPC 和公有访问路由(如果未指定 VPC)。
-
一个 AWS Managed Microsoft AD。
-
已加入 AD 的 Amazon EC2 实例,可用于管理目录。
-
-
在快速创建堆栈页面的参数部分,输入以下参数的密码:
-
AdminPassword
-
ReadOnlyPassword
-
UserPassword
记下这些密码。本教程后面将会用到这些密码。
-
-
对于 DomainName,输入
corp.example.com
。 -
对于 Keypair,请输入 Amazon EC2 密钥对的名称。
-
在页面底部选中各个框以确认各项访问功能。
-
选择创建堆栈。
-
CloudFormation 堆栈达到
CREATE_COMPLETE
状态后,选择堆栈的输出选项卡。记下输出资源名称和 ID,因为后面的步骤中需要用到它们。输出提供了创建集群所需的信息。 -
要完成练习(可选)步骤 2:管理 AD 用户和组,您需要目录 ID。选择资源并向下滚动,记下目录 ID。
为目录服务创建在不同可用区中具有两个子网的 VPC 以及 AWS Managed Microsoft AD。
注意
-
目录和域名是
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"
Amazon 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。您将在后面的步骤中用到它们。
脚本完成后,继续执行下一步。
-
以
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 -
安装必要的软件并加入该领域。
$
sudo yum -y install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python
-
将管理员密码替换为您的
admin
密码。$
ADMIN_PW=
"asdfASDF1234"
$
echo $ADMIN_PW | sudo realm join -U Admin
corp.example.com
Password for Admin:
如果上述操作成功,您就加入到了该领域,并可以继续下一步操作。
-
创建 ReadOnlyUser 和其他用户。
在此步骤中,您将使用在前一步中安装的 adcli
和 openldap-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
-
验证是否创建了用户:
目录 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
创建用户时,该用户将处于禁用状态。 -
在本地计算机上重置并激活用户密码:
注销您的亚马逊 EC2 实例。
注意
-
ro-p@ssw0rd
是的密码ReadOnlyUser
,从中检索 AWS 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"
-
-
将密码添加到 Secrets Manager 密钥中。
现在,您已经创建
ReadOnlyUser
并设置了密码,请将其存储在 AWS ParallelCluster 用于验证登录名的密钥中。使用 Secrets Manager 创建新密钥以将
ReadOnlyUser
的密码作为值。密钥值格式必须仅为纯文本(而不是 JSON 格式)。记下密钥的 ARN,以在后面的步骤中使用。$
aws secretsmanager create-secret --name
"ADSecretPassword"
\ --regionregion_id
\ --secret-string"ro-p@ssw0rd"
\ --query ARN \ --output textarn:aws:secretsmanager:region-id:123456789012:secret:ADSecretPassword-1234
记下资源 ID。您将在后面的步骤中用到它们。
-
在本地生成域证书。
$
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 -
将证书存储到 Secrets Manager,以便以后可以从集群内进行检索。
$
aws secretsmanager create-secret --name example-cert \ --secret-string file://$CERTIFICATE \ --regionregion-id
{ "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "VersionId": "14866070-092a-4d5a-bcdd-9219d0566b9c" }
-
将以下策略添加到您为将 Amazon EC2 实例加入 AD 域而创建的 IAM 角色中。
PutDomainCertificateSecrets
{ "Statement": [ { "Action": [ "secretsmanager:PutSecretValue" ], "Resource": [ "arn:aws:secretsmanager:
region-id
:123456789012
:secret:example-cert-123abc
", ], "Effect": "Allow" } ] } -
将证书导入 AWS Certificate Manager (ACM)。
$
aws acm import-certificate --certificate fileb://$CERTIFICATE \ --private-key fileb://$PRIVATE_KEY \ --regionregion-id
{ "CertificateArn": "arn:aws:acm:region-id:123456789012:certificate/343db133-490f-4077-b8d4-3da5bfd89e72" }
-
创建放置在 Active Directory 端点前面的负载均衡器。
$
aws elbv2 create-load-balancer --name CorpExampleCom-NLB \ --type network \ --scheme internal \ --subnetssubnet-1234567890abcdef0 subnet-021345abcdef6789
\ --regionregion-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" } ] }
-
创建以 Active Directory 端点为目标的目标组。
$
aws elbv2 create-target-group --name CorpExampleCom-Targets --protocol TCP \ --port 389 \ --target-type ip \ --vpc-idvpc-021345abcdef6789
\ --regionregion-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" } ] }
-
将 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 \ --regionregion-id
-
对证书创建 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
\ --regionregion-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" } ] } } ] } ] }
-
创建托管区以便可以在集群 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" } }
-
创建名为
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 } } } ] } -
将记录集更改提交到托管区,这次使用托管区 ID。
$
aws route53 change-resource-record-sets --hosted-zone-idZ09020002B5MZQNXMSJUB
\ --change-batch file://recordset-change.json{ "ChangeInfo": { "Id": "/change/C0137926I56R3GC7XW2Y", "Status": "PENDING", "SubmittedAt": "2022-05-05T13:40:36.553000+00:00" } }
-
创建包含以下内容的策略文档
policy.json
。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:
region-id
:123456789012
:secret:example-cert-abc123
" ], "Effect": "Allow" } ] } -
创建名为
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" } }
-
继续按照 (可选)步骤 2:管理 AD 用户和组 或 步骤 3:创建集群 中的步骤操作。
在此步骤中,您将管理已加入有效交付 (AD) 域的 Amazon EC2 Amazon Linux 2 实例中的用户和群组。
如果您使用的是自动 方法,请重启并登录到在自动操作过程中创建并加入 AD 的实例。
如果您使用的是手动 方法,请重启并登录到您在前面的步骤中创建并加入 AD 的实例。
在这些步骤中,您将使用前一步在实例中安装的 adcli
登录已加入 AD 域的 Amazon EC2 实例
-
从 Amazon EC2 控制台中,选择在之前的步骤中创建的无标题的 Amazon EC2 实例。该实例的状态可能是已停止。
-
如果实例状态为已停止,请选择实例状态,然后选择启动实例。
-
状态检查通过后,选择该实例,然后选择连接并 SSH 登录到该实例。
登录已加入 AD 的 Amazon EC2 Amazon Linux 2 实例时管理用户和群组
当您使用 -U "Admin"
选项运行 adcli
命令时,系统会提示您输入 AD Admin
密码。您可以将 AD Admin
密码作为 ldapsearch
命令的一部分。
-
创建用户。
$
adcli create-user
"clusteruser"
--domain"corp.example.com"
-U "Admin" -
设置用户密码。
$
aws --region
"region-id"
ds reset-user-password --directory-id"d-abcdef01234567890"
--user-name"clusteruser"
--new-password"new-p@ssw0rd"
-
创建组。
$
adcli create-group
"clusterteam"
--domain"corp.example.com"
-U "Admin" -
将用户添加到组。
$
adcli add-member
"clusterteam"
"clusteruser"
--domain"corp.example.com"
-U "Admin" -
描述用户和组。
描述所有用户。
$
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"
-
从组中删除用户。
$
adcli remove-member
"clusterteam"
"clusteruser"
--domain"corp.
-U "Admin"example
.com" -
删除用户。
$
adcli delete-user
"clusteruser"
--domain"corp.
-U "Admin"example
.com" -
删除组。
$
adcli delete-group
"clusterteam"
--domain"corp.
-U "Admin"example
.com"
如果您尚未退出 Amazon 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
: 您的一个 Amazon 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
以授予 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
: 您的一个 Amazon 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
: 您的一个 Amazon 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)。
-
从本地计算机上删除集群。
$
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" } }
-
检查集群删除进度。
$
pcluster describe-cluster --cluster-name
"ad-cluster"
--region"region-id"
--query "clusterStatus""DELETE_IN_PROGRESS"
成功删除集群后,继续执行下一步。
删除 Active Directory 资源
-
在导航窗格中,选择堆栈。
-
从堆栈列表中选择 AD 堆栈(例如
pcluster-ad
)。 -
选择删除。
-
删除 Amazon EC2 实例。
-
打开 https://console.aws.amazon.com/ec2/
,在导航窗格中选择实例。 -
从实例列表中,选择您为将用户添加到目录而创建的实例。
-
选择实例状态,然后选择终止实例。
-
-
删除托管区。
-
创建包含以下内容的
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 } } } ] } -
使用托管区 ID 将记录集更改提交到托管区。
$
aws route53 change-resource-record-sets --hosted-zone-idZ09020002B5MZQNXMSJUB
\ --change-batch file://recordset-delete.json{ "ChangeInfo": { "Id": "/change/C04853642A0TH2TJ5NLNI", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:25:51.046000+00:00" } }
-
删除托管区。
$
aws route53 delete-hosted-zone --idZ09020002B5MZQNXMSJUB
{ "ChangeInfo": { "Id": "/change/C0468051QFABTVHMDEG9", "Status": "PENDING", "SubmittedAt": "2022-05-05T14:26:13.814000+00:00" } }
-
-
删除 LB 侦听器。
$
aws elbv2 delete-listener \ --listener-arn arn:aws:elasticloadbalancing:region-id
:123456789012
:listener/net/CorpExampleCom-NLB/3afe296bf4ba80d4/a8f9d97318743d4b
--regionregion-id
-
删除目标组。
$
aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region-id
:123456789012
:targetgroup/CorpExampleCom-Targets/44577c583b695e81
--regionregion-id
-
删除负载均衡器。
$
aws elbv2 delete-load-balancer \ --load-balancer-arn arn:aws:elasticloadbalancing:region-id
:123456789012
:loadbalancer/net/CorpExampleCom-NLB/3afe296bf4ba80d4
--regionregion-id
-
删除集群用于从 Secrets Manager 读取证书的策略。
$
aws iam delete-policy --policy-arn arn:aws:iam::123456789012
:policy/ReadCertExample -
删除包含域证书的密钥。
$
aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id
:123456789012
:secret:example-cert-123abc
\ --regionregion-id
{ "ARN": "arn:aws:secretsmanager:region-id:123456789012:secret:example-cert-123abc", "Name": "example-cert", "DeletionDate": "2022-06-04T16:27:36.183000+02:00" }
-
从 ACM 中删除证书。
$
aws acm delete-certificate \ --certificate-arn arn:aws:acm:region-id
:123456789012
:certificate/343db133-490f-4077-b8d4-3da5bfd89e72
--regionregion-id
-
删除 Active Directory (AD) 资源。
-
从 Python 脚本
ad.py
的输出中获取以下资源 ID:-
AD ID
-
AD 子网 ID
-
AD VPC ID
-
-
通过运行以下命令删除目录。
$
aws ds delete-directory --directory-idd-abcdef0123456789
--regionregion-id
{ "DirectoryId": "d-abcdef0123456789" }
-
列出 VPC 中的安全组。
$
aws ec2 describe-security-groups --filters '[{"Name":"vpc-id","Values":["vpc-07614ade95ebad1bc"]}]' --regionregion-id
-
删除自定义安全组。
$
aws ec2 delete-security-group --group-idsg-021345abcdef6789
--regionregion-id
-
删除子网。
$
aws ec2 delete-subnet --subnet-idsubnet-1234567890abcdef
--regionregion-id
$
aws ec2 delete-subnet --subnet-idsubnet-021345abcdef6789
--regionregion-id
-
描述互联网网关。
$
aws ec2 describe-internet-gateways \ --filters Name=attachment.vpc-id,Values=vpc-021345abcdef6789
\ --regionregion-id
{ "InternetGateways": [ { "Attachments": [ { "State": "available", "VpcId": "vpc-021345abcdef6789" } ], "InternetGatewayId": "igw-1234567890abcdef", "OwnerId": "123456789012", "Tags": [] } ] }
-
分离互联网网关。
$
aws ec2 detach-internet-gateway \ --internet-gateway-idigw-1234567890abcdef
\ --vpc-idvpc-021345abcdef6789
\ --regionregion-id
-
删除互联网网关。
$
aws ec2 delete-internet-gateway \ --internet-gateway-idigw-1234567890abcdef
\ --regionregion-id
-
删除 VPC。
$
aws ec2 delete-vpc \ --vpc-idvpc-021345abcdef6789
\ --regionregion-id
-
删除包含
ReadOnlyUser
密码的密钥。$
aws secretsmanager delete-secret \ --secret-id arn:aws:secretsmanager:region-id
:123456789012
:secret:ADSecretPassword-1234
" \ --regionregion-id
-