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 监控网络指标
  • 配置网络流量监控工具
  • 定期分析连接日志和查询日志