作者介绍
上海小胖,中国第十五位MONGODB PROFESSIONAL获得者,资深Python开发、DBA。DevOps践行者,曾独立开发Web服务平台,电商爬虫系统、运维管理系统,涵盖数据热力图、核心数据监控、服务器监控系统等。博客地址:https://segmentfault.com/u/shanghaixiaopang。
看了这个标题,我不知道你有没有一种潜意识,如果有,没错,那就是这个了,MongoDB 终于开放了我觉得对于一个数据库的安全来说,比较重要的一个模块了 ——IP 白名单。
众所周知,MySQL、Oracle、SQL Server等知名的数据库都是有在安全方面作出相当防护的。
IP白名单
针对库、表的权限区分
针对不同的增删改查、事务、admin等的权限分配
甚至于Oracle还提供了针对于不同权限所组合而成的逻辑角色,MySQL在这方面也做了相应的调整。
但回过头来看看MongoDB,从最一开始的最最简单的用户名+密码的方式,到之后引入了Bult-in Role、Custom Role、Privilege等概念,再到即将推出的3.6中,明确了将bind_ip调整成了localhost,这也是受比特币案的影响吧。
这一次,3.6中,新加入了authentication Restrictions,就是用来解决IP白名单的缺陷。
接下来看一下这个非常吸引我的特性是如何实现的吧。
首先还是先来看看MongoDB的官方文档吧。
https://docs.mongodb.com/master/reference/method/db.createUser/#authentication-restrictions
简单来说,clientSource 就是针对客户端的IP 做白名单控制。serverAddress 就是针对服务端的IP 做白名单控制。
这里问题来了,客户端IP好理解,无非就是哪里连过来的连接么,这和我们理解上的都一致,那么服务端地IP呢?什么意思?
这里服务端的IP 指的是客户端在连接过来的时候指定的host 地址,比如:mongo --host=192.168.56.101,那么serverAddress 就必须包含192.168.56.101,这里的包含是什么意思?和MySQL一样,同样可以指定B、C网段,来达到多个地址地开放,只是写法有些许出入,MySQL中是:192.168.56.*,MongoDB 中是:192.168.56.0/24。那么如果是使用驱动的话,也是一样的,在host参数中指定对应的IP即可。
接着就来操作一把。
1、创建一个应用账号miracle
2、重启数据库,开启权限认证
3、进入miracle 数据库,并验证
4、使用符合要求的格式重新连接数据库
5、第四步中出错的原因是因为默认3.6 开启了bind_ip=localhost,而由于一开始忽略了这个问题,折腾了我好久。重启数据库加上--bind_ip_all。
6、重新连接
至此,MongoDB的IP白名单功能验证完毕,希望能帮助大家在实际的维护中更安全地控制好开发者的权限。