身份验证和授权#
身份验证是关于身份,而授权是关于权限。在本节中,您将学习如何通过选择和配置JupyterHub 身份验证器类来配置两者。
例如,您可以配置 JupyterHub 将身份验证和授权委托给 GitHubOAuthenticator。它允许用户使用 GitHub 帐户登录,其中可能只有少数特定用户和其他用户属于特定 GitHub 组织的用户被允许访问。
在使用外部身份提供者配置身份验证之前,您必须设置 HTTPS.
有用理解#
身份验证器类#
默认情况下,Z2JH 部署使用 jupyterhub.auth.DummyAuthenticator
JupyterHub 身份验证器类,允许任何人使用任何用户名和密码登录。这仅应用于初始测试目的。
您应该决定要使用的 [jupyterhub 身份验证器类]。hub 镜像中通过 安装的 Python 包 提供了几个这样的类,其中一些在下面描述。
配置系统#
首先,我们应该通过此 Helm 图表的 hub.config
配置来配置 JupyterHub 以使用我们选择的身份验证器类以及身份验证器类本身。
通用配置#
由于所有身份验证器类都源自 jupyterhub.auth.Authenticator
基类,因此它们共享一些配置选项。以下是基类中的一些常见配置选项。
allowed_users / admin_users#
一些身份验证器类可能除了此之外还有专门的逻辑来授权用户。
hub:
config:
Authenticator:
admin_users:
- user1
- user2
allowed_users:
- user3
- user4
# ...
DummyAuthenticator:
password: a-shared-secret-password
JupyterHub:
authenticator_class: dummy
在上面的配置中,我们配置了三件事
JupyterHub 被指示使用虚拟身份验证器登录(仅适用于测试目的),
任何人都可以使用用户名
user1-4
和密码a-shared-secret-password
登录user1
和user2
将拥有管理员权限,而user3
和user4
将是普通用户。
auto_login#
例如,如果您已使用 GitHub 配置身份验证,则页面 /hub/login
将显示一个橙色的按钮,用户需要点击该按钮登录。如果您想绕过此屏幕,并将用户直接发送到 GitHub 登录页面,可以将 auto_login
设置为 true
。
hub:
config:
Authenticator:
auto_login: true
enable_auth_state#
如果您希望 JupyterHub 持久保存登录过程中接收到的敏感信息,则需要启用它。
hub:
config:
Authenticator:
enable_auth_state: true
有关身份验证状态的更多信息,请参阅 JupyterHub 的身份验证状态文档。
注意
身份验证状态的加密和解密需要一个加密密钥。
从 1.0.0 版本开始,该密钥将自动生成,无需手动设置。
如果您想重置生成的密钥,可以使用 kubectl edit
编辑通常名为 hub
的 k8s Secret,并删除 k8s Secret 中的 hub.config.CryptKeeper.keys
条目,然后执行新的 helm upgrade
。
要手动设置加密密钥,可以按照以下步骤操作。
hub:
config:
CryptKeeper:
keys:
- 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
配置身份验证器类#
下面提供了一些常用身份验证器类的配置示例。有关它们的更多详细信息,请参阅身份验证器类的文档。
基于 OAuth2 的身份验证#
JupyterHub 的 oauthenticator 项目支持使用第三方 OAuth2 身份提供者(如 GitHub、Google 和 CILogon)进行身份验证。所有这些都需要 OAuth2 客户端 ID 和 客户端密钥。
有关如何获取客户端 ID 和客户端密钥的详细信息,请参阅 oauthenticator 的文档。
GitHub#
警告
本文档可能未更新。因此,请仅将此文档作为官方 GitHubOAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
GitHub 是最大的 git 存储库托管服务。在 GitHub 上创建帐户是免费的,设置 OAuth 凭据也很简单,这样用户就可以使用他们的 GitHub 用户名/密码进行身份验证。
要在 GitHub 上创建 OAuth 凭据,请按照以下步骤操作
点击您的个人资料图片 -> 设置 -> 开发者设置
确保您位于“OAuth 应用”选项卡,然后点击“新建 OAuth 应用”。
填写表格(您需要您的 hub 地址)并生成您的 ID/密钥。
要启用 GitHub 身份验证,您的 config.yaml
应包含以下配置
hub:
config:
GitHubOAuthenticator:
client_id: your-client-id
client_secret: your-client-secret
oauth_callback_url: https://your-jupyterhub-domain/hub/oauth_callback
JupyterHub:
authenticator_class: github
确保 oauth_callback_url
与您在 GitHub 中设置的 URL 相匹配。
要将访问权限限制为一个或多个 GitHub 组织的成员,请使用以下部分修改之前的配置。
hub:
config:
GitHubOAuthenticator:
allowed_organizations:
- my-github-organization
scope:
- read:org
如果您想将访问权限限制为 GitHub 组织中的特定团队,请使用以下语法
hub:
config:
GitHubOAuthenticator:
allowed_organizations:
- my-github-organization:my-team
scope:
- read:org
关于范围的选择
如果您只列出整个组织而不是特定团队,并且用户 公开其组织成员资格,则较窄的范围 read:user
足以用于 allowed_organizations
的配置。
较宽的范围 read:org
没有 read:user
的限制,但需要 allowed_organizations
中列出的 GitHub 组织的管理员进行一次性批准。组织用户可以 按照 GitHub 上的文档请求此类批准。
有关 GitHub 范围的详细信息,请参阅 GitHub 文档。
Google#
警告
本文档可能尚未更新。因此,请仅将此作为官方 GoogleOAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
许多大学使用 Google 身份验证(它是“G Suite”的一部分)。
如果您的机构是 G Suite 客户,并与 Google 服务(如 Gmail、日历和云端硬盘)集成,您可以使用 Google 身份验证对 JupyterHub 用户进行身份验证。
登录 Google API 控制台。
选择一个项目 > 创建项目... 并设置“项目名称”。这是一个仅在控制台中显示的简短术语。如果您已经创建了项目,则可以跳过此步骤。
在顶部的搜索栏中输入“凭据”,然后单击以访问凭据 API。
单击“创建凭据”,然后单击“OAuth 客户端 ID”。选择“应用程序类型”>“Web 应用程序”。
为您的 JupyterHub 实例输入一个名称。您可以为其提供一个描述性名称,也可以将其设置为集线器的主机名。
将“授权的 JavaScript 来源”设置为您的集线器的 URL。
将“授权的重定向 URI”设置为您的集线器的 URL 后跟
/hub/oauth_callback
。例如,https://your-jupyterhub-domain/hub/oauth_callback
。单击“创建”后,控制台将生成并显示一个客户端 ID 和客户端密钥。保存这些值。
在顶部的搜索栏中输入“同意屏幕”,然后单击以访问 OAuth 同意屏幕。在这里,您将自定义用户首次登录 JupyterHub 实例时看到的内容。完成操作后,单击保存。
更新您的 Helm 图表配置 (
config.yaml
),使其看起来像这样。
hub:
config:
GoogleOAuthenticator:
client_id: your-client-id.apps.googleusercontent.com
client_secret: your-client-secret
oauth_callback_url: https://your-jupyterhub-domain/hub/oauth_callback
hosted_domain:
- your-university.edu
login_service: Your university
JupyterHub:
authenticator_class: google
将 oauth_callback_url
键设置为之前指定的授权重定向 URI。将 hosted_domain
设置为您的机构的域名。login_service
的值是您机构的描述性术语,用于提醒用户他们使用哪个帐户登录。
CILogon#
警告
本文档可能尚未更新。因此,请仅将此作为官方 CILogonOAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
有关 CILogon 管理的标识类型,请参阅 CyberInfrastructure Logon 的 网站。
hub:
config:
CILogonOAuthenticator:
client_id: your-client-id
client_secret: your-client-secret
oauth_callback_url: https://your-jupyterhub-domain/hub/oauth_callback
JupyterHub:
authenticator_class: cilogon
Globus#
警告
本文档可能尚未更新。因此,请仅将此作为官方 GlobusOAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
Globus Auth 是一个基础身份和访问管理平台服务,旨在满足科学和工程界独特的需求。无论您的文件位于超级计算机、实验室集群、磁带存档、公共云还是您自己的笔记本电脑上,Globus 都提供基于云的服务,用于可靠地移动、共享、发布和发现数据。从 这里 开始 Globus 应用程序!
hub:
config:
GlobusOAuthenticator:
client_id: your-client-id
client_secret: your-client-secret
oauth_callback_url: https://your-jupyterhub-domain/hub/oauth_callback
identity_provider: your-university.edu
JupyterHub:
authenticator_class: globus
Azure Active Directory#
警告
本文档可能尚未更新。因此,请仅将此作为官方 AzureAdOAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
Azure Active Directory 是来自 Microsoft Azure 的身份提供者。除了需要 OAuth2 的 *客户端 ID* 和 *客户端密钥* 外,您还需要一个 *租户 ID*。
hub:
config:
AzureAdOAuthenticator:
client_id: your-client-id
client_secret: your-client-secret
oauth_callback_url: https://your-jupyterhub-domain/hub/oauth_callback
tenant_id: your-tenant-id
JupyterHub:
authenticator_class: azuread
Auth0#
警告
本文档可能尚未更新。因此,请仅将此作为官方 Auth0OAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
Auth0 是一个商业身份管理提供商。
hub:
config:
Auth0OAuthenticator:
client_id: client-id-from-auth0-here
client_secret: client-secret-from-auth0-here
oauth_callback_url: https://your-jupyterhub-domain/hub/oauth_callback
auth0_domain: prod-8ua-1yy9.auth0.com
scope:
- openid
- email
JupyterHub:
authenticator_class: auth0
GenericOAuthenticator - OpenID Connect#
警告
本文档可能未及时更新。因此,请仅将此文档用作官方 GenericOAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
OpenID Connect 是建立在 OAuth 2.0 协议之上的身份层,由 各种服务器和服务 实现。虽然 oauthentiator 不支持 OpenID Connect 端点发现,但您仍然可以通过在 GenericOAuthenticator 类中指定所有端点来配置 JupyterHub 以使用 OpenID Connect 提供商进行身份验证。
KeyCloak#
警告
本文档可能未及时更新。因此,请仅将此文档用作官方 GenericOAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
KeyCloak 是一个开源的身份管理提供商,您可以自行托管。以下是有关如何配置 GenericOAuthenticator 类以针对 KeyCloak 服务器(版本 17 或更高版本)进行身份验证的示例。
要配置 OpenID Connect 客户端,请参阅 KeyCloak 自身文档。
hub:
config:
GenericOAuthenticator:
client_id: your-client-id
client_secret: your-client-secret
oauth_callback_url: https://your-jupyterhub-domain/hub/oauth_callback
authorize_url: https://${host}/realms/${realm}/protocol/openid-connect/auth
token_url: https://${host}/realms/${realm}/protocol/openid-connect/token
userdata_url: https://${host}/realms/${realm}/protocol/openid-connect/userinfo
login_service: keycloak
username_claim: preferred_username
userdata_params:
state: state
# In order to use keycloak client's roles as authorization layer
claim_groups_key: roles
allowed_groups:
- user
admin_groups:
- admin
JupyterHub:
authenticator_class: generic-oauth
LDAP 和 Active Directory#
警告
本文档可能未及时更新。因此,请仅将此文档用作官方 LDAPAuthenticator 文档 的补充。
今后,我们的目标是确保 OAuthenticator 项目中有良好的文档,并参考该文档,而不是在该项目中维护类似的文档。
JupyterHub 支持 LDAP 和 Active Directory 身份验证。阅读 ldapauthenticator 文档以详细了解可用参数。
仅 server_address
和 bind_dn_template
是必需的,因此最小配置如下所示。
hub:
config:
JupyterHub:
authenticator_class: ldapauthenticator.LDAPAuthenticator
LDAPAuthenticator:
bind_dn_template:
- cn={username},ou=edir,ou=people,ou=EXAMPLE-UNIT,o=EXAMPLE
server_address: ldap.EXAMPLE.org
下面提供了另一个示例,等效于 ldapauthenticator README 中给出的示例。
hub:
config:
JupyterHub:
authenticator_class: ldapauthenticator.LDAPAuthenticator
LDAPAuthenticator:
allowed_groups:
- cn=researcher,ou=groups,dc=wikimedia,dc=org
- cn=operations,ou=groups,dc=wikimedia,dc=org
bind_dn_template:
- uid={username},ou=people,dc=wikimedia,dc=org
- uid={username},ou=developers,dc=wikimedia,dc=org
escape_userdn: false
lookup_dn: true
lookup_dn_search_filter: ({login_attr}={login})
lookup_dn_search_password: secret
lookup_dn_search_user: ldap_search_user_technical_account
lookup_dn_user_dn_attribute: cn
server_address: ad.EXAMPLE.org
user_attribute: sAMAccountName
user_search_base: ou=people,dc=wikimedia,dc=org