单点登录集成

Neo4j 支持 OpenID Connect (OIDC),它允许与许多身份提供商集成,包括 Okta、Microsoft Entra ID 和 Google。这种集成允许由身份提供商管理的联合用户访问 Neo4j,而不是或除了本机用户和角色之外。有关不同提供商和故障排除的示例,请参阅SSO 配置教程

OIDC 配置设置

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

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

参数名称 默认值 动态 描述

dbms.security.oidc.<provider>.display_name

false

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

dbms.security.oidc.<provider>.auth_flow

pkce

true

Neo4j Browser 和 Bloom 等客户端使用的 OIDC auth_flow。支持的值为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 响应中找到具有此名称的声明。该声明可以是表示单个角色的字符串声明,也可以是表示多个角色的字符串数组声明。从 Neo4j 5.4 开始,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 内置和自定义定义的角色。为此,您需要了解 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. 使用 JWT 声明的 OpenID Connect配置 Neo4j。

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

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

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

使用身份验证提供程序在用户级别配置 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,该用户可以使用mysso进行身份验证和授权,前提是他们提供一个有效的令牌,并且该令牌的sub声明为jakesUniqueMySsoId。用于身份验证的声明由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

确保将dbms.security.logs.oidc.jwt_claims_at_debug_level_enabled恢复为false,以避免在生产环境中意外记录可能敏感的信息。此外,请记住,身份提供程序在 JWT 中提供的声明集可能会随着时间的推移而发生变化。