LDAP 多用户访问

我们将验证 LDAP 身份验证是否正常工作,了解用户是如何管理的,并向目录中添加一个新用户。

LDAP 在集群中的工作原理

多用户设置由三个组件构成:

  1. LDAP 服务器 — 一个预先部署的 OpenLDAP 目录服务器,用于存储用户帐户、组和 sudo 规则。它运行在一个独立的 EC2 实例上。
  2. 计算节点上的 SSSD — System Security Services Daemon 在 AMI 中被配置为针对 LDAP 服务器对用户进行身份验证。每个节点(登录节点和计算节点)在启动时都会自动从 LDAP 解析用户。
  3. pam_mkhomedir — 在用户首次登录时,自动在 EFS(/home)上创建用户的主目录。

我们无需配置任何内容——在 Image Builder 过程中,SSSD 已被固化到 AMI 中,并已设置好 LDAP 服务器 URI、base DN 和绑定凭证。

在login机器上执行以下命令:

export INFRA_STACK="pcs-workshop-infra"
export AWS_DEFAULT_REGION="us-east-2"

检查预配置的测试用户是否可以被解析:

getent passwd user1
getent passwd user2
id user1

我们应该会看到:

user1:*:2001:2000:User One:/home/user1:/bin/bash
user2:*:2002:2000:User Two:/home/user2:/bin/bash
uid=2001(user1) gid=2000(hpcusers) groups=2000(hpcusers)

两个用户都在 hpcusers 组(gid 2000)中。每个用户的密码是在堆栈部署时生成的,并存储在各自的 Secrets Manager 密钥中—密钥名称作为堆栈输出 User1PasswordSecretNameUser2PasswordSecretName 暴露。

从 Secrets Manager 检索 user1 的密码:

USER1_SECRET=$(aws cloudformation describe-stacks \
  --stack-name $INFRA_STACK \
  --query "Stacks[0].Outputs[?OutputKey=='User1PasswordSecretName'].OutputValue" \
  --output text)

USER1_PASSWORD=$(aws secretsmanager get-secret-value \
  --secret-id $USER1_SECRET \
  --query SecretString \
  --output text \
  --region us-east-2)
echo "user1 password is $USER1_PASSWORD"

如果我们需要 user2 的密码,使用 User2PasswordSecretName 采用相同的模式。

登录节点位于私有子网中,通过 NAT 网关访问 Secrets Manager。

测试用户切换和主目录创建

切换到 user1 并验证主目录是否已自动创建:

sudo su - user1 -c "whoami && pwd && ls -la"

pam_mkhomedir 模块在 user1 首次登录时会在 EFS 上创建 /home/user1。由于 EFS 在所有节点间共享,因此该主目录可从集群中的每个节点访问。

image-20260803192144651

添加一个新的 LDAP 用户

要添加一个新用户,我们需要 LDAP 管理员密码和服务器 URI。LDAP URI 位于节点上的 SSSD 配置中。密码存储在 Secrets Manager 中。

从本地 SSSD 配置获取 LDAP URI,并从 Secrets Manager 获取密码:

LDAP_URI=$(grep ldap_uri /etc/sssd/sssd.conf | awk '{print $3}')
echo "LDAP URI: $LDAP_URI"

LDAP_PASSWORD=$(aws secretsmanager get-secret-value \
  --secret-id pcs-workshop-ldap-password-$INFRA_STACK \
  --query SecretString \
  --output text \
  --region us-east-2)
echo "Got password: ${#LDAP_PASSWORD} chars"

为新用户创建一个 LDIF 文件:

cat > new-user.ldif << 'EOF'
dn: cn=Workshop User,ou=people,dc=pcs,dc=workshop
givenName: Workshop
sn: User
cn: Workshop User
uid: workshopuser
uidNumber: 2003
gidNumber: 2000
homeDirectory: /home/workshopuser
loginShell: /bin/bash
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
mail: workshopuser@pcs.workshop
EOF

该 LDIF 文件定义了一个新用户,包含:

  • uid: workshopuser — Linux 用户名
  • uidNumber: 2003 — 唯一的用户 ID(不得与现有用户冲突)
  • gidNumber: 2000hpcusers
  • homeDirectory: /home/workshopuser — 将由 pam_mkhomedir 自动创建

将该用户添加到 LDAP:

ldapadd -x \
  -D "cn=Manager,dc=pcs,dc=workshop" \
  -w "$LDAP_PASSWORD" \
  -H "$LDAP_URI" \
  -f new-user.ldif

我们应该会看到 adding new entry "cn=Workshop User,ou=people,dc=pcs,dc=workshop"

验证新用户

# 清除 SSSD 缓存以立即识别新用户
sudo sss_cache -E
getent passwd workshopuser
id workshopuser

我们应该会看到:

workshopuser:*:2003:2000:Workshop User:/home/workshopuser:/bin/bash
uid=2003(workshopuser) gid=2000(hpcusers) groups=2000(hpcusers)

测试切换到新用户:

su - workshopuser -c "whoami && pwd"

image-20260803192336594

以 LDAP 用户身份提交作业

通过提交一个简单的作业,测试 Slurm 是否能识别 LDAP 用户:

sudo su - user1 -c 'sbatch --wrap="hostname && whoami && id" -p x86 -o /home/user1/test-job.out'

此作业将启动一个 hpc7a 实例(由于实例从零开始扩展,第一个作业需要几分钟时间)。我们可以使用 squeue 检查作业状态并等待其完成。

LDAP 多用户访问正常工作。用户从 LDAP 目录解析,主目录在 EFS 上自动创建,Slurm 接受来自 LDAP 用户的作业。