ReplicaSet成员级访问控制:如何限制用户仅从Secondary节点读取数据
强制MongoDB副本集用户仅从Secondary节点读取数据的可行方案
以下方案均为服务端可控,不依赖客户端主动配置readPreference:
1. 网络端口隔离
- 仅将所有Secondary节点的27017服务端口对业务用户网段开放,Primary节点的服务端口仅允许DBA管理网段访问,不对外开放
- 给业务侧提供的副本集连接地址仅填写Secondary节点的IP/域名,不包含Primary节点信息,此时即使客户端强制指定readPreference为primary也无法建立连接,只能路由到Secondary节点执行读请求
- 如果发生主从切换,可通过自动检测脚本实时更新访问控制规则,屏蔽新主节点的业务访问权限,开放新从节点的访问权限
2. 代理层流量转发拦截
- 部署HAProxy、Envoy或者MongoDB专用代理层作为业务访问的统一入口
- 在代理层配置路由规则:所有读请求全部转发到Secondary节点,仅将DBA管理账号的写请求、主节点操作请求转发到Primary节点,完全屏蔽业务用户对Primary节点的读访问权限
3. 数据库权限与访问规则控制
- 对于MongoDB 5.0及以上版本,可在Primary节点配置全局读请求校验触发器:对所有读请求的发起用户进行校验,若为业务普通用户则直接返回权限拒绝错误
- 启用MongoDB审计日志功能,配置告警规则:一旦检测到业务用户在Primary节点执行读操作,立即触发告警并自动断开对应连接
各方案适用场景
- 网络端口隔离:实现成本最低,适合业务架构简单、主从切换频率低的场景,建议配合服务自动发现组件实现主从切换后的地址自动更新
- 代理层拦截:灵活性最高,支持自定义复杂的读写分离、多租户流量管控规则,适合中大规模MongoDB集群使用
- 数据库规则控制:适合无法调整网络架构、也不想额外部署代理的场景,对数据库版本有一定要求
内容的提问来源于stack exchange,提问作者M.Ahmed Amjad
相关产品推荐
相关产品推荐

