单点登录集成

Neo4j 支持 OpenID Connect (OIDC),允许与包括 Okta、Microsoft Entra ID 和 Google 在内的众多身份提供商进行集成。通过此集成,由身份提供商管理的联合用户可以访问 Neo4j,从而替代或补充原生用户和角色。有关不同提供商的示例及故障排除,请参阅 SSO 配置教程

OIDC 配置设置

Neo4j 同时支持多个 OIDC 身份提供商,因此每个提供商的配置都必须分配一个前缀,以与其他配置区分开。在下方的配置示例中,特定于提供商的前缀用 <provider> 表示,您应将其替换为代表您提供商的名称。例如,如果您使用 Okta 作为身份提供商,则可以在下方将 <provider> 替换为 okta

在配置单点登录时,考虑以下配置设置非常重要。有关单点登录配置选项的更详细概述,请参阅 配置设置。其中一些设置也可以在数据库运行时进行更新,有关如何执行此操作的更多信息,请参阅 动态设置。更改这些设置中的任何一项都会导致用户重新进行身份验证,因为其权限可能会因此发生变化。

参数名称 默认值 动态 描述

dbms.security.oidc.<provider>.display_name

false

提供商的显示名称。此名称会显示在 Neo4j Browser 和 Bloom 等客户端中。

dbms.security.oidc.<provider>.auth_flow

pkce

true

供 Neo4j Browser 和 Bloom 等客户端使用的 OIDC 认证流程。支持的值为 pkceimplicit

dbms.security.oidc.<provider>.well_known_discovery_uri

true

提供商的 OpenID Connect Discovery URL。

dbms.security.oidc.<provider>.auth_endpoint

true

提供商的授权端点 (Authorization Endpoint) URL。

dbms.security.oidc.<provider>.auth_params

true

客户端在授权端点可能需要的可选参数。该映射是一个以分号分隔的键值对列表。例如:k1=v1;k2=v2。

dbms.security.oidc.<provider>.token_endpoint

true

提供商的 OAuth 2.0 令牌端点 (Token Endpoint) URL。

dbms.security.oidc.<provider>.token_params

true

客户端在令牌端点可能需要的可选参数。该映射是一个以分号分隔的键值对列表。例如:k1=v1;k2=v2。

dbms.security.oidc.<provider>.jwks_uri

true

提供商的 JSON Web Key Set (JWKS) URL。

dbms.security.oidc.<provider>.user_info_uri

true

提供商的用户信息端点 (UserInfo Endpoint) URL。

dbms.security.oidc.<provider>.issuer

true

提供商声明的发行者标识符 URL。这将与令牌中的 iss 声明进行比对。

dbms.security.oidc.<provider>.audience

true

aud 声明的预期值。

dbms.security.oidc.<provider>.params

true

客户端可能需要的可选参数。该映射是一个以分号分隔的键值对列表。例如:k1=v1;k2=v2。

dbms.security.oidc.<provider>.config

true

客户端可能需要的可选附加配置。该映射是一个以分号分隔的键值对列表。例如:k1=v1;k2=v2。

dbms.security.oidc.<provider>.get_groups_from_user_info

false

true

是否从身份提供商的用户信息端点获取组声明。默认为 false,即从令牌中读取声明。

dbms.security.oidc.<provider>.get_username_from_user_info

false

true

是否从身份提供商的用户信息端点获取用户名声明。默认为 false,即从令牌中读取声明。

dbms.security.oidc.<provider>.claims.username

sub

true

用于数据库用户名的声明。Neo4j 期望在 JWT 或 user_info 响应中找到一个具有此名称的字符串声明。

dbms.security.oidc.<provider>.claims.groups

true

用于数据库角色的声明。Neo4j 期望在 JWT 或 user_info 响应中找到一个具有此名称的声明。该声明可以是代表单个角色的字符串,也可以是代表多个角色的字符串数组。JWT 声明现在还可以包含以字符串形式返回的单个组,以及之前所要求的组列表。

dbms.security.oidc.<provider>.authorization.group_to_role_mapping

true

列出从组到预定义的内置角色 adminarchitectpublishereditorreader,或任何自定义角色的授权映射。

dbms.security.logs.oidc.jwt_claims_at_debug_level_enabled

false

false

当设置为 true 时,会将 JWT 中的声明记录到安全日志中(前提是安全日志级别也设置为 DEBUG)。

配置 Neo4j 以使用 OpenID Connect

首先,您需要在 neo4j.conf 文件中配置 Neo4j 以使用 OpenID Connect 作为身份验证和授权提供商。

  1. 确保已开启安全性。dbms.security.auth_enabled 的默认值为 true

  2. 取消注释设置 dbms.security.authentication_providersdbms.security.authorization_providers,并将它们的值更改为 oidc-<provider>,其中 <provider> 对应于配置设置中使用的提供商名称。这样,OIDC 连接器就被用作身份验证和授权的安全提供商。如果需要,您仍然可以使用 native 提供商进行混合模式的身份验证和授权。这些值以逗号分隔,并按声明的顺序进行查询。

    示例 1. 配置 Neo4j 使用两个 OpenID Connect 和原生身份验证及授权提供商。
    dbms.security.authentication_providers=oidc-newsso,oidc-oldsso,native
    dbms.security.authorization_providers=oidc-newsso,oidc-oldsso,native
  3. 检查连通性。Neo4j 需要连接到身份提供商以发现设置并获取公钥以验证令牌。请检查防火墙设置和安全控制,必要时查看日志,确保 Neo4j 服务器能够使用 HTTPS 连接到身份提供商。如果需要代理,可以在 Java 虚拟机中使用配置设置 server.jvm.additional 进行配置。不支持需要凭据的代理。

将身份提供商组映射到 Neo4j 角色

在使用身份提供商管理的组之前,必须确定一种将身份提供商组映射到 Neo4j 角色的方法。最简单的方法是创建与 Neo4j 角色名称相同的身份提供商组。如果决定采用这种方式,则无需进行映射配置。然而,假设身份提供商组不能与所需的 Neo4j 角色进行 1:1 直接映射,则有必要将身份提供商组映射到 Neo4j 内置和自定义角色。为此,您需要了解 Neo4j 角色具有哪些权限,并根据这些权限创建与身份提供商中定义的组的映射。该映射必须格式化为以分号分隔的键值对列表,其中键是身份提供商组名称,值是对应角色名称的逗号分隔列表。例如:group1=role1;group2=role2;group3=role3,role4,role5;group4=role6;group5=role6

示例 2. 身份提供商组到 Neo4j 角色的映射示例
dbms.security.oidc.mysso.authorization.group_to_role_mapping=\
    neo4j_readonly  = reader;    \ (1)
    neo4j_rw        = editor,publisher; \ (2)
    neo4j_rw        = publisher; \ (3)
    neo4j_create    = publisher; \
    neo4j_dba       = admin; \
    neo4j_exec      = rolename (4)
1 将身份提供商组映射到 Neo4j 内置角色。
2 将身份提供商组映射到两个 Neo4j 内置角色。
3 将两个身份提供商组映射到一个 Neo4j 内置角色。
4 将身份提供商组映射到自定义角色。自定义角色(如 rolename)必须先使用 CREATE ROLE rolename 命令显式创建,然后才能用于授予权限。请参阅 管理角色

当指定显式组到角色的映射时,共享相同名称的组和角色的自动映射将被禁用。这意味着所有组和角色都需要显式指定映射,即使它们名称相同。

配置 Neo4j 以使用 OpenID Connect 身份提供商

此选项允许用户通过提供来自符合 OIDC 标准的身份提供商的令牌,而不是输入用户名和密码来登录。通常,这些令牌采用签名的 JSON Web Token (JWT) 形式。以下配置示例使用 mysso 作为提供商名称。建议使用描述您正在集成的提供商的名称。

使用 JWT 声明的 OpenID Connect

在此配置中,Neo4j 从身份提供商接收一个 JWT,其中包含代表数据库用户名(例如电子邮件)和 Neo4j 角色的声明。

  1. 设置显示名称。

    neo4j.conf 文件中,取消注释并配置以下设置

    dbms.security.oidc.mysso.display_name=SSO Provider

    这将显示在 Neo4j Browser 和 Bloom 等客户端登录页面的按钮上,以便您识别正在使用的登录提供商。

  2. 配置发现。

    取消注释并配置以下设置

    dbms.security.oidc.mysso.well_known_discovery_uri=https://my-idp.example.com/.well-known/openid-configuration

    身份提供商的 well_known_discovery 端点提供 OpenID 提供商元数据,使 Neo4j 能够与该提供商进行交互。也可以手动配置提供商设置

    dbms.security.oidc.mysso.auth_endpoint=https://my-idp.example.com/openid-connect/auth
    dbms.security.oidc.mysso.token_endpoint=https://my-idp.example.com/openid-connect/token
    dbms.security.oidc.mysso.jwks_uri=https://my-idp.example.com/openid-connect/certs
    dbms.security.oidc.mysso.user_info_uri=https://my-idp.example.com/openid-connect/userinfo
    dbms.security.oidc.mysso.issuer=abcd1234

    手动设置的优先级总是高于从发现端点获取的设置。

  3. 配置受众 (Audience)。

    提供受众 (aud) 声明的预期值

    dbms.security.oidc.mysso.claims.audience=myaudience
  4. 配置声明。

    提供映射到数据库用户名和角色的声明名称。username 期望是一个字符串声明,roles 期望是一个代表一组角色的字符串列表,或者是一个代表单个角色的单个字符串。

    dbms.security.oidc.mysso.claims.username=sub
    dbms.security.oidc.mysso.claims.groups=roles
  5. (可选)将 OIDC 组声明中的组映射到 Neo4j 内置角色和自定义角色。

从提供商获取声明的 OpenID Connect

在此配置中,Neo4j 从身份提供商接收一个令牌,并使用该令牌回调身份提供商的 UserInfo 端点,以获取数据库用户名和 Neo4j 角色的声明。

  1. 配置 Neo4j 以使用 使用 JWT 声明的 OpenID Connect

  2. 配置要从 UserInfo 端点获取的声明

    dbms.security.oidc.mysso.get_username_from_user_info=true
    dbms.security.oidc.mysso.get_groups_from_user_info=true

    可以从 userinfo 端点仅获取用户名、仅获取组,或两者同时获取。

使用认证提供商在用户级别配置 SSO

用户认证提供商可用于确定哪些用户可以使用配置的提供商进行身份验证和授权。

要使用认证提供商,您必须将 dbms.security.require_local_user 配置设置更改为 true。这意味着必须存在具有匹配认证提供商的用户,才能进行身份验证和授权。这适用于所有提供商。

相反,当 dbms.security.require_local_user 设置为 false 时,用户的认证提供商对其身份验证和授权方式没有影响,此时身份验证和授权由数据库配置集中控制(针对所有用户)。

以下示例展示了如何使用 Cypher 配置具有认证提供商的用户。

示例 3. 创建一个可以使用 mysso 进行身份验证和授权的具有认证提供商的用户
CREATE USER jake
SET AUTH 'oidc-mysso' {SET ID 'jakesUniqueMySsoId'} // the id must match the claim that you configured via dbms.security.oidc.mysso.claims.username

该命令创建了用户 jake,如果他出示了带有 sub 声明为 jakesUniqueMySsoId 的有效令牌,则可以使用 mysso 进行身份验证和授权。用于身份验证的声明由 dbms.security.oidc.mysso.claims.username 配置设置决定(默认为 sub 声明)。

示例 4. 创建一个具有两个认证提供商的用户,允许该用户使用其中任意一个进行身份验证和授权
CREATE USER jake
SET HOME DATABASE anotherDb
SET AUTH 'oidc-mysso1' {SET ID 'jakesUniqueMySso1Id'} // `jakesUniqueMySso1Id` must match the value of the claim that you configured via dbms.security.oidc.mysso1.claims.username
SET AUTH 'oidc-mysso2' {SET ID 'jakesUniqueMySso2Id'} // `jakesUniqueMySso2Id` must match the value of the claim that you configured via dbms.security.oidc.mysso2.claims.username

该命令创建了用户 jake,他可以使用 mysso1mysso2 进行身份验证和授权。该示例还说明了即使仅使用外部认证提供商,也可以设置用户的默认数据库。

示例 5. 修改用户以移除其一个认证提供商
ALTER USER jake
REMOVE AUTH 'oidc-mysso2'

该命令禁止用户 jake 使用 mysso2 提供商进行身份验证和授权。

示例 6. 修改用户以允许其使用用户名和密码进行身份验证和授权
ALTER USER jake
SET AUTH 'native' {SET PASSWORD 'changeme' SET PASSWORD CHANGE REQUIRED}

该命令允许用户 jake 使用指定的用户名和密码进行身份验证和授权(除了他已经配置使用的内容之外)。

示例 7. 配置数据库以允许通过 mysso 进行身份验证,并通过 native 提供商进行授权
  1. 设置以下数据库配置

    dbms.security.authentication_providers=oidc-mysso
    dbms.security.authorization_providers=native
  2. 创建一个具有 mysso 认证提供商的用户

    CREATE USER jake
    SET AUTH 'oidc-mysso' {SET ID 'jakesUniqueMySsoId'} // `jakesUniqueMySsoId` must match the value of the claim that you configured via dbms.security.oidc.mysso.claims.username
  3. 原生授予该用户 READER 角色

    GRANT ROLE READER TO jake

    该命令允许用户 jake 使用 mysso 进行身份验证,并从 native 提供商接收 READER 角色。

  4. 您还可以通过将 mysso 也设置为授权提供商,从而赋予用户来自 mysso native 的角色并集。

    dbms.security.authentication_providers=oidc-mysso
    dbms.security.authorization_providers=native,oidc-mysso
示例 8. 挂起用户
ALTER USER jake
SET STATUS SUSPENDED

该命令完全禁止用户通过任何方式进行身份验证/授权。

在测试环境中使用自签名证书 (SSL)

生产环境应始终使用由证书颁发机构颁发的 SSL 证书,以实现对身份提供商的安全访问。但是,在某些情况下(例如在测试环境中),您可能希望在身份提供商服务器上使用自签名 SSL 证书。

要配置身份提供商服务器上使用的自签名 SSL 证书,请在 neo4j.conf 中使用 server.jvm.additional 输入包含相关证书的 Java 密钥库的详细信息。证书文件 MyCert.jks 的路径是 Neo4j 服务器的绝对路径。

server.jvm.additional=-Djavax.net.ssl.keyStore=/path/to/MyCert.jks
server.jvm.additional=-Djavax.net.ssl.keyStorePassword=mypasword
server.jvm.additional=-Djavax.net.ssl.trustStore=/path/to/MyCert.jks
server.jvm.additional=-Djavax.net.ssl.trustStorePassword=mypasword

JWT 声明的调试日志记录

在设置 OIDC 集成时,有时需要执行故障排除。在这种情况下,查看身份提供商提供的 JWT 中包含的声明可能会很有用。

要以 DEBUG 级别在安全日志中启用这些声明的记录,请将 dbms.security.logs.oidc.jwt_claims_at_debug_level_enabled 设置为 true,并将安全日志级别设置为 DEBUG。您可以在 <NEO4J_HOME>/conf/server-logs.xml 中执行此操作。

如果需要有关如何设置和管理安全日志的更多信息,请参阅 配置安全日志

请务必在生产环境中将 dbms.security.logs.oidc.jwt_claims_at_debug_level_enabled 设置回 false,以避免不必要地记录潜在的敏感信息。此外,请记住,身份提供商在 JWT 中提供的声明集可能会随时间发生变化。