MongoDB设置访问权限、设置用户【转】

MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下:

注:研究成果基于Windows平台

MongoDB在本机安装部署好后

1. 输入命令:show dbs,你会发现它内置有两个数据库,一个名为admin,一个名为local。local好像没啥用,如果哪位在使用过程中发现了这个local表的用途,希望能够留言提醒,那我们就专心来说说admin表

2. 输入命令:use admin,你会发现该DB下包含了一个system.user表,呵呵,没错,这个表就等同于MsSql中的用户表,用来存放超级管理员的,那我们就往它里面添加一个超级管理员试试看

3. 输入命令:db.addUser('sa','sa'),这里我添加一个超级管理员用户,username为sa,password也为sa,即然我们添加了超级管理员,那咱们就来测试下,看看咱们再次连接MongoDB需不需要提示输入用户名、密码,我们先退出来(ctrl+c)

4. 输入命令:use admin

5. 输入命令:show collections,查看该库下所有的表,你会发现,MongoDB并没有提示你输入用户名、密码,那就奇怪了,这是怎么回事呢?在文章最开始提到了,

MongoDB默认设置为无权限访问限制,即然这样,那我们就先把它设置成为需要权限访问限制,咱们再看看效果,怎么设置呢?

6. 在注册表中,找到MongoDB的节点,在它的ImgPath中,我们修改一下,加入 -auth,如下所示:

"D:/Program Files/mongodb/bin/mongod" -dbpath  e:/work/data/mongodb/db  -logpath  e:/work/data/mongodb/log -auth-service

7. 输入命令:use admin

8. 输入命令:show collections,呵呵,我们发现无法查看该库下的表了,提示:"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",很明显,提示没有权限,看来关键就在于这里,我们在启动MongoDB时,需要加上-auth参数,这样我们设置的权限才能生效,好,接下来我们使用刚刚之前设置的用户名、密码来访问

9. 输入命令:db.auth('sa','sa'),输出一个结果值为1,说明这个用户匹配上了,如果用户名、密码不对,会输入0

10. 输入命令:show collections,呵呵,结果出来了,到这里,权限设置还只讲到一多半,接着往下讲,我们先退出来(ctrl+c)

11. 输入命令:mongo TestDB,我们尝试连接一个新的库(无论这个库是否存在,如果不存在,往该库中添加数据,会默认创建该库),然后,我们想看看该库中的表

12. 输入命令:show collections,好家伙,没权限,我们输入上面创建的用户名、密码

13. 输入命令:db.auth('sa','sa'),输入结果0,用户不存在,这下有人可能就不明白了,刚刚前面才创建,怎么会不存在呢?原因在于:当我们单独访问MongoDB的数据库时,需要权限访问的情况下,用户名密码并非超级管理员,而是该库的system.user表中的用户,注意,我这里说的是单独访问的情况,什么是不单独访问的情况呢?接下来再讲,现在咋办,没权限,那我们就尝试给库的system.user表中添加用户

14. 输入命令:db.addUser('test','111111'),哇靠,仍然提示没有权限,这可咋办,新的数据库使用超级管理员也无法访问,创建用户也没有权限,呵呵,别急,即然设定了超级管理员用户,那它就一定有权限访问所有的库

15. 输入命令:use admin

16. 输入命令:db.auth('sa','sa')

17. 输入命令:use TestDB

18. 输入命令:show collections,哈哈,一路畅通无阻,我们发现可以利用超级管理员用户访问其它库了,呵呵,这个就是不单独访问的情况,不难发现,我们是先进入admin库,再转到其它库来的,admin相当于是一个最高级别官员所在区域,如果你是个地产商,想在地方弄个大工程做做,你想不经过那些高级官员就做,这是行不通的,你需要先去到他们那里,送点礼,再顺着下到地方,工程你就可以拿到手了,此言论仅为个人观点,不代表博客园;即然工程拿到手了,就要开始建了,那我们不至于每加块砖、添个瓦都得去和那帮高级官员打招呼吧,所以我们得让这个工程合法化,咱们得把相关的手续和证件弄齐全,不至于是违建

19. 输入命令:db.addUser('test','111111'),我们给TestDB库添加一个用户,以后每次访问该库,我都使用刚刚创建的这个用户,我们先退出(ctrl+c)

20. 输入命令:mongo TestDB

21. 输入命令:show collections,提示没有权限

22. 输入命令:db.auth('test','111111'),输出结果1,用户存在,验证成功

23. 输入命令:show collections,没再提示我没有权限,恭喜您,成功了

好累啊!一口气写完,呵呵

注:当需要使用权限才能访问MongoDB时,如果需要查看MongoDB中所有的库,我们只能通过超级管理员权限,输入命令show dbs来查看了。

 

以下是关于Replica set如何设置权限的问题:

http://www.nosqlcn.org/viewtopic.php?t=329

Replica sets and sharding can use authentication in v1.9.1+,the servers use a key fileto authenticate internal communication. A key file is basically a plaintext file which is hashed and used as an internal password.

1 Create a key file that can be copied to each server in the set. A key file is composed of characters in the Base64 set, plus whitespace and newlines
创建一个key文件,key字符是Base64字符组合外加支持空白换行

2 Modify this file's permissions to be only readable by the current user.
修改key文件权限为只有mongod的用户只读

3 Start each member of the set with the --keyFile /path/to/fileoption.
每个成员启动时加--keyfile
  
4 Each client connection to the database must be authenticated before it can be used, as with single-server authentication. 
每一个客户端的连接必须先验证.

5 You do not need to use the --auth option, too, --keyFile implies --auth.
注意不需要再加--auth 

To enable authentication on an existing cluster, shut down all members and restart them with the--keyFileoption. Remember that you must add users before you can access the data remotely.

You can disable authentication by restarting all members without the --keyFileoption.

By default, a mongod server will listen on all available IP addresses on a machine. You can restrict this to a single IP address with the 'bind_ip' configuration option for mongod.

Typically, this would be set to 127.0.0.1, the loopback interface, to require that mongod only listen to requests from the same machine (localhost).

To enable listening on all interfaces, remove the bind_ip option from your server configuration file.

openssl rand -base64 753 >mongokey

chmod 400 mongokey