Skip to content

Neo4j 认证机制

内置认证

1. 用户管理

Neo4j支持通过Cypher命令行工具管理用户,包括创建、修改、删除和列出用户等操作。

创建用户

bash
# 创建名为alice的用户,并设置密码
cypher-shell -u neo4j -p password -c "CREATE USER alice SET PASSWORD 'alice_password' CHANGE NOT REQUIRED"

修改用户密码

bash
# 修改alice用户的密码为new_password
cypher-shell -u neo4j -p password -c "ALTER USER alice SET PASSWORD 'new_password' CHANGE NOT REQUIRED"

列出所有用户

bash
# 列出数据库中所有用户
cypher-shell -u neo4j -p password -c "SHOW USERS"

删除用户

bash
# 删除名为alice的用户
cypher-shell -u neo4j -p password -c "DROP USER alice"

2. 密码策略

密码策略用于确保用户密码的强度和安全性,Neo4j支持通过配置文件设置多种密码策略参数。

配置文件位置

  • 文件路径$NEO4J_HOME/conf/neo4j.conf

密码策略配置

txt
# 设置密码最小长度为8个字符
dbms.security.auth_minimum_password_length=8

# 设置密码过期时间为90天
dbms.security.auth_password_policy.password_expire_days=90

# 保留最近5个密码历史记录,防止重复使用
dbms.security.auth_password_policy.password_history_size=5

# 禁止使用常见弱密码
dbms.security.auth_password_policy.allow_common_passwords=false
# 开启常见密码检查
dbms.security.auth_password_policy.check_common_passwords=true

3. 账户锁定

账户锁定机制可以防止暴力破解攻击,当用户连续多次登录失败后,系统会自动锁定该账户一段时间。

配置账户锁定

txt
# 设置最大登录失败次数为5次,超过则锁定账户
dbms.security.auth_max_failed_authentication_attempts=5

# 设置账户锁定时间为30分钟
dbms.security.auth_lock_time=30

解锁用户

bash
# 手动解锁被锁定的alice用户
cypher-shell -u neo4j -p password -c "ALTER USER alice SET STATUS ACTIVE"

LDAP/Active Directory集成

LDAP(轻量级目录访问协议)和Active Directory(AD)集成允许Neo4j使用企业现有的目录服务进行用户认证和授权,简化用户管理并提高安全性。

1. 配置LDAP认证

配置文件位置

  • 文件路径$NEO4J_HOME/conf/neo4j.conf

LDAP配置示例

txt
# 启用LDAP认证,将认证提供程序设置为ldap
dbms.security.authentication_providers=ldap

# LDAP服务器配置,指定LDAP服务器地址和端口
dbms.security.ldap.host=ldap://ldap.example.com:389
# 启用STARTTLS加密连接
dbms.security.ldap.authentication.use_starttls=true
# 用户DN模板,用于构建用户的完整DN
dbms.security.ldap.authentication.user_dn_template=cn={0},ou=users,dc=example,dc=com

# 授权配置:用户搜索基础路径
dbms.security.ldap.authorization.user_search_base=ou=users,dc=example,dc=com
# 授权配置:用户搜索过滤器
dbms.security.ldap.authorization.user_search_filter=(sAMAccountName={0})
# 授权配置:组搜索基础路径
dbms.security.ldap.authorization.group_search_base=ou=groups,dc=example,dc=com
# 授权配置:组到角色的映射,将LDAP组映射到Neo4j角色
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;
  "cn=neo4j-writers,ou=groups,dc=example,dc=com" : editor

2. Active Directory集成

Active Directory(AD)是微软的目录服务,Neo4j可以通过LDAP协议与其集成,实现用户认证和授权。

AD配置示例

txt
# 启用LDAP认证(AD通过LDAP协议提供服务)
dbms.security.authentication_providers=ldap

# AD服务器配置,指定AD服务器地址和端口
dbms.security.ldap.host=ldap://ad.example.com:389
# 启用STARTTLS加密连接
dbms.security.ldap.authentication.use_starttls=true
# AD用户DN模板,用于构建用户的完整DN
dbms.security.ldap.authentication.user_dn_template=cn={0},cn=users,dc=example,dc=com

# AD用户搜索配置:用户搜索基础路径
dbms.security.ldap.authorization.user_search_base=cn=users,dc=example,dc=com
# AD用户搜索配置:使用sAMAccountName作为搜索过滤器
dbms.security.ldap.authorization.user_search_filter=(sAMAccountName={0})
# AD组搜索配置:组搜索基础路径
dbms.security.ldap.authorization.group_search_base=cn=users,dc=example,dc=com
# AD组搜索配置:组搜索过滤器,查找包含该用户的组
dbms.security.ldap.authorization.group_search_filter=(&(objectClass=group)(member={0}))
# AD组到角色的映射,将AD组映射到Neo4j角色
dbms.security.ldap.authorization.group_to_role_mapping=
  "cn=Neo4j Admins,cn=users,dc=example,dc=com" : admin;
  "cn=Neo4j Readers,cn=users,dc=example,dc=com" : reader

3. 测试LDAP连接

配置完成后,可以使用Neo4j提供的命令测试LDAP连接是否正常:

bash
# 测试LDAP连接,指定LDAP服务器主机名、端口和是否使用STARTTLS
neo4j-admin dbms ldap test-connection --hostname ldap.example.com --port 389 --use-starttls

自定义认证插件

对于特殊的认证需求,Neo4j支持通过插件机制实现自定义认证逻辑。自定义认证插件允许集成企业内部的认证系统或实现特定的认证规则。

1. 插件开发

实现AuthenticationPlugin接口

自定义认证插件需要实现Neo4j的AuthenticationPlugin接口,以下是一个简单的Java示例:

java
import org.neo4j.server.security.enterprise.auth.plugin.api.*;

public class CustomAuthenticationPlugin implements AuthenticationPlugin {
    @Override
    public AuthenticationInfo authenticate(AuthToken authToken) {
        // 从认证令牌中获取用户名和密码
        String username = authToken.principal();
        String password = authToken.credentials();
        
        // 实现自定义认证逻辑,例如调用外部认证服务
        if (isValidUser(username, password)) {
            // 认证成功,返回认证信息
            return AuthenticationInfo.of(username);
        }
        
        // 认证失败,抛出异常
        throw new InvalidAuthTokenException("Invalid credentials");
    }
    
    private boolean isValidUser(String username, String password) {
        // 实现自定义验证逻辑,例如检查外部LDAP或数据库
        return true;
    }
}

2. 插件部署

开发完成后,需要将插件部署到Neo4j中:

  1. 将编译好的JAR文件复制到$NEO4J_HOME/plugins目录
  2. 更新Neo4j配置文件,启用自定义插件:
    txt
    # 设置认证提供程序为自定义插件
    dbms.security.authentication_providers=plugin-custom
    # 设置授权提供程序为自定义插件
    dbms.security.authorization_providers=plugin-custom
  3. 重启Neo4j服务,使插件生效

双因素认证

双因素认证(2FA)通过结合两种不同的认证方式,增强了数据库的安全性。Neo4j支持使用基于时间的一次性密码(TOTP)作为第二因素认证。

1. 配置TOTP认证

安装TOTP插件

TOTP认证需要安装Neo4j TOTP插件,步骤如下:

bash
# 下载TOTP插件到本地
wget https://github.com/neo4j-contrib/neo4j-totp-auth-plugin/releases/download/1.0.0/neo4j-totp-auth-plugin-1.0.0.jar

# 将插件JAR文件复制到Neo4j的plugins目录
cp neo4j-totp-auth-plugin-1.0.0.jar $NEO4J_HOME/plugins/

配置TOTP认证

安装插件后,需要在Neo4j配置文件中启用TOTP认证:

txt
# 启用TOTP认证,将认证提供程序设置为totp
dbms.security.authentication_providers=totp

# 设置TOTP发行者名称,将显示在用户的认证应用中
dbms.security.totp.issuer=Neo4j

为用户启用TOTP

配置完成后,需要为每个用户启用TOTP认证:

bash
# 为用户alice启用TOTP认证
cypher-shell -u neo4j -p password -c "CALL dbms.security.totp.enable('alice')"

启用后,用户将获得一个二维码,可以使用Google Authenticator、Microsoft Authenticator等TOTP应用扫描,生成一次性验证码。

认证协议

Neo4j支持多种认证协议,确保不同客户端连接的安全性。

1. Bolt协议认证

Bolt是Neo4j的二进制协议,支持多种认证方案:

  • basic:基本用户名/密码认证,是默认的认证方案
  • kerberos:Kerberos认证,适合企业级环境集成
  • custom:自定义认证方案,通过插件实现

Bolt协议使用TLS加密,确保认证过程和数据传输的安全性。

2. HTTPS认证

Neo4j的HTTP API通过HTTPS提供安全访问,支持以下认证方式:

  • 基本认证(用户名/密码)
  • OAuth 2.0(通过插件实现)
  • JWT认证(通过插件实现)

HTTPS认证确保了Web界面和REST API访问的安全性。

密码加密

Neo4j使用安全的哈希算法存储用户密码,防止密码泄露时被直接读取。

1. 密码存储机制

  • 默认算法:bcrypt(推荐使用,安全性高)
  • 支持的算法
    • bcrypt:基于Blowfish密码算法,具有自适应成本因子
    • pbkdf2-sha256:基于HMAC-SHA256的密码派生函数
    • pbkdf2-sha512:基于HMAC-SHA512的密码派生函数
    • sha256:SHA-256哈希算法
    • sha512:SHA-512哈希算法

2. 配置密码哈希算法

可以在Neo4j配置文件中指定密码哈希算法及其参数:

txt
# 设置密码哈希算法为bcrypt
dbms.security.password_hash.algorithm=bcrypt
# 设置bcrypt成本因子为10,值越大安全性越高,但计算时间越长
dbms.security.password_hash.bcrypt.cost=10

# 或者使用PBKDF2算法
# dbms.security.password_hash.algorithm=pbkdf2-sha256
# dbms.security.password_hash.pbkdf2.iterations=10000

选择合适的密码哈希算法和参数,平衡安全性和性能需求。

常见问题(FAQ)

Q1: 如何重置neo4j默认用户密码?

A1: 重置neo4j默认用户密码的方法:

  1. 停止Neo4j服务
  2. 修改配置文件,禁用认证:
    txt
    dbms.security.auth_enabled=false
  3. 启动Neo4j服务
  4. 重置密码:
    bash
    cypher-shell -c "ALTER USER neo4j SET PASSWORD 'new_password' CHANGE NOT REQUIRED"
  5. 停止服务,重新启用认证
  6. 启动服务

Q2: 如何配置密码策略?

A2: 配置密码策略的步骤:

  1. 编辑neo4j.conf文件
  2. 添加或修改密码策略配置参数
  3. 重启Neo4j服务
  4. 验证密码策略是否生效

Q3: LDAP认证失败如何排查?

A3: 排查LDAP认证失败的步骤:

  1. 检查LDAP服务器连接:
    bash
    neo4j-admin dbms ldap test-connection --hostname ldap.example.com --port 389
  2. 检查LDAP配置参数
  3. 查看Neo4j日志:
    tail -f $NEO4J_HOME/logs/debug.log | grep -i ldap
  4. 使用ldapsearch命令测试LDAP查询:
    bash
    ldapsearch -x -h ldap.example.com -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" "(cn=alice)"

Q4: 如何实现单点登录(SSO)?

A4: 实现SSO的方法:

  1. 使用LDAP/Active Directory集成
  2. 部署OAuth 2.0或OpenID Connect插件
  3. 配置反向代理(如Nginx)处理SSO认证
  4. 使用Kerberos认证

Q5: 如何监控认证活动?

A5: 监控认证活动的方法:

  1. 启用安全日志:
    txt
    dbms.logs.security.enabled=true
    dbms.logs.security.level=INFO
  2. 查看安全日志:
    bash
    tail -f $NEO4J_HOME/logs/security.log
  3. 使用监控工具(如Prometheus/Grafana)监控认证指标
  4. 配置告警,监控失败登录尝试

Q6: 如何配置多因素认证?

A6: 配置多因素认证的步骤:

  1. 安装并配置TOTP插件
  2. 启用TOTP认证
  3. 为用户启用TOTP
  4. 配置客户端支持TOTP
  5. 测试多因素认证流程

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

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

  1. 创建用户
  2. 将用户分配到适当的角色
  3. 配置角色权限
  4. 定期审查用户角色和权限

Q8: 如何迁移认证配置?

A8: 迁移认证配置的步骤:

  1. 备份当前认证配置
  2. 导出用户数据:
    bash
    neo4j-admin dbms export-users --to=users.json
  3. 在新环境中导入用户数据:
    bash
    neo4j-admin dbms import-users --from=users.json
  4. 配置认证机制
  5. 测试认证功能

Q9: 如何处理密码泄露事件?

A9: 处理密码泄露事件的步骤:

  1. 立即重置所有可能受影响的用户密码
  2. 启用账户锁定机制
  3. 审查认证日志,识别可疑活动
  4. 增强密码策略
  5. 考虑启用双因素认证
  6. 通知相关 stakeholders

Q10: 如何配置只读用户?

A10: 配置只读用户的步骤:

  1. 创建用户:
    bash
    cypher-shell -u neo4j -p password -c "CREATE USER reader SET PASSWORD 'reader_password' CHANGE NOT REQUIRED"
  2. 分配reader角色:
    bash
    cypher-shell -u neo4j -p password -c "GRANT ROLE reader TO reader"
  3. 验证权限:
    bash
    cypher-shell -u reader -p reader_password -c "MATCH (n) RETURN n LIMIT 1"
    cypher-shell -u reader -p reader_password -c "CREATE (n:Test) RETURN n" # 应该失败

最佳实践

  1. 使用强密码策略:配置最小密码长度、复杂度要求和密码过期时间
  2. 启用账户锁定:限制登录失败次数,防止暴力破解
  3. 使用企业认证:对于企业环境,集成LDAP/Active Directory
  4. 定期审查用户:定期审查用户列表,删除不必要的用户
  5. 使用角色管理:通过角色管理权限,避免直接授予用户权限
  6. 启用双因素认证:对于敏感环境,启用双因素认证
  7. 监控认证活动:记录和监控认证事件,及时发现异常活动
  8. 定期备份认证配置:定期备份用户数据和认证配置
  9. 使用加密连接:确保认证过程通过加密连接进行
  10. 遵循最小权限原则:只授予用户完成工作所需的最小权限

通过合理配置Neo4j的认证机制,可以确保只有授权用户才能访问数据库,保护数据库的安全。