mongodb设置用户安全控制
前面已经介绍如何安装mongodb的服务和客户端了,但是我们发现,在客户端对数据库操作的时候,没有账号和密码,也就是说,只要知道数据库的地址和端口,任何人都可以操作了。
这里介绍一下如何设置安全验证,有很多地方都是根据网上的技术文档来操作,写此文的目的只是记录我初学时是如何一步一步操作的,仅仅是做一个参考,也相当于一篇笔记。
MongoDB的用户分为两种,一种是admin用户,另一种是特定数据库用户。admin用户拥有最高的权限,而特定数据库用户则只能访问特定的数据库。
由于MongoDB默认设置为无权限访问限制,即然这样,那我们就先把它设置成为需要权限访问限制,咱们再看看效果,否则,即便创建了用户,再次连接的时候,不要用户名和密码也照样可以连接
在注册表中,找到MongoDB的节点,在它的ImgPath中,我们修改一下,加入 -auth,如下所示:(注意前后空格,还有,这个注册表里面的mongodb节点,在前面的文档里面已经介绍过了)
E:\mongodb\bin\mongod.exe --logpath E:\mongodb\data\log\mongo.log --logappend --dbpath E:\mongodb\data\db --directoryperdb -auth --service
然后在服务中重启mongodb服务
这时不管是在mongodb自带的客户端还是robomongo客户端,执行show collections都会显示错误,这表示访问限制已经设置成功了


这个时候,如果退出了客户端robomongo,那么再次用之前的连接方式是不可能连接成功的。接下来创建一个管理账号

这时再次来连接robomongo客户端,但是尽管连接成功了,却不能做任何的操作 ,那是因为这个账号的角色是userAdminAnyDatabase,它表示对所有数据库都具有创建、删除和管理用户的权限,但不具备增删改查的权限



下面用这个管理员账号创建其他的账号


然后用这个用户去连接数据库,注意下面的databasse,这里只能是admin,如果你输入其他的数据库名称,会导致连接不上。因为在创建这个账号的时候,是针对admin数据库创建的,那么这账号只属于这个admin数据库 
进来后可以看到只有admin一个数据库,但是由于这个账号只有读写权限,不具备用户管理的权限,因此不能对users集合进行操作

于是我新建了一个collection,然后添加数据,这下可以操作了

现在有个问题就是,我登录了sa管理员账号,想创建一个新的数据库,但是很遗憾不能,其原因就是创建的用户的角色不具备这样的权限。
Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
具体角色:
Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
(以下角色只能在admin数据库里面创建) clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 root:只在admin数据库中可用。超级账号,超级权限
所以,在编程中,连接的数据库的用户角色一般来说具备readwrit和dbadmin这两个角色就够了
在权限控制下,添加一个新的数据库:
首先是在admin数据库里面有一个readWriteAnyDatabase或者root角色的用户,然后用这个用户登录,再执行下面的语句:
use dbname 这个dbname就是新建数据库的名称,执行这条语句的作用就是创建了一个空的数据库,但是里面没有数据,因此客户端是看不到的,这需要执行下面的语句
db.runoob.insert({"name":"添加数据"}) 这条语句的作用是对新建的数据库添加一条记录,这样客户端就可以看到数据了,但是此时的数据库没有用户,这需要为这个库添加新的用户。
给新的数据库添加用户,必须具备相应的权限,然后执行
use dbname
db.createUser({user :"sa",pwd:"123456",roles:[{role:"readWrite",db:"dbname"}]})

浙公网安备 33010602011771号