Skip to content

Neo4j 认证与授权配置

认证配置

启用认证

  • 配置参数dbms.security.auth_enabled
  • 作用:启用或禁用用户认证
  • 推荐值true(生产环境必须启用)

示例配置

txt
dbms.security.auth_enabled=true

认证缓存配置

  • 缓存大小dbms.security.auth_cache_size
  • 缓存过期时间dbms.security.auth_cache_ttl
  • 作用:缓存用户认证信息,提高认证性能

示例配置

txt
dbms.security.auth_cache_size=1000
dbms.security.auth_cache_ttl=60000  # 60秒

密码策略配置

密码复杂度要求

  • 配置参数dbms.security.password_policy
  • 可选值default(默认策略)、none(无策略)
  • 默认策略规则
    • 密码长度至少 8 个字符
    • 包含至少一个大写字母
    • 包含至少一个小写字母
    • 包含至少一个数字
    • 包含至少一个特殊字符

示例配置

txt
dbms.security.password_policy=default

自定义密码策略

可以通过插件实现自定义密码策略,例如使用 APOC 插件:

txt
# 启用 APOC 密码策略
dbms.security.password_policy=apoc

认证机制配置

内置认证机制

Neo4j 支持以下内置认证机制:

  • native:本地密码认证(默认)
  • ldap:LDAP 认证(企业版)
  • kerberos:Kerberos 认证(企业版)
  • pam:PAM 认证(企业版)

示例配置

txt
# 使用本地密码认证
dbms.security.auth_providers=native

授权配置

启用授权

  • 配置参数dbms.security.authorization_enabled
  • 作用:启用或禁用权限控制
  • 推荐值true(生产环境必须启用)

示例配置

txt
dbms.security.authorization_enabled=true

角色管理

预定义角色

Neo4j 提供以下预定义角色:

  • reader:只读权限
  • editor:读写权限,但不能管理用户和数据库
  • publisher:读写权限 + 发布权限
  • architect:读写权限 + 架构管理权限
  • admin:完全权限

自定义角色(企业版)

可以创建自定义角色,根据业务需求分配特定权限。

用户管理

创建用户

使用 Cypher Shell 创建用户

cypher
# 创建用户并设置密码
CREATE USER neo4j SET PASSWORD 'password' CHANGE NOT REQUIRED;

# 创建用户并要求首次登录修改密码
CREATE USER alice SET PASSWORD 'temp_password' CHANGE REQUIRED;

使用 Neo4j Browser 创建用户

  1. 登录 Neo4j Browser
  2. 导航到 "数据库信息" → "用户管理"
  3. 点击 "创建用户"
  4. 填写用户名和密码,设置密码策略
  5. 点击 "创建"

修改用户密码

用户自行修改密码

cypher
# 修改当前用户密码
ALTER CURRENT USER SET PASSWORD 'new_password';

管理员修改用户密码

cypher
# 修改指定用户密码
ALTER USER alice SET PASSWORD 'new_password';

禁用/启用用户

cypher
# 禁用用户
ALTER USER alice SET STATUS 'disabled';

# 启用用户
ALTER USER alice SET STATUS 'enabled';

删除用户

cypher
# 删除用户
DROP USER alice;

查看用户信息

cypher
# 查看所有用户
SHOW USERS;

# 查看指定用户
SHOW USER alice;

权限管理

授予角色

授予预定义角色

cypher
# 授予 reader 角色给用户
grant role reader to alice;

# 授予多个角色给用户
grant roles reader, editor to alice;

创建和授予自定义角色(企业版)

cypher
# 创建自定义角色
CREATE ROLE my_custom_role;

# 授予权限给自定义角色
grant create index on database * to my_custom_role;
grant match {*} on graph * to my_custom_role;

# 授予自定义角色给用户
grant role my_custom_role to alice;

撤销角色

cypher
# 撤销单个角色
revoke role reader from alice;

# 撤销多个角色
revoke roles reader, editor from alice;

细粒度权限控制(企业版)

Neo4j 企业版支持细粒度权限控制,可以对数据库、图、节点、关系等授予特定权限。

数据库级权限

cypher
# 授予数据库管理权限
grant all on database * to admin;

# 授予数据库创建权限
grant create database on system to admin;

# 授予数据库访问权限
grant access on database neo4j to reader;

图级权限

cypher
# 授予图读取权限
grant match {*} on graph * to reader;

# 授予图写入权限
grant create, merge, delete on graph * to editor;

节点和关系权限

cypher
# 授予节点读取权限
grant match (n:Person) on graph * to reader;

# 授予关系写入权限
grant create, delete ()-[r:KNOWS]->() on graph * to editor;

属性权限

cypher
# 授予属性读取权限
grant match (n:Person {name, age}) on graph * to reader;

# 授予属性写入权限
grant set (n:Person {name}) on graph * to editor;

查看权限

cypher
# 查看所有角色的权限
SHOW ROLES;

# 查看指定角色的权限
SHOW ROLE reader;

# 查看用户的权限
SHOW USER alice;

LDAP 集成(企业版)

启用 LDAP 认证

txt
# 启用 LDAP 认证
dbms.security.auth_providers=ldap,native

# LDAP 服务器配置
dbms.security.ldap.host=ldap://ldap.example.com
dbms.security.ldap.port=389
dbms.security.ldap.authentication.user_dn_template=cn={0},ou=users,dc=example,dc=com
dbms.security.ldap.authentication.password=secret

LDAP 授权配置

txt
# LDAP 授权配置
dbms.security.ldap.authorization.enabled=true
dbms.security.ldap.authorization.group_to_role_mapping=cn=neo4j-admins,ou=groups,dc=example,dc=com=admin;cn=neo4j-readers,ou=groups,dc=example,dc=com=reader
dbms.security.ldap.authorization.user_search_base=ou=users,dc=example,dc=com
dbms.security.ldap.authorization.group_search_base=ou=groups,dc=example,dc=com
dbms.security.ldap.authorization.group_search_filter=(member={0})

Kerberos 集成(企业版)

启用 Kerberos 认证

txt
# 启用 Kerberos 认证
dbms.security.auth_providers=kerberos,native

# Kerberos 配置
dbms.security.kerberos.realm=EXAMPLE.COM
dbms.security.kerberos.kdc.host=kdc.example.com
dbms.security.kerberos.kdc.port=88
dbms.security.kerberos.service.principal=neo4j/neo4j.example.com@EXAMPLE.COM
dbms.security.kerberos.service.keytab=/path/to/neo4j.keytab

Kerberos 授权配置

txt
# Kerberos 授权配置
dbms.security.kerberos.authorization.enabled=true
dbms.security.kerberos.authorization.user_to_role_mapping=user1@EXAMPLE.COM=admin;user2@EXAMPLE.COM=reader

安全最佳实践

1. 最小权限原则

  • 只授予用户完成工作所需的最小权限
  • 避免过度授权
  • 定期审查用户权限

2. 强密码策略

  • 启用密码复杂度要求
  • 定期强制用户修改密码
  • 禁止使用弱密码
  • 使用密码管理器生成和管理密码

3. 定期审查用户和权限

  • 每季度审查一次用户列表
  • 移除不再需要的用户
  • 审查权限分配,确保符合最小权限原则
  • 记录权限变更历史

4. 启用审计日志

  • 启用审计日志,记录用户活动
  • 定期审查审计日志
  • 配置审计日志保留策略

5. 安全的认证机制

  • 使用强认证机制(如 Kerberos、LDAP)
  • 禁用明文密码传输
  • 启用 TLS/SSL 加密

6. 访问控制

  • 限制数据库访问的 IP 地址
  • 使用防火墙保护数据库端口
  • 启用网络隔离

7. 定期备份认证数据

  • 定期备份认证数据
  • 测试认证数据恢复流程
  • 确保备份数据的安全性

常见认证与授权问题

1. 忘记管理员密码

解决方法

  1. 停止 Neo4j 服务
  2. 编辑 neo4j.conf 文件,临时禁用认证:
    txt
    dbms.security.auth_enabled=false
  3. 启动 Neo4j 服务
  4. 登录 Neo4j Browser 或 Cypher Shell
  5. 修改管理员密码:
    cypher
    ALTER USER neo4j SET PASSWORD 'new_password';
  6. 停止 Neo4j 服务
  7. 恢复认证配置:
    txt
    dbms.security.auth_enabled=true
  8. 重新启动 Neo4j 服务

2. 用户无法登录

可能原因

  • 用户名或密码错误
  • 用户被禁用
  • 密码已过期
  • 认证机制配置错误
  • 网络连接问题

解决方法

  1. 验证用户名和密码
  2. 检查用户状态:
    cypher
    SHOW USER alice;
  3. 重置用户密码:
    cypher
    ALTER USER alice SET PASSWORD 'new_password';
  4. 启用用户:
    cypher
    ALTER USER alice SET STATUS 'enabled';
  5. 检查认证配置
  6. 检查网络连接

3. 用户权限不足

解决方法

  1. 检查用户的角色和权限:
    cypher
    SHOW USER alice;
  2. 授予适当的角色或权限:
    cypher
    grant role editor to alice;
  3. 检查细粒度权限配置(如果使用)

4. LDAP 认证失败

可能原因

  • LDAP 服务器配置错误
  • LDAP 用户密码错误
  • LDAP 搜索过滤器配置错误
  • LDAP 连接问题

解决方法

  1. 检查 LDAP 服务器配置
  2. 验证 LDAP 用户密码
  3. 检查 LDAP 搜索过滤器
  4. 测试 LDAP 连接
  5. 查看 Neo4j 日志获取详细错误信息

版本差异

Neo4j 4.x 与 5.x 认证与授权差异

  • 配置参数变化:部分参数前缀从 dbms 改为 server
  • 权限模型增强:5.x 增强了细粒度权限控制
  • 角色管理改进:5.x 提供了更灵活的角色管理
  • 审计日志增强:5.x 增强了审计日志功能

社区版与企业版差异

  • 社区版

    • 支持本地密码认证
    • 支持预定义角色
    • 基本的权限控制
  • 企业版

    • 支持多种认证机制(LDAP、Kerberos、PAM)
    • 支持自定义角色
    • 支持细粒度权限控制
    • 支持审计日志
    • 支持集成外部身份提供商

常见问题(FAQ)

Q1: 如何重置 Neo4j 管理员密码?

A1: 重置管理员密码的步骤:

  1. 停止 Neo4j 服务
  2. 临时禁用认证
  3. 启动服务并修改密码
  4. 恢复认证配置
  5. 重新启动服务

Q2: Neo4j 支持哪些认证机制?

A2: Neo4j 支持以下认证机制:

  • 本地密码认证(社区版和企业版)
  • LDAP 认证(企业版)
  • Kerberos 认证(企业版)
  • PAM 认证(企业版)

Q3: 如何创建自定义角色?

A3: 创建自定义角色的步骤(企业版):

  1. 创建角色:CREATE ROLE my_custom_role;
  2. 授予权限:grant match {*} on graph * to my_custom_role;
  3. 授予角色给用户:grant role my_custom_role to alice;

Q4: 如何实现细粒度权限控制?

A4: 细粒度权限控制(企业版)可以通过以下方式实现:

  • 数据库级权限:控制数据库的访问和管理
  • 图级权限:控制图的读取和写入
  • 节点和关系权限:控制特定标签和关系类型的访问
  • 属性权限:控制特定属性的访问和修改

Q5: 如何启用审计日志?

A5: 启用审计日志的配置(企业版):

txt
# 启用审计日志
dbms.audit.log.enabled=true
# 审计日志路径
dbms.audit.log.path=/var/log/neo4j/audit.log
# 审计日志级别
dbms.audit.log.level=info

Q6: 如何集成 LDAP 认证?

A6: 集成 LDAP 认证的步骤(企业版):

  1. 配置 LDAP 服务器连接
  2. 配置 LDAP 用户搜索
  3. 配置 LDAP 授权映射
  4. 启用 LDAP 认证

Q7: 如何限制用户只能访问特定数据库?

A7: 限制用户访问特定数据库的步骤(企业版):

  1. 授予数据库访问权限:grant access on database mydb to alice;
  2. 撤销其他数据库的访问权限:revoke access on database * from alice;

Q8: 如何实现基于角色的访问控制?

A8: 基于角色的访问控制实现步骤:

  1. 创建用户
  2. 授予适当的角色
  3. 角色继承预定义或自定义权限
  4. 定期审查角色和权限

Q9: 如何监控认证和授权事件?

A9: 监控认证和授权事件的方法:

  • 查看 Neo4j 日志中的认证和授权事件
  • 启用审计日志(企业版)
  • 集成监控工具(如 Prometheus、Grafana)
  • 定期审查用户活动

Q10: 如何确保认证数据的安全性?

A10: 确保认证数据安全性的方法:

  • 使用强密码策略
  • 定期备份认证数据
  • 加密存储敏感认证信息
  • 限制认证数据的访问权限
  • 定期审查认证配置
  • 使用安全的认证机制