Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 LDAP 身份验证

轻型目录访问协议 (LDAP) 是一种应用程序协议,用于查询和修改与 LDAP 兼容目录服务提供程序(如 Active Directory 或 OpenLDAP server)中存储的资源(如用户和计算机)对应的对象。可以结合使用适用于 JupyterHub 的 LDAP Authenticator 插件和 JupyterHub on Amazon EMR 来使用 LDAP 执行用户身份验证。此插件处理 LDAP 用户的登录会话并为 Jupyter 提供用户信息。这使用户能够通过使用存储在 LDAP 兼容服务器中的身份的凭证连接到 JupyterHub 和笔记本。

此部分中的步骤演练以下使用适用于 JupyterHub 的 LDAP Authenticator 插件设置和启用 LDAP 的步骤。在连接到主节点命令行时执行这些步骤。有关更多信息,请参阅 连接到主节点和笔记本服务器

  1. 创建一个包含 LDAP 服务器相关信息(如主机 IP 地址、端口、绑定名称等)的 LDAP 配置文件。

  2. 修改 /etc/jupyter/conf/jupyterhub_config.py 以启用适用于 JupyterHub 的 LDAP Authenticator 插件。

  3. 创建并运行在 jupyterhub 容器内配置 LDAP 的脚本。

  4. 在 LDAP 中查询用户,然后在容器内为所有用户创建主目录。JupyterHub 需要主目录托管笔记本。

  5. 运行重启 JupyterHub 的脚本

重要

在设置 LDAP 之前,测试网络基础设施以确保 LDAP 服务器和集群主节点可以根据需要进行通信。TLS 一般通过普通 TCP 连接使用端口 389。如果 LDAP 连接使用 SSL,那么显而易见,适用于 SSL 的 TCP 端口为 636。

创建 LDAP 配置文件

下方的示例使用以下占位符配置值。将这些值替换为与您的实施匹配的参数。

  • 正在运行的是 LDAP 服务器版本 3,通过端口 389 提供。这是适用于 LDAP 的标准非 SSL 端口。

  • 基本可分辨名称 (DN) 为 dc=example, dc=org

使用文本编辑器创建内容与下类似的 ldap.conf 文件。使用适用于 LDAP 实施的值。将 host 替换为 LDAP 服务器的 IP 地址或可解析主机名。

base dc=example,dc=org uri ldap://host ldap_version 3 binddn cn=admin,dc=example,dc=org bindpw admin

启用适用于 JupyterHub 的 LDAP Authenticator 插件

使用文本编辑器修改 /etc/jupyter/conf/jupyterhub_config.py 文件并添加与下类似的 ldapauthenticator 属性。将 host 替换为 LDAP 服务器的 IP 地址或可解析主机名。此示例假定用户对象位于名为 people 的组织部门内,并使用之前使用 ldap.conf 建立的可分辨名称组件。

c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator' c.LDAPAuthenticator.use_ssl = False c.LDAPAuthenticator.server_address = 'host' c.LDAPAuthenticator.bind_dn_template = 'cn={username},ou=people,dc=example,dc=org'

在容器内配置 LDAP

使用文本编辑器创建包含以下内容的清除脚本:

#!/bin/bash # Uncomment the following lines to install LDAP client libraries only if # using Amazon EMR release version 5.14.0. Later versions install libraries by default. # sudo docker exec jupyterhub bash -c "sudo apt-get update" # sudo docker exec jupyterhub bash -c "sudo apt-get -y install libnss-ldap libpam-ldap ldap-utils nscd" # Copy ldap.conf sudo docker cp ldap.conf jupyterhub:/etc/ sudo docker exec jupyterhub bash -c "cat /etc/ldap.conf" # configure nss switch sudo docker exec jupyterhub bash -c "sed -i 's/\(^passwd.*\)/\1 ldap/g' /etc/nsswitch.conf" sudo docker exec jupyterhub bash -c "sed -i 's/\(^group.*\)/\1 ldap/g' /etc/nsswitch.conf" sudo docker exec jupyterhub bash -c "sed -i 's/\(^shadow.*\)/\1 ldap/g' /etc/nsswitch.conf" sudo docker exec jupyterhub bash -c "cat /etc/nsswitch.conf" # configure PAM to create home directories sudo docker exec jupyterhub bash -c "echo 'session required pam_mkhomedir.so skel=/etc/skel umask=077' >> /etc/pam.d/common-session" sudo docker exec jupyterhub bash -c "cat /etc/pam.d/common-session" # restart nscd service sudo docker exec jupyterhub bash -c "sudo service nscd restart" # Test sudo docker exec jupyterhub bash -c "getent passwd" # Install ldap plugin sudo docker exec jupyterhub bash -c "pip install jupyterhub-ldapauthenticator"

将脚本保存到主节点,然后从主节点命令行运行它。例如,对于另存为 configure_ldap_client.sh 的脚本,使此文件成为可执行文件:

chmod +x configure_ldap_client.sh

并运行此脚本:

./configure_ldap_client.sh

创建用户主目录

JupyterHub 需要容器内的主目录才能验证 LDAP 用户的身份和存储实例数据。以下示例演示了 LDAP 目录中的两个用户 shirleydiego

第一步是在 LDAP 服务器中使用 ldapsearch 查询每个用户的用户 ID 和组 ID 信息(如以下示例中所示),以将 host 替换为 LDAP 服务器的 IP 地址和可解析的主机名:

ldapsearch -x -H ldap://host \ -D "cn=admin,dc=example,dc=org" \ -w admin \ -b "ou=people,dc=example,dc=org" \ -s sub \ "(objectclass=*)" uidNumber gidNumber

ldapsearch 命令将为 shirleydiego 用户返回看上去与下类似的 LDIF 格式的响应。

# extended LDIF # # LDAPv3 # base <ou=people,dc=example,dc=org> with scope subtree # filter: (objectclass=*) # requesting: uidNumber gidNumber sn # # people, example.org dn: ou=people,dc=example,dc=org # diego, people, example.org dn: cn=diego,ou=people,dc=example,dc=org sn: B uidNumber: 1001 gidNumber: 100 # shirley, people, example.org dn: cn=shirley,ou=people,dc=example,dc=org sn: A uidNumber: 1002 gidNumber: 100 # search result search: 2 result: 0 Success # numResponses: 4 # numEntries: 3

通过使用响应中的信息,在容器内运行命令以为每个用户公用名 (cn) 创建一个主目录。使用 uidNumbergidNumber 确定用户对主目录的所有权。以下示例命令将为用户 shirley 执行此操作。

sudo docker container exec jupyterhub bash -c "mkdir /home/shirley" sudo docker container exec jupyterhub bash -c "chown -R $uidNumber /home/shirley" sudo docker container exec jupyterhub bash -c "sudo chgrp -R $gidNumber /home/shirley"

重新启动 Jupyterhub 容器

运行以下命令重新启动 jupyterhub 容器:

sudo docker stop jupyterhub sudo docker start jupyterhub