先把官方文档的地址贴上来,所有的内容都来自这里:http://www.mongodb.org/display/DOCS/Security+and+Authentication

最近项目需要mongodb,简单试了下,一直都没找到安全验证的机制,在linux下很简单就用mongo命令登进去了,也没有指定用户名和密码,也没有host和port,直接就进去了。当时还感觉蛮方便的,但是事后想想,完全没有安全机制和验证的,还是有点不放心啊。后来仔细看了下文档,原来还是有的,只是不太好找而已。

官方文档的说法是:目前mongodb的安全机制还是比较简陋的,主要是表现在权限方面,一个用户只要被授权了,那么他就直接拥有了全部的读写权限。mongodb也可以创建只读用户,只有读取的权限。

授权需求的开启

默认的mongodb进程启动之后是不需要授权验证的,需要手动打开,做法是在启动命令中添加--auth参数。

debian下的默认启动参数是:
/usr/bin/mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongodb.log --config /etc/mongodb.conf run

我们需要做的是编辑/etc/init.d/mongodb,在DAEMON_OPTS参数的run之前添加“--auth”就ok了,然后重启mongodb,你会发现参数更新了:
/usr/bin/mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongodb.log --config /etc/mongodb.conf --auth run

mongodb的权限和mysql有点不同,mysql的授权是在获得连接之前进行的,如果未获得授权的话,你连连接都做不到。但是mongodb是不同的,他要求的是你先连上去,然后再进行授权,授权通过了,你可以执行命令,否则你不能做任何事。

用户类型的差别

mongodb的用户分为两种,一种是admin用户,另一种是特定数据库用户。admin用户拥有最高的权限,而特定数据库用户则只能访问特定的数据库。

当mongodb的admin库里没有任何用户的时候,也就是说整个mongodb没有一个admin用户的时候,即便--auth权限需求打开了,用户还是可以通过localhost界面进入mongodb进行用户设置,否则的话整个mongodb就完全没法访问了。而当这个用户创建完成之后,之后的用户登录和操作就需要授权了,不是直接登录就能使用的了。

mongodb有一个比较奇怪的设置是,即便是一个admin用户,授权也必须在admin数据库下进行,而不能在其他数据库下进行。而授权之后admin用户就可以在任何数据库下进行任何操作了。当然数据库级别的用户在他自己的数据库下授权之后是不能到其他数据库进行操作的。举例来说:
> use test
> db.auth("someAdminUser", password)
这个操作是会失败的,因为admin用户没有在admin数据库下进行授权。

具体的操作

接下来我们看怎么操作:

创建admin用户:
> use admin
> db.addUser("theadmin", "anadminpassword")

显示当前数据库的所有用户,在admin数据库下执行则显示所有admin用户:
> db.system.users.find()

更改密码:
还是使用addUser命令进行密码的更新

删除用户:
db.removeUser("username")

以上只是用户设置和授权设置的一些基本,另外的还包括:备份和分区的授权,在已经存在的cluster上打开授权机制,端口和IP绑定,等。在这里就不详细解答了,有兴趣的可以看官方文档。