首页

8.2提高MongoDB的安全性

关灯 护眼    字体:

上一章 目录 下一章




MongoDB默认没有密码,且只有运行MongoDB电脑上的程序能够访问。实际上MongoDB也是可以设置远程访问的。但是一旦开启了外网访问,就一定要设置账号和密码,否则可能会导致安全隐患,甚至遭遇勒索敲诈。



8.2.1  配置权限管理机制


MongoDB默认没有账号和密码,只要连上了它就可以查询、修改、增加、删除任何内容。

为了增强MongoDB的安全性,需要配置基于角色的访问控制(Role-Based  Access  Control,  RBAC)机制。

RBAC机制涉及三个关键定义:角色(Roles)、特权(Privileges)和用户(Users)。

●  特权是指一些资源和能够在资源上进行的操作。

●  一个角色可以有多种特权。

●  一个用户可以有被赋予不同的角色。

1.创建管理员用户

管理员用户的作用是创建其他用户。管理员用户本身不能对数据库进行控制。

在Linux或者macOS中,执行命令“mongo”打开MongoDB命令行客户端,如图8-8所示。

在Windows中,使用DOS命令进入MongoDB的bin文件夹下,然后执行命令“mongo.exe”来启动命令行客户端。

图8-8  MongoDB命令行客户端

在MongoDB命令行客户端中,执行以下命令来创建管理员用户。

代码8-11  在MongoDB命令行中创建管理员用户

其中,主要代码说明如下。

●  第1行代码:切换到admin数据库。admin数据库是MongoDB自带的数据库。

●  第3~9行代码:创建管理员,账号名称为  admin,密码为  kingnameisgenius,角色为userAdminAnyDatabase,控制的数据库为admin。

提示:

这里的写法有点像JavaScript的写法,每一个参数换行,但第3~9行其实本质上是一条命令。

运行效果如图8-9所示。

图8-9  切换到admin数据库并创建管理员

创建好管理员账户以后,在MongoDB命令行客户端中直接输入“exit”后按回车键,即可退出MongoDB命令行客户端。

修改第3章创建的配置文件mongodb.conf,添加如下两行内容:

效果如图8-10所示。

图8-10  启用权限管理功能

保存配置文件并重启MongoDB数据库。再次执行“mongo”命令,发现虽然能够连上数据库,但是已经不能执行常规操作了,如图8-11所示。

图8-11  启动权限管理以后直接使用命令行客户端已经不能正常操作了

要正常使用命令行客户端,必需把mongo的启动命令修改为:

mongo  -u  'admin'  -p  'kingnameisgenius'  --authenticationDatabase  'admin'

启动以后发现可以正常执行常规操作了,如图8-12所示。

图8-12  带参数启动命令行客户端

2.创建普通用户

管理员账户是没有权限操作普通数据库的。要操作普通数据库,还需要创建普通用户。

使用管理员账户登录命令行客户端后,执行以下命令创建一个对chapter_8数据库有读写权限,对chapter_4只有读权限的普通用户。

代码8-12  在MongoDB命令行中创建普通用户

运行效果如图8-13所示。

图8-13  添加kingname用户

3.使用Robo  3T连接有账号的MongoDB

启动权限管理并添加账号以后,原来的Robo  3T已经不能正常连接MongoDB数据库了,如图8-14所示。此时,需要修改Robo  3T的连接设置。

图8-14  Robo  3T不能正常连接MongoDB

(1)在连接列表中,选中到本地  MongoDB  的链接,并单击“edit”链接(图中左上角),如图8-15所示。

图8-15  单击“edit”连接

(2)弹出连接设置对话框,切换至Authentication选项卡,勾选“Perform  Authentication”复选框,填写被授权访问的数据库名,并填写用户名和密码,如图8-16所示。

图8-16  填写用户名和密码

(3)填写完成以后保存,就可以正常连接MongoDB了,如图8-17所示。

图8-17  kingname用户查看chapter_8数据库

4.创建能操作数据库的管理员用户

管理员(admin账号)能创建其他用户,看似权限非常大,但它不能访问任何一个数据库。所以,如果有必要,还需要创建一个能对所有数据库都有全部权限的用户。

(1)在  MongoDB  的命令行客户端中,使用管理员(admin)连接MongoDB,然后执行以下命令创建一个对所有数据库有完全控制权限的用户。

代码8-13  创建能操作数据库的管理员

(2)运行效果如图8-18所示。

图8-18  创建超级用户

(3)在robo  3T的连接设置中,使用root用户连接数据库,并把数据库设定为admin,如图8-19所示。

图8-19  使用root用户连接数据库

(4)连接以后发现可以操作所有数据库了,如图8-20所示。

提示:

能力越大责任越大,请慎重考虑是否有必要添加root用户。

图8-20  root用户可以操作所有数据库


5.用Python连接有密码的MongoDB

如果数据库设置了用户名和密码,那么在初始化数据库连接时,就需要使用URI(Uniform  Resource  Identifier,统一资源标志符)的方式来注明连接方式。

MongoDB  URI的格式如下:

mongodb://用户名:密码@数据库地址:端口/数据库名

其中,除数据库地址外,其他参数全都可以省略。例如:

●  连接没有权限限制,端口默认的本地数据库:mongodb://localhost。

●  连接有账户密码,端口默认的本地数据库:mongodb://kingname:genius@localhost。

●  连接有账号密码,端口默认的远程数据库:mongodb://kingname:genius@10.11.212.37。

●  连接没有权限管理,端口为8001的远程数据库:mongodb://10.11.200.100:8001。

●  使用用户名kinganme,密码genius连接远程的chapter_8数据库,MongoDB端口为8001:mongodb://kingname:genius@10.11.111.21:8001/chapter_8。

那么,在Python中,如果使用用户名kingname,密码为kingnameisgenius,连接本地MongoDB上面的chapter_8库,代码如下:

代码8-14  用Python连接有用户名和密码的MongoDB

运行效果如图8-21所示。

图8-21  使用Python连接有用户名密码的数据库

提示:

如果使用的用户为root,那么可以在URI中不需要指定数据库名,而写为:

mongodb://root:iamsuperuser@localhost



8.2.2  开放外网访问


要开放外网访问权限,只需要修改  MongoDB  的配置文件即可。打开配置文件,可以看到其内容如图8-22所示。

图8-22  MongoDB配置文件

配置文件中的第8行“bindIp:127.0.0.1”用来设置数据库能被哪个地方访问。当前设置为127.0.0.1,表示只允许运行数据库的这台电脑中的其他程序访问。

在Python中,连接MongoDB使用的语句为:

import  pymongo

conn  =  pymongo.MongoClient()

这里的MongoClient没有带参数,但Pymongo实际上使用的是默认域名localhost,这个域名对应的IP地址就是127.0.0.1。这一点可以通过阅读PyMongo的源代码得到确认,如图8-23和图8-24所示。

图8-23  PyMongo源代码

图8-24  PyMongo默认使用localhost

如果希望从外网连接这个MongoDB,则可以把它设置为0.0.0.0。修改以后的MongoDB配置文件如图8-25所示。

图8-25  允许来自外网的访问

修改配置文件以后重启数据库,即可通过IP地址从远程访问MongoDB。

一旦允许  MongoDB  接收外网访问,那一定要设置用户名和密码,同时最好配置防火墙,指定只允许哪些来源的IP可以访问MongoDB端口。

如果  MongoDB  允许外网访问又不设置用户和名密码也不设置防火墙,则可能遭遇勒索攻击。攻击者会连上你的MongoDB,然后把里面的内容全部清空并留下一条记录,表示他已经备份了数据库的内容,只要转账多少钱到某个账号就帮你恢复数据。但实际上攻击者只是清空数据,根本没有备份,所以即使交了钱也不能恢复数据。



本章小结


本章介绍了介绍了优化MongoDB数据库查询的几个方法,还介绍了如何为MongoDB设置账户权限并实行外网访问。

在实行外网访问时,一定要特别做好保护措施,确保数据的安全。




上一章 目录 下一章