ZooKeeper IP白名单与ACL最佳实践
IP限制、ACL设计和审计日志。
IP白名单控制
防火墙方式:
Bash
# iptables规则
iptables -A INPUT -p tcp --dport 2181 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 2181 -j DROP
# 只允许192.168.1.*网段访问
IP认证方案:
Java
// 创建节点时设置IP ACL
List<ACL> acls = new ArrayList<>();
acls.add(new ACL(Perms.ALL, new Id("ip", "192.168.1.0/24")));
zk.create("/internal", data, acls, CreateMode.PERSISTENT);
四字命令白名单:
properties
# zoo.cfg
4lw.commands.whitelist=stat,ruok,mntr,srvr
# 只允许这些四字命令
限制方式对比:
| 方式 | 限制范围 | 说明 |
|---|---|---|
| 防火墙 | 网络层 | 整体访问控制 |
| IP ACL | 应用层 | 单节点访问控制 |
| 四字命令 | 功能层 | 命令访问控制 |
多层防护建议:
Java
防火墙 + IP ACL + 四字命令白名单
三层防护最安全
注意:防火墙+应用层双重限制最安全。
ACL最佳实践
企业级ACL设计:
Java
/admin <- 系统管理员(super权限)
/services <- 服务注册目录(开放读取)
/config <- 配置目录(管理员写、应用读)
/locks <- 分布式锁(应用临时权限)
权限分层:
| 角色 | 权限 | 节点范围 |
|---|---|---|
| admin | cdrwa | /admin, /config |
| service_provider | crwa | /services/{service} |
| service_consumer | r | /services |
| app | rw | /config/{app} |
ACL配置示例:
properties
// 系统管理员节点
List<ACL> adminACL = new ArrayList<>();
adminACL.add(new ACL(Perms.ALL, new Id("digest", "admin:password")));
zk.create("/admin", null, adminACL, CreateMode.PERSISTENT);
// 服务注册节点
List<ACL> serviceACL = new ArrayList<>();
serviceACL.add(new ACL(Perms.ALL, new Id("digest", "provider:pwd")));
serviceACL.add(new ACL(Perms.READ, ZooDefs.Ids.ANYONE_ID_OPEN));
zk.create("/services/order", null, serviceACL, CreateMode.PERSISTENT);
// 配置节点
List<ACL> configACL = new ArrayList<>();
configACL.add(new ACL(Perms.ALL, new Id("digest", "admin:pwd")));
configACL.add(new ACL(Perms.READ | Perms.WRITE, new Id("digest", "app:pwd")));
zk.create("/config/app", data, configACL, CreateMode.PERSISTENT);
ACL最佳实践:
| 实践 | 说明 |
|---|---|
| 敏感节点digest | 配置、管理节点需认证 |
| 公开节点限制r | 服务列表只允许读取 |
| 分层权限 | 不同角色不同权限范围 |
| 记录修改者 | 数据中包含修改者信息 |
审计追踪:
Bash
// 数据中记录修改信息
{
"value": "config_value",
"modified_by": "user1",
"modified_at": "2026-05-24T10:00:00Z",
"version": 3
}
提示:敏感节点必须设置ACL,避免world权限开放。
安全审计日志
审计日志配置:
text
# zoo.cfg(3.6+版本)
audit.enable=true
audit.log.file=audit.log
audit.log.level=INFO
审计内容:
| 操作 | 记录项 |
|---|---|
| create | 节点路径、数据、ACL、用户 |
| setData | 节点路径、新旧数据、用户 |
| delete | 节点路径、用户 |
| getChildren | 节点路径、用户 |
| setAcl | 节点路径、ACL、用户 |
日志格式示例:
text
2026-05-24 10:00:00 INFO create(path=/config/db, data={"host":"..."}, acl=[...], user=admin, ip=192.168.1.100)
2026-05-24 10:01:00 INFO setData(path=/config/db, old={"host":"old"}, new={"host":"new"}, user=app1)
异常访问监控:
text
# 检测未授权访问
grep "Authentication failed" audit.log
# 检测敏感节点访问
grep "/admin" audit.log
grep "/config" audit.log
# 检测异常操作
grep "delete" audit.log | grep "/config"
日志管理:
| 管理 | 说明 |
|---|---|
| 定期归档 | 每周/每月归档 |
| 异地备份 | 备份到远程存储 |
| 保留期限 | 根据合规要求设置 |
注意:审计日志需定期分析,及时发现异常访问。
要点总结
- 防火墙+IP ACL双重限制最安全
- 企业级ACL按角色分层设计
- 敏感节点设置digest ACL
- 公开节点只允许读取权限
- 数据中记录修改者便于追踪
- audit.enable开启审计日志
- 定期分析日志发现异常访问
📝 发现内容有误?点击此处直接编辑