6.1.4 MongoDB的安全性控制

6.1.4 MongoDB的安全性控制

MongoDB的安全模式默认是关闭的,也就是不需要账号密码就能够访问数据库,这给使用者带来了很多便利,但是MongoDB需要在一个可信任的运行环境中。可以通过以下几个方面提高MongoDB数据库的安全性。

1)绑定IP

MongoDB服务器启动的时候可以通过设置--bind_ip参数来设置MongoDB绑定哪些IP,可以在启动MongoDB服务时或MongoDB的配置文件中(位于“安装目录\bin\mongod.cfg”)加上--bind_ip即可,多个IP直接用逗号隔开。

比如IP地址是192.168.1.2的服务器启动了MongoDB服务器,它的外网IP地址是122.133.23.155。如果不设置--bind_ip参数,对这台服务器来说,IP地址为127.0.0.1,192.168.1.2以及122.133.23.155都是它本身,因此在本机上使用mongo 127.0.0.1,mongo 192.168.1.2或者mongo 122.133.23.155都可以连接到MongoDB服务。同理,在局域网内部,可以使用mongo 192.168.1.2连接到该MongoDB服务,在公网中使用mongo 122.133.23.155也能进行连接。

如果在启动服务器MongoDB服务的时候使用如下命令:

>mongod--bind_ip 127.0.0.1,192.168.1.2

则无法再使用其外网IP地址“122.133.23.155”连接到该MongoDB服务。在本机上可以使用mongo 127.0.0.1和mongo 192.168.1.2进行连接;在局域网内其他客户端可以使用mongo 192.168.1.2进行连接,从而限制外界通过外网IP访问MongoDB服务器。

2)设置连接端口

MongoDB的默认连接端口是27017,为了安全起见,可以修改这个连接端口,避免恶意的连接尝试,在服务器启动时或者配置文件中(位于“安装目录\bin\mongod.cfg”)加上--port即可。使用如下命令设置MongoDB服务器的连接端口是36000:

mongod--port 36000

把MongoDB服务的连接端口设置为36000后,则mongo客户端连接时也需要适用该端口,使用的命令如下:

mongo 127.0.0.1:36000

表示客户端通过36000端口连接本机上的MongoDB服务。

3)用户认证

默认情况下,MongoDB服务的启动是没有开启用户认证的。如果需要使用账号密码验证功能,需要打开用户认证开关。

(1)启用认证

启动MongoDB时加上--auth即可开启认证模式。

使用命令:mongod--auth

在开启了访问权限控制的MongoDB实例上,用户能进行的操作取决于登录账号的角色。

(2)添加用户

在开启访问控制时,要确保系统数据库admin中有一个被分配了userAdmin或者userAdminAnyDatabase角色的用户账号。这个账号可以管理用户和角色,比如创建用户、获取用户角色权限、创建或修改自定义角色等。

在访问权限开启之前或之后,都可以执行创建用户的操作。如果在开启访问控制权限之前没有创建任何用户,MongoDB提供一个特有机制能够首先在系统数据库admin中创建管理员账号。一旦管理员账号创建完毕,其他账号则必须使用该管理员账号进行创建和控制权限。

【例6.6】 创建管理员账号myUserAdmin,密码为123,账号信息保存在admin数据库中。

(3)用户权限控制

【例6.7】 创建账号myTest,密码为123,账号信息保存在test数据库中。

从例6.6和例6.7中可以看到:创建用户时需要带roles参数,这就是用户的权限。role表示可执行的操作,db表示可以操作的数据库。权限可以在创建时赋予,也可以之后修改。常用的权限操作的命令见表6-2。

表6-2 MongoDB常用权限操作命令

MongoDB的更多权限相关参数可以查看官网。

(4)用户登录

开启用户认证之后启动mongo客户端需要使用下面的命令:

mongo--port 27017-u“myUserAdmin”-p“123”--authenticationDatabase“admin”

表示客户端通过端口27017、以myUserAdmin账号连接MongoDB服务器,密码为123。参数--authenticationDatabase“admin”表示myUserAdmin用户信息在admin数据库下。

如果启动客户端时没有登录,进入客户端后可以使用下面的命令进行登录:

mongo--port 27017

>use admin

>db.auth(“myUserAdmin”,“123”)

输出1则表示登录成功。

(5)修改密码

>db.changeUserPassword(“myTest”,“456”)

将myTest用户的密码修改为456,需要admin管理员权限。

(6)删除用户

>db.dropUser(“myTest”)

删除myTest用户,需要admin管理员权限。