单点登录集成

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 发现 URL。

dbms.security.oidc.<provider>.auth_endpoint

true

提供商授权端点的 URL。

dbms.security.oidc.<provider>.auth_params

true

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

dbms.security.oidc.<provider>.token_endpoint

true

提供商 OAuth 2.0 令牌端点的 URL。

dbms.security.oidc.<provider>.token_params

true

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

dbms.security.oidc.<provider>.jwks_uri

true

提供商的 JSON Web 密钥集 URL。

dbms.security.oidc.<provider>.user_info_uri

true

提供商的用户信息端点 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 角色同名的身份提供商组。如果您选择这种方式,则无需进行映射配置。然而,如果身份提供商组不直接与所需的 Neo4j 角色一对一映射,则有必要将身份提供商组映射到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 令牌 (JWT) 的形式。以下配置示例使用 mysso 作为提供商的名称。建议使用描述正在集成的提供商的名称。

使用 JWT 声明的 OpenID Connect

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

  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. 配置受众。

    提供受众 (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,只要他们提供一个有效的、带有 jakesUniqueMySsoId sub 声明的令牌,就可以使用 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 中提供的声明集可能会随时间变化。

© . All rights reserved.