安全与风控
用 Cypher 在 Neo4j 系统库中程序化管理用户…
当需要通过 Cypher 在 system 数据库中以编程方式管理 Neo4j 用户、角色、权限授予/拒绝、属性级与子图级访问控制及 ABAC 规则时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Cypher 在 Neo4j 系统库特定
解决思路
- 所有安全相关 Cypher 都在 system 数据库执行:Neo4j 会自动将 CREATE/ALTER/SHOW USER|ROLE|PRIVILEGE 路由到 system;用 cypher-shell 时加 -d system,用 driver 时设 database="system"。
- 写操作前必须走 MCP Write Gate:在执行 CREATE USER/ALTER USER/DROP USER、CREATE ROLE/DROP ROLE、GRANT/DENY/REVOKE、CREATE AUTH RULE/DROP AUTH RULE 之前,先展示计划命令并等待明确确认,绝不自动执行权限变更。
- 创建用户:CREATE USER alice SET PASSWORD 'secret' CHANGE NOT REQUIRED;CHANGE REQUIRED 为默认(首次登录强制改密),CHANGE NOT REQUIRED 立即生效;SET STATUS ACTIVE(默认)或 SUSPENDED。
- 脚本中优先使用参数化密码:CREATE USER $username SET PASSWORD $password CHANGE NOT REQUIRED。
- 修改用户:ALTER USER alice SET PASSWORD $newPw CHANGE NOT REQUIRED;SET STATUS SUSPENDED 锁定账号;SET STATUS ACTIVE 解锁;SET HOME DATABASE mydb 设置默认库;ALTER USER alice IF EXISTS SET PASSWORD $pw 在用户不存在时安全跳过。
- 用户标签(2026.06+,Enterprise):CREATE USER jake SET PASSWORD $pw SET TAGS 'finance', 'auditor';ALTER USER jake REMOVE TAG 'auditor' ADD TAG 'on-call'(顺序为 REMOVE 先于 ADD 先于 SET);ALTER USER jake SET TAGS 'finance', 'auditor' 替换全部标签;ALTER USER jake REMOVE ALL TAGS;ALTER USERS jake, alice ADD TAGS 'pii-access' 批量编辑。
- 标签权限:SET/ADD/REMOVE TAG[S] 需要 SET USER METADATA;读取标签值需要 SHOW USER METADATA;GRANT SET USER METADATA ON DBMS TO userAdmin;GRANT SHOW USER METADATA ON DBMS TO auditor;GRANT USER METADATA MANAGEMENT ON DBMS TO userManager 同时授予以上两者。
- 查看用户:SHOW USERS YIELD user, roles, passwordChangeRequired, suspended, home WHERE suspended = false RETURN user, roles ORDER BY user;SHOW USERS YIELD user, roles, tags(无 SHOW USER METADATA 时 tags 列为 null,2026.06+);SHOW USERS AS COMMANDS 生成整个 DBMS 可运行的 CREATE USER 命令(2026.09);SHOW USERS WITH AUTH AS COMMANDS 额外包含认证提供方配置与凭据。
- SHOW USERS WITH AUTH AS COMMANDS 会暴露凭据,仅用于安全的备份/恢复处理;不需要认证材料时优先用 SHOW USERS AS COMMANDS;绝不把认证导出输出粘贴到明文文档、日志、工单或源码管理中。
- 删除用户:DROP USER alice IF EXISTS。
- 角色管理:CREATE ROLE analyst;CREATE ROLE analyst IF NOT EXISTS;DROP ROLE analyst IF EXISTS;GRANT ROLE analyst TO alice;GRANT ROLE analyst, writer TO alice, bob 批量授予;REVOKE ROLE analyst FROM alice。
- 查看角色:SHOW ROLES YIELD role, member ORDER BY role;SHOW ROLE analyst PRIVILEGES AS COMMANDS 返回可运行的 GRANT 命令;SHOW POPULATED ROLES YIELD role 仅列出有成员的角色;SHOW ROLES AS COMMANDS(2026.09);SHOW ROLES WITH USERS AS COMMANDS 追加 GRANT ROLE ... TO user;SHOW ROLES WITH AUTH RULES AS COMMANDS 追加 GRANT ROLE ... TO AUTH RULE。
- 按目标选择权限命令:允许连接库用 GRANT ACCESS ON DATABASE mydb TO analyst;读全部图数据用 GRANT MATCH {*} ON GRAPH mydb ELEMENTS * TO analyst;读特定标签用 GRANT MATCH {*} ON GRAPH mydb NODES Person TO analyst;读特定关系类型用 GRANT MATCH {*} ON GRAPH mydb RELATIONSHIPS KNOWS TO analyst;读单个属性用 GRANT READ {email} ON GRAPH mydb NODES Person TO analyst;可遍历但隐藏属性用 GRANT TRAVERSE ON GRAPH mydb NODES Person TO analyst;写用 GRANT WRITE ON GRAPH mydb TO writer;仅创建节点用 GRANT CREATE ON GRAPH mydb NODES Person TO writer;仅删除节点用 GRANT DELETE ON GRAPH mydb NODES Person TO writer;执行过程用 GRANT EXECUTE PROCEDURE apoc.* TO analyst;执行函数用 GRANT EXECUTE USER DEFINED FUNCTION apoc.* TO analyst;单库全部权限用 GRANT ALL ON DATABASE mydb TO dba;完整 DBMS 管理用 GRANT ALL ON DBMS TO dba;管理用户用 GRANT USER MANAGEMENT ON DBMS TO secadmin;管理用户标签(2026.06)用 GRANT USER METADATA MANAGEMENT ON DBMS TO secadmin;管理角色用 GRANT ROLE MANAGEMENT ON DBMS TO secadmin;模式变更用 GRANT CREATE ELEMENT TYPES ON DATABASE mydb TO schemaadmin。
- DENY 覆盖 GRANT:先 GRANT MATCH {*} ON GRAPH mydb NODES Person TO analyst,再 DENY READ {ssn} ON GRAPH mydb NODES Person TO analyst,使 analyst 可读 Person 但不可读 ssn。
- REVOKE 移除特定授予或拒绝:REVOKE GRANT READ {email} ON GRAPH mydb NODES Person FROM analyst;REVOKE DENY READ {ssn} ON GRAPH mydb NODES Person FROM analyst;REVOKE MATCH {*} ON GRAPH mydb NODES Person FROM analyst 同时移除 grant 与 deny。
- 常用角色模式——只读 analyst:CREATE ROLE analyst IF NOT EXISTS;GRANT ACCESS ON DATABASE mydb TO analyst;GRANT MATCH {*} ON GRAPH mydb ELEMENTS * TO analyst;GRANT EXECUTE PROCEDURE apoc.* TO analyst。
- 常用角色模式——写角色(无管理权):CREATE ROLE writer IF NOT EXISTS;GRANT ACCESS ON DATABASE mydb TO writer;GRANT MATCH {*} ON GRAPH mydb ELEMENTS * TO writer;GRANT WRITE ON GRAPH mydb TO writer。
- 常用角色模式——仅特定标签只读:CREATE ROLE limited_reader IF NOT EXISTS;GRANT ACCESS ON DATABASE mydb TO limited_reader;GRANT TRAVERSE ON GRAPH mydb ELEMENTS * TO limited_reader;GRANT MATCH {*} ON GRAPH mydb NODES Person TO limited_reader;GRANT MATCH {*} ON GRAPH mydb NODES Company TO limited_reader;其他标签可遍历但属性不可见。
- 常用角色模式——DBA 全权:CREATE ROLE dba IF NOT EXISTS;GRANT ALL ON DBMS TO dba;GRANT ALL ON DATABASE * TO dba。
- 属性级访问控制(Enterprise):先 GRANT MATCH {*} ON GRAPH mydb NODES Person TO analyst,再 DENY READ {ssn, dateOfBirth} ON GRAPH mydb NODES Person TO analyst。
- 基于属性的模式匹配(子图访问):GRANT MATCH {*} ON GRAPH mydb FOR (n:Person) WHERE n.classification = 'public' TO analyst;DENY MATCH {*} ON GRAPH mydb FOR (n) WHERE n.classification <> 'UNCLASSIFIED' TO regularUsers。
- 列表属性包含值(2026.08,Cypher 25):GRANT MATCH {*} ON GRAPH mydb FOR (n) WHERE 'gold' IN n.clearanceLevels TO goldTier;GRANT READ {*} ON GRAPH mydb FOR (n) WHERE 'EU' IN n.regions TO regularUsers;GRANT MATCH {*} ON GRAPH mydb FOR (n) WHERE NOT 'EU' IN n.regions TO regularUsers。
- 比较右侧为属性(2026.08,Cypher 25):GRANT MATCH {*} ON GRAPH mydb FOR (n) WHERE 1 > n.level TO analyst;GRANT READ {*} ON GRAPH mydb FOR (n) WHERE 3 < n.securityLevel TO regularUsers。
- PBAC 语义:value IN n.listProp 表示列表属性包含该值;属性缺失或为标量则不匹配;左侧值须非 null 且非 NaN;n.prop IN [v1, v2] 为标量与列表比较;Cypher 25 之前须把属性放在比较左侧。
- PBAC 约束:FOR 模式仅适用于读权限,不适用于写;每个基于属性的权限只受单个属性限制;2026.08 之前列表成员与属性在右侧的谓词会被拒绝,需改写为 n.prop <op> <literal> 或维护标量标志属性;性能开销随规则数量增长,TRAVERSE 规则比 READ 更昂贵;确保用于规则的属性不能被受限角色修改。
- ABAC 前置配置:在 neo4j.conf 中设置 dbms.security.abac.authorization_providers=<oidc-provider-alias>,native(native 为 2026.06+),提供方也必须出现在 dbms.security.authorization_providers 中;未列出的提供方其访问函数(abac.oidc.user_attribute()、abac.native.user_tags())不可用,引用它的规则会失败(无静默默认)。
- 创建 ABAC 规则:CREATE AUTH RULE salesRule SET CONDITION abac.oidc.user_attribute('department') = 'sales';GRANT ROLE analyst TO AUTH RULE salesRule。
- 复合条件规则:CREATE OR REPLACE AUTH RULE seniorRule SET CONDITION abac.oidc.user_attribute('department') = 'engineering' AND abac.oidc.user_attribute('level') >= 5;GRANT ROLE senior_engineer TO AUTH RULE seniorRule。
- 管理 ABAC 规则:SHOW AUTH RULES YIELD ruleName, condition, roles;ALTER AUTH RULE salesRule SET ENABLED false 禁用而不删除;RENAME AUTH RULE salesRule TO salesDeptRule;DROP AUTH RULE salesDeptRule;REVOKE ROLE analyst FROM AUTH RULE salesRule。
- 原生用户 ABAC(2026.06+):给原生 DB 用户打标签,并用 abac.native.user_tags() 在规则中匹配,无需 OIDC:CREATE AUTH RULE nativeSalesRule SET CONDITION 'sales' IN abac.native.user_tags();GRANT ROLE analyst TO AUTH RULE nativeSalesRule;要求多个标签:CREATE AUTH RULE financeAuditRule SET CONDITION all(tag IN ['finance', 'auditor'] WHERE tag IN abac.native.user_tags());结合标签、OIDC 声明与时间条件:CREATE AUTH RULE onCallRule SET CONDITION 'on-call' IN abac.native.user_tags() AND abac.oidc.user_attribute('department') = 'engineering' AND time.transaction('UTC').hour >= 9。
- ABAC 安全禁忌:绝不以标签缺失为条件,如 NOT ('restricted' IN abac.native.user_tags())——任何未打标签的用户都会满足并提权;应要求标签存在,如 'unrestricted' IN abac.native.user_tags()。
- ABAC 注意事项:缺失声明求值为 NULL,规则条件为假,角色不授予;声明已加载时规则立即对现有会话生效;OIDC 声明用 abac.oidc.user_attribute(),原生用户标签用 abac.native.user_tags()(2026.06+);LDAP 无访问函数,改为给 LDAP 用户的原生用户对象打标签;PBAC 属性规则谓词中拒绝用户自定义函数(2026.06+);Infinigraph(分片属性数据库)仅支持 PBAC READ,授予在虚拟数据库上(2026.07+,Aura 上不可用)。
- SHOW PRIVILEGES 用法:SHOW PRIVILEGES YIELD * 查看系统全部权限;SHOW USER alice PRIVILEGES AS COMMANDS 以可运行命令查看某用户权限;SHOW ROLE analyst PRIVILEGES YIELD privilege, action, resource, graph, segment 查看某角色权限;SHOW AUTH RULES salesRule PRIVILEGES AS COMMANDS 查看授予某认证规则角色的权限(2026.09);SHOW PRIVILEGES YIELD * WHERE graph = 'mydb' RETURN role, action, resource, segment ORDER BY role 查找谁可访问某库;SHOW PRIVILEGES YIELD * WHERE access = 'DENIED' RETURN role, action, resource, segment 查找所有 DENY 规则。
- 内置角色不可删除:admin(完整 DBMS 与所有库)、architect(模式变更与所有库写)、publisher(所有库写)、editor(写但不含模式变更)、reader(所有库只读)、public(所有用户隐式拥有,默认 home 库访问);用 GRANT ROLE reader TO alice 分配内置角色。
- 认证提供方配置(运维,非 Cypher)——原生:dbms.security.auth_enabled=true;dbms.security.auth_max_failed_attempts=3 为锁定阈值。
- LDAP 配置:dbms.security.auth_provider=ldap;dbms.security.ldap.host=ldap://ldap.example.com;dbms.security.ldap.authentication.mechanism=simple;dbms.security.ldap.authentication.user_dn_template=uid={0},ou=users,dc=example,dc=com;dbms.security.ldap.authorization.group_membership_attributes=memberOf;dbms.security.ldap.authorization.group_to_role_mapping 用 "cn=analysts,ou=groups,dc=example,dc=com" = analyst 等映射。
- OIDC/SSO 配置(Okta、Auth0、Entra ID):dbms.security.oidc.<alias>.display_name=Okta;auth_flow=pkce(implicit 自 2026.06 弃用并计划移除,保持 pkce);well_known_discovery_uri=https://example.okta.com/.well-known/openid-configuration;audience=neo4j;claims.username=email;claims.groups=groups;authorization.group_to_role_mapping 用 "neo4j-analysts" = analyst 等映射。
- 配置变更需要重启服务器;映射中引用的角色必须已在 Neo4j 中存在(原生或通过 Cypher 创建)。
- 新角色设置检查清单:确定所需操作(读/写/管理);确定目标数据库与图范围(全部标签还是特定标签);确定必须隐藏的属性(→ DENY READ);CREATE ROLE ... IF NOT EXISTS;GRANT ACCESS ON DATABASE;按需 GRANT MATCH/TRAVERSE/WRITE;对受限属性应用 DENY;运行 SHOW ROLE ... PRIVILEGES AS COMMANDS 验证;GRANT ROLE ... TO ... 分配给用户;用 SHOW USER ... PRIVILEGES AS COMMANDS 测试。
适用边界 · 注意事项
- 编写针对应用数据的 Cypher 查询时——应使用 neo4j-cypher-skill。
- 集群运维、备份、服务器配置时——应使用 neo4j-cli-tools-skill。
- 驱动连接设置时——应使用 neo4j-driver-*-skill。