使用 LDAP 身份验证 - Amazon EMR

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

使用 LDAP 身份验证

轻型目录访问协议 (LDAP) 是一种应用程序协议,用于查询和修改与存储在LDAP兼容目录服务提供商(例如 Active Directory 或 Open LDAP 服务器)中的资源(例如用户和计算机)相对应的对象。您可以在 Amazon JupyterHub 上使用 LDAPwith 的 JupyterHub身份验证器插件EMR来LDAP进行用户身份验证。该插件处理LDAP用户的登录会话,并向 Jupyter 提供用户信息。这允许用户使用存储在LDAP兼容服务器中的身份凭据来连接 JupyterHub 和笔记本。

本节中的步骤将引导您完成以下步骤来设置和启LDAP用 LDAP Authenticator 插 JupyterHub件。在连接到主节点命令行时执行这些步骤。有关更多信息,请参阅连接到主节点和笔记本服务器

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

  2. 修改/etc/jupyter/conf/jupyterhub_config.py为启用LDAP身份验证器插件。 JupyterHub

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

  4. LDAP查询用户,然后在容器中为每个用户创建主目录。 JupyterHub 需要主目录来托管笔记本电脑。

  5. 运行可重新启动的脚本 JupyterHub

重要

在设置之前LDAP,请测试您的网络基础架构,以确保LDAP服务器和群集主节点可以根据需要进行通信。TLS通常通过普通TCP连接使用端口 389。如果您的LDAP连接使用SSL,则众所周知的TCP端口SSL是 636。

创建LDAP配置文件

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

  • LDAP服务器运行的是版本 3,可在端口 389 上使用。这是的标准非SSL端口LDAP。

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

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

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

启用LDAP身份验证器插件 JupyterHub

使用文本编辑器修改 /etc/jupyter/conf/jupyterhub_config.py 文件并添加与下类似的 ldapauthenticator 属性。Replace(替换) host 使用LDAP服务器的 IP 地址或可解析的主机名。该示例假设用户对象位于名为的组织单位 (ou) 中 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/ldap/ sudo docker exec jupyterhub bash -c "cat /etc/ldap/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

将属性添加到 Active Directory

要查找每个用户并在数据库中创建相应的条目, JupyterHub docker 容器需要 Active Direct UNIX ory 中相应用户对象的以下属性。有关更多信息,请参阅 “既然 Unix 属性插件不再适用于 Active Directory 用户和计算机MMC” 管理单元,我该如何继续编辑GID/UIDRFC2307 属性一节? 在文章《澄清 Unix 的身份管理状态》(IDMU) 和 Windows Server 2016 技术预览版及以后的版本中的NIS服务器角色中

  • homeDirectory

    这是用户主目录的位置,通常是 /home/username

  • gidNumber

    这是一个大于 60000 的值,尚未被其它用户使用。检查 etc/passwd 文件中是否有正在使用的 GID。

  • uidNumber

    这是一个大于 60000 的值,尚未被其它组使用。检查 etc/group 文件中是否有正在使用的 UID。

  • uid

    这与 username.

创建用户主目录

JupyterHub 需要容器内的主目录来对LDAP用户进行身份验证和存储实例数据。以下示例演示了LDAP目录中的两个用户 s hirley 和 d iego

第一步是使用 ldapsear ch 向LDAP服务器查询每个用户的用户 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

对于用户 sh LDIF irley 和 diego,该ldapsearch命令返回的响应与以下内容类似。

# 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"
注意

LDAP的身份验证器 JupyterHub 不支持创建本地用户。有关更多信息,请参阅有关创建本地用户的LDAP身份验证器配置说明

要手动创建本地用户,请使用以下命令。

sudo docker exec jupyterhub bash -c "echo 'shirley:x:$uidNumber:$gidNumber::/home/shirley:/bin/bash' >> /etc/passwd"

重启 JupyterHub容器

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

sudo docker stop jupyterhub sudo docker start jupyterhub