关灯
护眼 字体:大
中
小
上一章
目录
下一章
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设置账户权限并实行外网访问。
在实行外网访问时,一定要特别做好保护措施,确保数据的安全。
上一章
目录
下一章