通知一下_左手MongoDB,右手Redis_宠文网
首页

通知一下

关灯 护眼    字体:

上一章 章节列表 下一页




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用户可以操作所有数据库
<br />

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设置账户权限并实行外网访问。

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




    

上一章 章节列表 下一页