

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

# 使用 PAM 身份验证
<a name="emr-jupyterhub-pam-users"></a>

在 Amazon EMR JupyterHub 上创建 PAM 用户是一个分为两个步骤的过程。第一步是，将用户添加到在主节点上的 `jupyterhub` 容器中运行的操作系统，以及为每个用户添加一个相应的用户主目录。第二步是将这些操作系统用户添加为 JupyterHub用户，此过程称为白名单。 JupyterHub添加 JupyterHub 用户后，他们可以连接到 JupyterHub URL 并提供其操作系统凭据进行访问。

当用户登录时，会 JupyterHub 打开该用户的笔记本服务器实例，该实例保存在主节点上用户的主目录中，即`/var/lib/jupyter/home/username`。如果笔记本服务器实例不存在，则会在用户的主目录中 JupyterHub 生成一个笔记本实例。以下各节演示如何将用户单独添加到操作系统和操作系统中 JupyterHub，接下来是添加多个用户的基本 bash 脚本。

## 将操作系统用户添加到容器
<a name="emr-jupyterhub-system-user"></a>

以下示例先在容器内使用 [useradd](https://linux.die.net/man/8/useradd) 命令添加单个用户 diego 并为该用户创建一个主目录。第二个命令使用 [chpasswd](https://linux.die.net/man/8/chpasswd) 为此用户设置密码 diego。在使用 SSH 连接时，命令将在主节点命令行上运行。还可以使用步骤运行这些命令，如之前的[通过提交步骤管理](emr-jupyterhub-administer.md#emr-jupyterhub-administer-steps)中所述。

```
sudo docker exec jupyterhub useradd -m -s /bin/bash -N diego
sudo docker exec jupyterhub bash -c "echo diego:diego | chpasswd"
```

## 添加 JupyterHub 用户
<a name="emr-jupyterhub-jupyterhub-user"></a>

您可以使用中的**管理**面板 JupyterHub 或 REST API 来添加用户和管理员，或者只添加用户。

**使用中的管理面板添加用户和管理员 JupyterHub**

1. 使用 SSH 连接到主节点，然后使用*MasterNodeDNS*具有管理员权限的身份登录 https: //: 9443。

1. 选择 **Control Panel (控制面板)**、**Admin (管理员)**。

1. 选择 **User (用户)**、**Add Users (添加用户)**，或选择 **Admin (管理员)**、**Add Admins (添加管理员)**。

**使用 REST API 添加用户**

1. 使用 SSH 连接到主节点并在主节点上使用以下命令，或将此命令作为步骤运行。

1. 获取管理令牌以发出 API 请求，然后*AdminToken*在以下步骤中使用该令牌替换。

1. 使用以下命令，*UserName*替换为在容器中创建的操作系统用户。

   ```
   curl -XPOST -H "Authorization: token AdminToken" "https://$(hostname):9443/hub/api/users/UserName
   ```

**注意**  
首次登录 JupyterHub Web 界面时，系统会自动将您添加为 JupyterHub 非管理员用户。

## 示例：用于添加多个用户的清除脚本
<a name="emr-jupyterhub-script-multuser"></a>

以下示例 bash 脚本结合了本节中前面的步骤，创建了多个 JupyterHub 用户。此脚本可以直接在主节点上运行，也可上载到 Amazon S3 并在之后作为步骤运行。

此脚本先建立一组用户名，并使用 `jupyterhub token` 命令为默认管理员 jovyan 创建一个 API 令牌。然后，它在 `jupyterhub` 容器中为每个用户创建一个操作系统用户，以为每个用户分配一个与其用户名相同的初始密码。最后，它调用 REST API 操作在中创建每个用户 JupyterHub。它在脚本中传递之前生成的令牌并将 REST 响应传输到 `jq` 以方便查看。

```
# Bulk add users to container and JupyterHub with temp password of username
set -x
USERS=(shirley diego ana richard li john mary anaya)
TOKEN=$(sudo docker exec jupyterhub /opt/conda/bin/jupyterhub token jovyan | tail -1)
for i in "${USERS[@]}"; 
do 
   sudo docker exec jupyterhub useradd -m -s /bin/bash -N $i
   sudo docker exec jupyterhub bash -c "echo $i:$i | chpasswd"
   curl -XPOST --silent -k https://$(hostname):9443/hub/api/users/$i \
 -H "Authorization: token $TOKEN" | jq
done
```

将此脚本保存到 Amazon S3 中的位置（如 `s3://amzn-s3-demo-bucket/createjupyterusers.sh`）。然后，可以使用 `script-runner.jar` 将此脚本作为步骤运行。

### 示例：创建集群时运行脚本（AWS CLI）
<a name="emr-jupyterhub-multuser-createcluster"></a>

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
--applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
--use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \
--steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```

### 在现有集群上运行脚本（AWS CLI）
<a name="emr-jupyterhub-multuser-runningcluster"></a>

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr add-steps --cluster-id j-XXXXXXXX --steps Type=CUSTOM_JAR,\
Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```