

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

# 排查与 Active Directory 的多用户集成问题
<a name="troubleshooting-v3-multi-user"></a>

本节内容涉及与 Active Directory 集成的集群。

如果 Active Directory 集成功能未按预期运行，则 SSSD 日志可以提供有用的诊断信息。这些日志位于集群节点上的 `/var/log/sssd` 中。默认情况下，它们还存储在集群的 Amazon CloudWatch 日志组中。

**Topics**
+ [

## 特定于 Active Directory 的问题排查
](#troubleshooting-v3-multi-ad-specific)
+ [

## 启用调试模式
](#troubleshooting-v3-multi-user-debug)
+ [

## 如何从 LDAPS 迁移到 LDAP
](#troubleshooting-v3-multi-user-ldaps-ldap)
+ [

## 如何禁用 LDAPS 服务器证书验证
](#troubleshooting-v3-multi-user-ldaps-verify)
+ [

## 如何使用 SSH 密钥而不是密码进行登录
](#troubleshooting-v3-multi-user-ssh-login)
+ [

## 如何重置用户密码和过期的密码
](#troubleshooting-v3-multi-user-reset-passwd)
+ [

## 如何验证加入的域
](#troubleshooting-v3-multi-user-domain-verify)
+ [

## 如何排查证书问题
](#troubleshooting-v3-multi-user-certificates)
+ [

## 如何验证与 Active Directory 的集成是否正常工作
](#troubleshooting-v3-multi-user-ad-verify)
+ [

## 如何排查计算节点登录问题
](#troubleshooting-v3-multi-user-ad-compute-node-login)
+ [

## 多用户环境中 SimCenter StarCCM\$1 作业的已知问题
](#troubleshooting-v3-multi-user-ad-starccm)
+ [

## 用户名解析的已知问题
](#troubleshooting-v3-multi-user-name-resolution)
+ [

## 如何解决主目录创建问题
](#troubleshooting-v3-multi-home-directory)

## 特定于 Active Directory 的问题排查
<a name="troubleshooting-v3-multi-ad-specific"></a>

本节与特定于 Active Directory 类型的问题排查有关。

### Simple AD
<a name="troubleshooting-v3-multi-user-simple-ad"></a>
+ `DomainReadOnlyUser` 值必须与用户的 Simple AD 目录基础搜索相匹配：

  `cn=ReadOnlyUser,cn=Users,dc=corp,dc=example,dc=com`

  注意 `Users` 的 `cn`。
+ 默认管理员用户是 `Administrator`。
+ `Ldapsearch` 要求在用户名前面加上 NetBIOS 名称。

  `Ldapsearch` 语法必须如下所示：

  ```
  $ ldapsearch -x -D "corp\\Administrator" -w "Password" -H ldap://192.0.2.103 \
     -b "cn=Users,dc=corp,dc=example,dc=com"
  ```

### AWS Managed Microsoft AD
<a name="troubleshooting-v3-multi-users-ms-ad"></a>
+ 该`DomainReadOnlyUser`值必须与基于 AWS Managed Microsoft AD 目录的用户搜索相匹配：

  `cn=ReadOnlyUser,ou=Users,ou=CORP,dc=corp,dc=example,dc=com`
+ 默认管理员用户是 `Admin`。
+ `Ldapsearch` 语法必须如下所示：

  ```
  $ ldapsearch -x -D "Admin" -w "Password" -H ldap://192.0.2.103 \
     -b "ou=Users,ou=CORP,dc=corp,dc=example,dc=com"
  ```

## 启用调试模式
<a name="troubleshooting-v3-multi-user-debug"></a>

SSSD 提供的调试日志可用于排查问题。要启用调试模式，您必须在对集群配置进行以下更改后更新集群：

```
DirectoryService:
  AdditionalSssdConfigs:
    debug_level: "0x1ff"
```

## 如何从 LDAPS 迁移到 LDAP
<a name="troubleshooting-v3-multi-user-ldaps-ldap"></a>

不鼓励从 LDAPS（采用 TLS/SSL 的 LDAP）迁移到 LDAP，因为 LDAP 本身不提供任何加密。但可以使用它来进行测试和问题排查。

您可以使用先前的配置定义更新集群，从而将集群还原到以前的配置。

要从 LDAPS 迁移到 LDAP，必须在集群配置中进行以下更改，然后更新集群：

```
DirectoryService:
  LdapTlsReqCert: never
  AdditionalSssdConfigs:
    ldap_auth_disable_tls_never_use_in_production: True
```

## 如何禁用 LDAPS 服务器证书验证
<a name="troubleshooting-v3-multi-user-ldaps-verify"></a>

出于测试或问题排查目的，在头节点上暂时禁用 LDAPS 服务器证书验证可能很有用。

您可以使用先前的配置定义更新集群，从而将集群还原到以前的配置。

要禁用 LDAPS 服务器证书验证，必须在集群配置中进行以下更改，然后更新集群：

```
DirectoryService:
  LdapTlsReqCert: never
```

## 如何使用 SSH 密钥而不是密码进行登录
<a name="troubleshooting-v3-multi-user-ssh-login"></a>

SSH 密钥是在您首次使用密码登录后在 `/home/$user/.ssh/id_rsa` 中创建的。要使用 SSH 密钥登录，必须先使用密码登录，在本地复制 SSH 密钥，然后像往常一样用它进行无密码的 SSH 登录：

```
$ ssh -i $LOCAL_PATH_TO_SSH_KEY $username@$head_node_ip
```

## 如何重置用户密码和过期的密码
<a name="troubleshooting-v3-multi-user-reset-passwd"></a>

如果用户无法访问集群，其 [AWS Managed Microsoft AD 密码可能已过期](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_password_policies.html)。

要重置密码，请使用对目录具有写入权限的用户和角色运行以下命令：

```
$ aws ds reset-user-password \
  --directory-id "d-abcdef01234567890" \
  --user-name "USER_NAME" \
  --new-password "NEW_PASSWORD" \
  --region "region-id"
```

如果您重置 [`DirectoryService`](DirectoryService-v3.md)/[`DomainReadOnlyUser`](DirectoryService-v3.md#yaml-DirectoryService-DomainReadOnlyUser) 的密码：

1. 确保使用新密码更新 [`DirectoryService`](DirectoryService-v3.md)/[`PasswordSecretArn`](DirectoryService-v3.md#yaml-DirectoryService-PasswordSecretArn) 密钥。

1. 更新集群以获取新密钥值：

   1. 使用 `pcluster update-compute-fleet` 命令停止计算实例集。

   1. 在集群头节点中运行以下命令。

      ```
      $ sudo /opt/parallelcluster/scripts/directory_service/update_directory_service_password.sh
      ```

密码重置和集群更新后，用户的集群访问权限应会恢复。

有关更多信息，请参阅 *Directory Service Administration Guide* 中的 [Reset a user password](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups_reset_password.html)。

## 如何验证加入的域
<a name="troubleshooting-v3-multi-user-domain-verify"></a>

必须从加入到域的实例（而非头节点）中运行以下命令。

```
$ realm list corp.example.com \
  type: kerberos \
  realm-name: CORP.EXAMPLE.COM \
  domain-name: corp.example.com \
  configured: kerberos-member \
  server-software: active-directory \
  client-software: sssd \
  required-package: oddjob \
  required-package: oddjob-mkhomedir \
  required-package: sssd \
  required-package: adcli \
  required-package: samba-common-tools \
  login-formats: %U \
  login-policy: allow-realm-logins
```

## 如何排查证书问题
<a name="troubleshooting-v3-multi-user-certificates"></a>

当 LDAPS 通信不起作用时，可能是由于 TLS 通信中的错误造成的，这反过来可能是由于证书问题造成的。

**有关证书的说明：**
+ 集群配置 `LdapTlsCaCert` 中指定的证书必须是一个 PEM 证书捆绑包，其中包含为域控制器颁发证书的整个证书颁发机构 (CA) 链的证书。
+ PEM 证书捆绑包是由 PEM 证书串联而成的文件。
+ PEM 格式的证书（通常用于 Linux）等同于 base64 DER 格式的证书（通常由 Windows 导出）。
+ 如果域控制器的证书由从属 CA 颁发，则证书捆绑包必须同时包含从属 CA 和根 CA 的证书。

**问题排查验证步骤：**

以下验证步骤假定从集群头节点内运行命令，并且可以在 `SERVER:PORT` 访问域控制器。

要排查与证书有关的问题，请按照以下验证步骤操作：

**验证步骤：**

1. **检查与 Active Directory 域控制器的连接：**

   验证是否可以连接到域控制器。如果此步骤成功，则与域控制器的 SSL 连接成功并验证了证书。您的问题与证书无关。

   如果此步骤失败，请继续进行下一步验证。

   ```
   $ openssl s_client -connect SERVER:PORT -CAfile PATH_TO_CA_BUNDLE_CERTIFICATE
   ```

1. **检查证书验证：**

   验证本地 CA 证书捆绑包是否可以验证域控制器提供的证书。如果此步骤成功，则您的问题与证书无关，而是与其他网络问题有关。

   如果此步骤失败，请继续进行下一步验证。

   ```
   $ openssl verify -verbose -CAfile PATH_TO_CA_BUNDLE_CERTIFICATE PATH_TO_A_SERVER_CERTIFICATE
   ```

1. **检查 Active Directory 域控制器提供的证书：**

   验证域控制器提供的证书的内容是否符合预期。如果此步骤成功，则用于验证控制器的 CA 证书可能有问题，请转到下一个问题排查步骤。

   如果此步骤失败，则必须更正为域控制器颁发的证书并重新执行问题排查步骤。

   ```
   $ openssl s_client -connect SERVER:PORT -showcerts
   ```

1. **检查证书的内容：**

   验证域控制器提供的证书的内容是否符合预期。如果此步骤成功，则用于验证控制器的 CA 证书可能有问题，请转到下一个问题排查步骤。

   如果此步骤失败，则必须更正为域控制器颁发的证书并重新运行问题排查步骤。

   ```
   $ openssl s_client -connect SERVER:PORT -showcerts
   ```

1. **查看本地 CA 证书捆绑包的内容：**

   验证用于验证域控制器证书的本地 CA 证书捆绑包的内容是否符合预期。如果此步骤成功，则域控制器提供的证书可能有问题。

   如果此步骤失败，则必须更正为域控制器颁发的 CA 证书捆绑包并重新运行问题排查步骤。

   ```
   $ openssl x509 -in PATH_TO_A_CERTIFICATE -text
   ```

## 如何验证与 Active Directory 的集成是否正常工作
<a name="troubleshooting-v3-multi-user-ad-verify"></a>

如果以下两项检查成功，则表示与 Active Directory 的集成工作正常。

**检查：**

1. **您可以发现目录中定义的用户：**

   从集群头节点中以 `ec2-user` 身份运行以下命令：

   ```
   $ getent passwd $ANY_AD_USER
   ```

1. **您可以通过提供用户密码 SSH 登录到头节点：**

   ```
   $ ssh $ANY_AD_USER@$HEAD_NODE_IP
   ```

如果第一项检查失败，预计第二项检查也会失败。

其他问题排查检查：
+ 验证目录中是否存在该用户。
+ 启用[调试日志记录](#troubleshooting-v3-multi-user-debug)。
+ 考虑通过[从 LDAPS 迁移到 LDAP](#troubleshooting-v3-multi-user-ldaps-ldap)暂时禁用加密，以排除 LDAPS 问题。

## 如何排查计算节点登录问题
<a name="troubleshooting-v3-multi-user-ad-compute-node-login"></a>

本节内容涉及登录到与 Active Directory 集成的集群中的计算节点。

使用 AWS ParallelCluster时，集群计算节点的密码登录在设计上是禁用的。

所有用户都必须使用自己的 SSH 密钥登录到计算节点。

如果在集群配置中启用了 [`GenerateSshKeysForUsers`](DirectoryService-v3.md#yaml-DirectoryService-GenerateSshKeysForUsers)，则用户可以在首次身份验证（例如登录）后在头节点中检索到其 SSH 密钥。

当用户首次在头节点上进行身份验证时，他们可以检索到作为目录用户自动为他们生成的 SSH 密钥。还会创建该用户的主目录。当 sudo-user 第一次切换到头节点中的用户时，也可能发生这种情况。

如果用户未登录到头节点，则不会生成 SSH 密钥，用户将无法登录到计算节点。

## 多用户环境中 SimCenter StarCCM\$1 作业的已知问题
<a name="troubleshooting-v3-multi-user-ad-starccm"></a>

本节内容与在 Siemens 的 Simcenter StarCCM\$1 计算流体动力学软件提供的多用户环境中启动的作业有关。

如果您运行配置为使用嵌入式 IntelMPI 的 StarCCM\$1 v16 作业，则默认使用 SSH 引导 MPI 进程。

由于已知的导致用户名解析错误的 [Slurm 错误](https://bugs.schedmd.com/show_bug.cgi?id=13385)，作业可能会失败并显示类似于“`error setting up the bootstrap proxies`”的错误。此错误仅影响 AWS ParallelCluster 版本 3.1.1 和 3.1.2。

为了防止这种情况发生，请强制 IntelMPI 使用 Slurm 作为 MPI 引导方法。按照 [IntelMPI 官方文档](https://www.intel.com/content/www/us/en/develop/documentation/mpi-developer-reference-linux/top/environment-variable-reference/hydra-environment-variables.html)中所述，将环境变量 `I_MPI_HYDRA_BOOTSTRAP=slurm` 导出到启动 StarCCM\$1 的作业脚本中。

## 用户名解析的已知问题
<a name="troubleshooting-v3-multi-user-name-resolution"></a>

本节内容与在作业中检索用户名有关。

由于已知的 [Slurm 错误](https://bugs.schedmd.com/show_bug.cgi?id=13385)，如果您运行作业时不使用 `srun`，则在作业进程中检索到的用户名可能是 `nobody`。此错误仅影响 AWS ParallelCluster 版本 3.1.1 和 3.1.2。

例如，如果您以目录用户身份运行命令 `sbatch --wrap 'srun id'`，则会返回正确的用户名。但如果您以目录用户身份运行 `sbatch --wrap 'id'`，则可能会返回 `nobody` 作为用户名。

您可以使用以下解决方法。

1. 在可能的情况下使用 `'srun'` 而不是 `'sbatch'` 来启动作业。

1. 通过按如下方式设置集群[AdditionalSssdConfigs](DirectoryService-v3.md#yaml-DirectoryService-AdditionalSssdConfigs)中的配置来启用 SSSD 枚举。

   ```
   AdditionalSssdConfigs:
     enumerate: true
   ```

## 如何解决主目录创建问题
<a name="troubleshooting-v3-multi-home-directory"></a>

本节内容与主目录创建问题有关。

如果您看到类似以下示例所示的错误，则说明您首次登录到头节点时未为您创建主目录，或您在头节点中首次从 sudoer 切换到 Active Directory 用户时未为您创建主目录。

```
$ ssh AD_USER@$HEAD_NODE_IP
/opt/parallelcluster/scripts/generate_ssh_key.sh failed: exit code 1

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
Could not chdir to home directory /home/PclusterUser85: No such file or directory
```

主目录创建失败可能是由集群头节点中安装的 `oddjob` 和 `oddjob-mkhomedir` 程序包造成的。

如果没有主目录和 SSH 密钥，用户就无法向集群节点提交作业或进行 SSH 登录。

如果您的系统中需要 `oddjob` 程序包，请验证 `oddjobd` 服务是否正在运行，然后刷新 PAM 配置文件以确保已创建主目录。为此，请在头节点中运行以下示例所示的命令。

```
sudo systemctl start oddjobd
sudo authconfig --enablemkhomedir --updateall
```

如果您的系统中不需要 `oddjob` 程序包，请将其卸载，然后刷新 PAM 配置文件以确保已创建主目录。为此，请在头节点中运行以下示例所示的命令。

```
sudo yum remove -y oddjob oddjob-mkhomedir
sudo authconfig --enablemkhomedir --updateall
```