前言
随着MongoDB使用人群企业越来越广泛,黑客的注意力也转移到了其中。比如去年很火热的MongoDB劫持事件,很多人对MongoDB的安全也越来越重视。今天,我们就简单总结一些MongoDB的安全防护。首先,关于这方面的内容,官方也有说明,参考如下链接:https://docs.mongodb.com/manual/administration/security-checklist/ ;
1、启用访问控制和强制认证
打开认证,创建认证用户:
- 在admin数据库中,创建一个
admin
用户
use admindb.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
- 对具体的库进行授权
use reportingdb.createUser( { user: "reportsUser", pwd: "12345678", roles: [ { role: "read", db: "reporting" }, { role: "read", db: "products" }, { role: "read", db: "sales" }, { role: "readWrite", db: "accounts" } ] })
提示:在启动项中加入 --auth 或者在配置文件中加入 security.authorization: enabled。并且,MongoDB还可以使用外部系统进行认证,比如LADP等;
2、配置基于角色的访问控制
这里需要明确的是,MongoDB的基本安全分为两种,一种是认证,一种是鉴权。其实英语会说的比较明白点: authorization, authentication。
认证是作为用户登录的一种账号密码校验,类似MySQL 的 root/password ,在大部分应用中,一旦创建一个连接(用于连接池的),那么该连接只会做一次,所以大可不必担心因为认证而带来的开销。
鉴权是在数据库中的账号拥有的权限做鉴定,类似MySQL中的privilege。
3、基于TSL的双向认证
打开MongoDB 的TLS/SSl 的配置,社区版需要下载一个SSL版本,或者可以从社区版升级到SSl版本,企业版自带SSL。
SSL 可以保证MongoDB的 所有连接(输入和输出的连接)都是加密的。
4、限制网络暴露
通过指定 bindip,以及Linux通过iptables来限制访问的IP地址等,并在生产线上关闭 MongoDB 的 HTTP 接口和 REST API来达到规避网络进口的安全问题。
iptables -A INPUT -s-p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT -d -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
5、创建MongoDB专门的运行用户
使用 mongodb 用户启动MongoDB,而不是使用 root 用户;
useradd -M mongodb -s /bin/nologinsudo -u mongodb -s
6、使用安全配置项运行MongoDB