单点登录集成
Neo4j 支持 OpenID Connect (OIDC),它允许与许多身份提供商集成,包括 Okta、Microsoft Entra ID 和 Google。这种集成允许由身份提供商管理的联合用户访问 Neo4j,而不是或除了本机用户和角色之外。有关不同提供商和故障排除的示例,请参阅SSO 配置教程。
OIDC 配置设置
Neo4j 同时支持多个 OIDC 身份提供商,因此每个提供商配置都必须分配一个前缀以将其与其他提供商区分开来。在下面的配置示例中,特定于提供商的前缀由<provider>
表示,应将其替换为表示您的提供商的名称。例如,如果您使用 Okta 作为您的身份提供商,您可以在下面使用okta
代替<provider>
。
配置单点登录时,以下配置设置非常重要。有关单点登录配置选项的更详细概述,请参阅配置设置。其中一些设置也可以在数据库运行时更新,请参阅动态设置,了解有关如何执行此操作的更多信息。更改任何这些设置会导致用户重新进行身份验证,因为他们的权限可能已因此发生更改。
参数名称 | 默认值 | 动态 | 描述 |
---|---|---|---|
false |
提供商的显示名称。这显示在 Neo4j Browser 和 Bloom 等客户端中。 |
||
pkce |
true |
Neo4j Browser 和 Bloom 等客户端使用的 OIDC auth_flow。支持的值为 |
|
true |
提供商的 OpenID Connect 发现 URL。 |
||
true |
提供商的授权端点的 URL。 |
||
true |
客户端可能需要与授权端点一起使用的可选参数。该映射是一个用分号分隔的键值对列表。例如:k1=v1;k2=v2。 |
||
true |
提供商的 OAuth 2.0 令牌端点的 URL。 |
||
true |
客户端可能需要与令牌端点一起使用的选项参数。该映射是一个用分号分隔的键值对列表。例如:k1=v1;k2=v2。 |
||
true |
提供商的 JSON Web 密钥集的 URL。 |
||
true |
提供商的用户信息端点的 URL。 |
||
true |
提供商断言为其颁发者标识符的 URL。这将针对令牌中的 |
||
true |
|
||
true |
客户端可能需要的选项参数。该映射是一个用分号分隔的键值对列表。例如:k1=v1;k2=v2。 |
||
true |
客户端可能需要的选项其他配置。该映射是一个用分号分隔的键值对列表。例如:k1=v1;k2=v2。 |
||
false |
true |
是否从身份提供商的用户信息端点获取组声明。默认值为 |
|
false |
true |
是否从身份提供商的用户信息端点获取用户名声明。默认值为 |
|
sub |
true |
用于数据库用户名的声明。Neo4j 预计在 JWT 或 user_info 响应中找到具有此名称的字符串声明。 |
|
true |
用于数据库角色的声明。Neo4j 预计在 JWT 或 user_info 响应中找到具有此名称的声明。该声明可以是表示单个角色的字符串声明,也可以是表示多个角色的字符串数组声明。从 Neo4j 5.4 开始,JWT 声明还可以包含作为字符串返回的单个组以及之前所需的组列表。 |
||
dbms.security.oidc.<provider>.authorization.group_to_role_mapping |
true |
列出从组到预定义的内置角色 |
|
false |
false |
设置为 |
配置 Neo4j 以使用 OpenID Connect
首先,您需要在neo4j.conf文件中配置 Neo4j 以使用 OpenID Connect 作为身份验证和授权提供程序。
-
确保安全已启用。
dbms.security.auth_enabled
的默认值为true
。 -
取消注释设置
dbms.security.authentication_providers
和dbms.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
-
检查连接性。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
。
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。
-
设置显示名称。
在neo4j.conf文件中,取消注释并配置以下设置
dbms.security.oidc.mysso.display_name=SSO Provider
这显示在 Neo4j Browser 和 Bloom 等客户端的登录页面上的按钮上,以便您可以识别您用于登录的提供商。
-
配置发现。
取消注释并配置以下设置
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
手动设置始终优先于从发现端点检索的设置。
-
配置受众。
提供受众 (
aud
) 声明的预期值dbms.security.oidc.mysso.claims.audience=myaudience
-
配置声明。
提供映射到数据库用户名和角色的声明的名称。
username
应为字符串声明,roles
应为表示一组角色的字符串列表或表示单个角色的单个字符串dbms.security.oidc.mysso.claims.username=sub dbms.security.oidc.mysso.claims.groups=roles
-
可选地,将 OIDC 组声明中的组映射到 Neo4j 内置和自定义角色。
从提供商获取声明的 OpenID Connect
在此配置中,Neo4j 从身份提供商接收令牌,并使用该令牌通过其UserInfo端点回调到身份提供商以检索数据库用户名和 Neo4j 角色的声明。
-
为使用 JWT 声明的 OpenID Connect配置 Neo4j。
-
配置要从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 配置具有身份验证提供程序的用户。
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
声明)。
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
,该用户可以使用mysso1
或mysso2
进行身份验证和授权。此示例还说明,即使仅使用外部身份验证提供程序,用户也可以设置其主数据库。
ALTER USER jake
REMOVE AUTH 'oidc-mysso2'
此命令阻止用户jake
能够使用mysso2
提供程序进行身份验证和授权。
ALTER USER jake
SET AUTH 'native' {SET PASSWORD 'changeme' SET PASSWORD CHANGE REQUIRED}
此命令允许用户jake
使用指定的用户名和密码进行身份验证和授权(除了他们已配置使用的其他方式)。
mysso
进行身份验证,并通过native
提供程序进行授权-
设置以下数据库配置
dbms.security.authentication_providers=oidc-mysso dbms.security.authorization_providers=native
-
创建一个具有
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
-
以原生方式向用户授予
READER
角色GRANT ROLE READER TO jake
此命令允许用户
jake
使用mysso
进行身份验证,并从native
提供程序接收READER
角色。 -
您还可以通过将
mysso
也设置为授权提供程序,来让用户获得来自mysso
**和**native
的角色的并集dbms.security.authentication_providers=oidc-mysso dbms.security.authorization_providers=native,oidc-mysso
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恢复为 |