活动预告

小试牛刀:MongoDB 3.6 IP白名单功能验证

上海小胖 2017-11-21 10:10:09

作者介绍

上海小胖中国第十五位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白名单功能验证完毕,希望能帮助大家在实际的维护中更安全地控制好开发者的权限。