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管理员权限。