单点登录集成
Neo4j 支持 OpenID Connect (OIDC),允许与包括 Okta、Microsoft Entra ID 和 Google 在内的众多身份提供商集成。此集成允许由身份提供商管理的联合用户访问 Neo4j,替代或补充本机用户和角色。有关不同提供商的示例和故障排除,请参阅SSO 配置教程。
OIDC 配置设置
Neo4j 同时支持多个 OIDC 身份提供商,因此每个提供商配置必须分配一个前缀以区分它们。在下面的配置示例中,提供商特定的前缀由 <provider>
表示,您应将其替换为代表您提供商的名称。例如,如果您使用 Okta 作为身份提供商,您可以在下面的 <provider>
位置使用 okta
。
配置单点登录时,以下配置设置非常重要。有关单点登录配置选项的更详细概述,请参阅配置设置。其中一些设置也可以在数据库运行时更新,有关如何操作的更多信息,请参阅动态设置。更改任何这些设置都会导致用户重新认证,因为他们的权限可能因此而改变。
参数名称 | 默认值 | 动态 | 描述 |
---|---|---|---|
false |
提供商的显示名称。这会显示在 Neo4j Browser 和 Bloom 等客户端中。 |
||
pkce |
true |
Neo4j Browser 和 Bloom 等客户端使用的 OIDC 认证流程。支持的值为 |
|
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 响应中找到具有此名称的声明。该声明可以是表示单个角色的字符串声明,也可以是表示多个角色的字符串数组声明。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 角色同名的身份提供商组。如果您选择这种方式,则无需进行映射配置。然而,如果身份提供商组不直接与所需的 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 角色的声明。
-
配置 Neo4j 以使用JWT 声明的 OpenID Connect。
-
配置从 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 配置具有认证提供商的用户。
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
声明)。
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
。您可以在 <NEO4J_HOME>/conf/server-logs.xml 中进行此操作。
如果您需要更多关于如何设置和管理安全日志的信息,请参阅配置安全日志。
请务必将生产环境中的 dbms.security.logs.oidc.jwt_claims_at_debug_level_enabled 设置回 |