外观
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 DROPWindows (高级安全 Windows 防火墙)
- 打开 "高级安全 Windows 防火墙"
- 创建入站规则
- 选择 "端口" 规则类型
- 指定端口号(7687, 7474, 7473)
- 选择 "允许连接"
- 选择适用的网络类型
- 添加允许访问的 IP 地址范围
- 命名并保存规则
网络协议配置
协议启用/禁用
根据安全需求,可以启用或禁用特定的网络协议。
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=REQUIREDHTTPS 协议安全
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 集群部署在独立的网络分段中,与应用程序网络分离。
网络分段架构
- 数据库网段:包含 Neo4j 集群节点,仅允许特定管理和应用服务器访问
- 应用网段:包含应用服务器,通过防火墙限制只能访问数据库的特定端口
- 管理网段:包含管理工具和监控系统,仅允许访问数据库的管理端口
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:latestDocker 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]最佳实践
最小权限原则:
- 只开放必要的端口和协议
- 只允许必要的 IP 地址访问
- 禁用不必要的服务和功能
分层防御:
- 结合网络隔离、防火墙、SSL/TLS 加密和身份验证
- 实现深度防御策略
定期审查:
- 定期审查网络配置和访问控制列表
- 定期检查防火墙规则
- 定期审计网络流量和连接日志
使用加密通信:
- 对所有外部连接使用 SSL/TLS 加密
- 对集群内部通信使用加密
- 避免使用未加密的 HTTP 协议
监控网络活动:
- 监控异常连接和流量模式
- 设置网络相关告警
- 定期分析网络日志
常见问题(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 监控网络指标
- 配置网络流量监控工具
- 定期分析连接日志和查询日志
