Skip to content

Neo4j 网络隔离配置

基本网络配置

绑定地址配置

通过配置 Neo4j 监听的网络地址,可以限制数据库只接受来自特定网络接口的连接。

配置文件设置

neo4j.conf 中配置:

txt
# 绑定所有网络接口
dbms.default_listen_address=0.0.0.0

# 绑定特定网络接口
dbms.default_listen_address=192.168.1.100

# 分别配置不同协议的监听地址
dbms.connector.bolt.listen_address=192.168.1.100:7687
dbms.connector.http.listen_address=192.168.1.100:7474
dbms.connector.https.listen_address=192.168.1.100:7473

连接白名单

IP 白名单配置

通过防火墙或操作系统级别的配置,可以限制只允许特定 IP 地址访问 Neo4j 服务。

防火墙设置

Linux (iptables)
bash
# 允许本地连接
iptables -A INPUT -s 127.0.0.1 -j ACCEPT

# 允许特定 IP 连接到 Bolt 端口
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 7687 -j ACCEPT

# 允许特定 IP 连接到 HTTP/HTTPS 端口
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 7474 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 7473 -j ACCEPT

# 默认拒绝所有其他连接
iptables -P INPUT DROP
Windows (高级安全 Windows 防火墙)
  1. 打开 "高级安全 Windows 防火墙"
  2. 创建入站规则
  3. 选择 "端口" 规则类型
  4. 指定端口号(7687, 7474, 7473)
  5. 选择 "允许连接"
  6. 选择适用的网络类型
  7. 添加允许访问的 IP 地址范围
  8. 命名并保存规则

网络协议配置

协议启用/禁用

根据安全需求,可以启用或禁用特定的网络协议。

txt
# 启用 Bolt 协议(推荐用于应用程序连接)
dbms.connector.bolt.enabled=true

# 禁用 HTTP 协议(不安全,建议仅在开发环境使用)
dbms.connector.http.enabled=false

# 启用 HTTPS 协议(推荐用于浏览器访问)
dbms.connector.https.enabled=true

协议安全配置

Bolt 协议安全

txt
# 启用 Bolt 协议加密
dbms.connector.bolt.tls_level=REQUIRED

# 配置 Bolt 协议加密策略
dbms.ssl.policy.bolt.enabled=true
dbms.ssl.policy.bolt.base_directory=certificates/bolt
dbms.ssl.policy.bolt.private_key=private.key
dbms.ssl.policy.bolt.public_certificate=public.crt
dbms.ssl.policy.bolt.client_auth=REQUIRED

HTTPS 协议安全

txt
# 配置 HTTPS 证书
dbms.ssl.policy.https.enabled=true
dbms.ssl.policy.https.base_directory=certificates/https
dbms.ssl.policy.https.private_key=private.key
dbms.ssl.policy.https.public_certificate=public.crt

集群网络隔离

集群内部通信隔离

在 Neo4j 集群环境中,需要隔离集群内部通信和外部应用程序访问。

集群通信端口

端口用途隔离建议
7000集群内部通信仅允许集群节点间访问
7001集群内部加密通信仅允许集群节点间访问
6000集群 RAFT 通信仅允许集群节点间访问
5000集群发现仅允许集群节点间访问

集群网络配置

txt
# 配置集群绑定地址
dbms.default_advertised_address=192.168.1.100
causal_clustering.listen_address=192.168.1.100:7000
causal_clustering.raft.listen_address=192.168.1.100:6000
causal_clustering.discovery.listen_address=192.168.1.100:5000

# 配置集群加密通信
causal_clustering.ssl.policy=cluster
dbms.ssl.policy.cluster.enabled=true
dbms.ssl.policy.cluster.base_directory=certificates/cluster
dbms.ssl.policy.cluster.private_key=private.key
dbms.ssl.policy.cluster.public_certificate=public.crt
dbms.ssl.policy.cluster.client_auth=REQUIRED

网络分段

在大规模部署中,建议将 Neo4j 集群部署在独立的网络分段中,与应用程序网络分离。

网络分段架构

  1. 数据库网段:包含 Neo4j 集群节点,仅允许特定管理和应用服务器访问
  2. 应用网段:包含应用服务器,通过防火墙限制只能访问数据库的特定端口
  3. 管理网段:包含管理工具和监控系统,仅允许访问数据库的管理端口

Docker 网络隔离

Docker 网络模式

桥接网络

bash
# 创建自定义桥接网络
docker network create --driver bridge neo4j-network

# 运行 Neo4j 容器并连接到自定义网络
docker run --name neo4j --network neo4j-network -p 7687:7687 -p 7474:7474 -p 7473:7473 neo4j:latest

# 运行应用容器并连接到同一网络
docker run --name app --network neo4j-network app:latest

主机网络

bash
# 使用主机网络(不推荐,安全性较低)
docker run --name neo4j --network host neo4j:latest

无网络

bash
# 无网络模式(仅用于测试)
docker run --name neo4j --network none neo4j:latest

Docker Compose 网络配置

yaml
version: '3'
services:
  neo4j:
    image: neo4j:latest
    networks:
      - neo4j-network
    ports:
      - "7687:7687"
      - "7474:7474"
      - "7473:7473"
    volumes:
      - neo4j-data:/data
      - neo4j-logs:/logs
      - neo4j-import:/var/lib/neo4j/import
      - neo4j-plugins:/plugins
    environment:
      - NEO4J_AUTH=neo4j/password
      - NEO4JLABS_PLUGINS=["apoc"]

  app:
    image: app:latest
    networks:
      - neo4j-network
    depends_on:
      - neo4j

networks:
  neo4j-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16
          gateway: 172.20.0.1

volumes:
  neo4j-data:
  neo4j-logs:
  neo4j-import:
  neo4j-plugins:

Kubernetes 网络隔离

网络策略

使用 Kubernetes NetworkPolicy 限制 Pod 间通信。

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: neo4j-network-policy
  namespace: neo4j
spec:
  podSelector:
    matchLabels:
      app: neo4j
  policyTypes:
  - Ingress
  - Egress
  ingress:
  # 允许同一命名空间内带有 app=app 标签的 Pod 访问 Bolt 端口
  - from:
    - podSelector:
        matchLabels:
          app: app
    ports:
    - protocol: TCP
      port: 7687
  # 允许管理 IP 访问所有端口
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24
    ports:
    - protocol: TCP
      port: 7687
    - protocol: TCP
      port: 7474
    - protocol: TCP
      port: 7473
  # 允许集群内部通信
  - from:
    - podSelector:
        matchLabels:
          app: neo4j
    ports:
    - protocol: TCP
      port: 7000
    - protocol: TCP
      port: 7001
    - protocol: TCP
      port: 6000
    - protocol: TCP
      port: 5000
  egress:
  # 允许访问 DNS 服务
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53
  # 允许集群内部通信
  - to:
    - podSelector:
        matchLabels:
          app: neo4j
    ports:
    - protocol: TCP
      port: 7000
    - protocol: TCP
      port: 7001
    - protocol: TCP
      port: 6000
    - protocol: TCP
      port: 5000

服务配置

yaml
apiVersion: v1
kind: Service
metadata:
  name: neo4j-bolt namespace: neo4j
spec:
  selector:
    app: neo4j
  ports:
  - name: bolt
    port: 7687
    targetPort: 7687
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  name: neo4j-http namespace: neo4j
spec:
  selector:
    app: neo4j
  ports:
  - name: http
    port: 7474
    targetPort: 7474
  type: NodePort
  externalIPs:
  - 192.168.1.100

网络监控与审计

网络流量监控

使用 Prometheus + Grafana 监控

yaml
# Prometheus 配置
scrape_configs:
  - job_name: 'neo4j-network'
    static_configs:
      - targets: ['neo4j-exporter:9100']
    scrape_interval: 15s

关键网络指标

  • 连接数:neo4j.connections.active
  • 连接速率:neo4j.connections.created
  • 连接关闭速率:neo4j.connections.closed
  • 协议分布:neo4j.connections.protocol

网络审计

启用审计日志

txt
# 启用审计日志
dbms.security.audit.enabled=true
dbms.security.audit.logs.dir=/var/lib/neo4j/logs/audit
dbms.security.audit.logs.max_size=100M
dbms.security.audit.logs.rotation_policy=size
dbms.security.audit.events.default=AUTHENTICATION,LOGIN,LOGOUT,QUERY

审计日志内容

2023-01-01 12:00:00.000+0000 INFO  [o.n.s.a.AuditLog] [user: neo4j, client: 192.168.1.10, operation: LOGIN, result: SUCCESS]
2023-01-01 12:00:05.000+0000 INFO  [o.n.s.a.AuditLog] [user: neo4j, client: 192.168.1.10, operation: QUERY, query: MATCH (n) RETURN count(n);, result: SUCCESS]
2023-01-01 12:00:10.000+0000 INFO  [o.n.s.a.AuditLog] [user: neo4j, client: 192.168.1.10, operation: LOGOUT, result: SUCCESS]

最佳实践

  1. 最小权限原则

    • 只开放必要的端口和协议
    • 只允许必要的 IP 地址访问
    • 禁用不必要的服务和功能
  2. 分层防御

    • 结合网络隔离、防火墙、SSL/TLS 加密和身份验证
    • 实现深度防御策略
  3. 定期审查

    • 定期审查网络配置和访问控制列表
    • 定期检查防火墙规则
    • 定期审计网络流量和连接日志
  4. 使用加密通信

    • 对所有外部连接使用 SSL/TLS 加密
    • 对集群内部通信使用加密
    • 避免使用未加密的 HTTP 协议
  5. 监控网络活动

    • 监控异常连接和流量模式
    • 设置网络相关告警
    • 定期分析网络日志

常见问题(FAQ)

Q1: 如何限制只允许特定 IP 访问 Neo4j?

A1: 可以通过以下方式实现:

  • neo4j.conf 中配置绑定地址为特定 IP
  • 使用防火墙规则限制允许访问的 IP 范围
  • 在操作系统级别配置 IP 白名单

Q2: Bolt 协议和 HTTP 协议有什么区别?

A2: Bolt 协议是 Neo4j 专门设计的二进制协议,性能更高,安全性更好,推荐用于应用程序连接;HTTP 协议是基于文本的协议,性能较低,安全性较差,建议仅在开发环境使用。

Q3: 如何确保集群内部通信安全?

A3: 确保集群内部通信安全的方法:

  • 配置集群专用的网络分段
  • 使用 SSL/TLS 加密集群内部通信
  • 限制集群端口只允许集群节点访问
  • 配置强密码和身份验证

Q4: Docker 环境下如何实现网络隔离?

A4: Docker 环境下的网络隔离方法:

  • 使用自定义桥接网络
  • 配置容器间的网络访问规则
  • 限制容器暴露的端口
  • 使用 NetworkPolicy(在 Kubernetes 环境中)

Q5: 如何监控 Neo4j 的网络活动?

A5: 监控 Neo4j 网络活动的方法:

  • 启用审计日志
  • 使用 Prometheus + Grafana 监控网络指标
  • 配置网络流量监控工具
  • 定期分析连接日志和查询日志