身份验证和授权#

身份验证是关于身份,而授权是关于权限。在本节中,您将学习如何通过选择和配置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

在上面的配置中,我们配置了三件事

  1. JupyterHub 被指示使用虚拟身份验证器登录(仅适用于测试目的),

  2. 任何人都可以使用用户名 user1-4 和密码 a-shared-secret-password 登录

  3. user1user2 将拥有管理员权限,而 user3user4 将是普通用户。

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 用户进行身份验证。

  1. 登录 Google API 控制台

  2. 选择一个项目 > 创建项目... 并设置“项目名称”。这是一个仅在控制台中显示的简短术语。如果您已经创建了项目,则可以跳过此步骤。

  3. 在顶部的搜索栏中输入“凭据”,然后单击以访问凭据 API。

  4. 单击“创建凭据”,然后单击“OAuth 客户端 ID”。选择“应用程序类型”>“Web 应用程序”。

  5. 为您的 JupyterHub 实例输入一个名称。您可以为其提供一个描述性名称,也可以将其设置为集线器的主机名。

  6. 将“授权的 JavaScript 来源”设置为您的集线器的 URL。

  7. 将“授权的重定向 URI”设置为您的集线器的 URL 后跟 /hub/oauth_callback。例如,https://your-jupyterhub-domain/hub/oauth_callback

  8. 单击“创建”后,控制台将生成并显示一个客户端 ID 和客户端密钥。保存这些值。

  9. 在顶部的搜索栏中输入“同意屏幕”,然后单击以访问 OAuth 同意屏幕。在这里,您将自定义用户首次登录 JupyterHub 实例时看到的内容。完成操作后,单击保存。

  10. 更新您的 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_addressbind_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