为了保证线上mongodb数据库的安全性以及防止劫持,我们需要给数据库设置权限验证
1.创建数据库权限用户
进入mongodb的安装目录的bin下,从这里进入MongoDB shell
这个是个人的安装路径,仅供参考
cd /opt/modules/mongodb/bin
./mongo
复制代码
mongodb的用户分两种,一种是管理员,一种是普通用户。
管理员管理普通用户、普通用户管理数据库数据.
先创建管理员
下面是db的命令行操作:
>show dbs(可以列出数据库列表,方便查看)
>use admin
>db.createUser({user:'user',pwd:'password',roles:[{role:'readWriteAnyDatabase',db:'admin'}]})
复制代码
创建指定数据库testdb的用户,并且分配权限
>use testdb (你要设置用户的数据库名称)
>db.createUser({user:'user1',pwd:'password1',roles:[{role:'readWrite',db:'testdb'}]})
>db.auth('user1', 'password1')
//返回 1 ,则说明用户密码设置ok
复制代码
- 常用的role值记录:
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
7. 内部角色:__system
- 相应的功能
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限
复制代码
2.重启mongodb服务进程
用户创建成功后,ctrl+c退出shell进程
这个时候需要重新启动mongodb服务,使权限生效
cd /opt/modules/mongodb/
//先关掉服务(killing process with pid XXX)
bin/mongod --config /opt/data/mongodb/data/mongodb.conf -shutdown
//开启权限认证服务,需要附加--auth
bin/mongod --config /opt/data/mongodb/data/mongodb.conf --auth
复制代码
这个时候,数据库的用户权限就加好了,可以在第一步的MongoDB shell中执行以下db命令,确保权限生效:
>use admin
>show collections
复制代码
[thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listCollections: 1.0, filter: {} }",
"code" : 13,
"codeName" : "Unauthorized"
} :
复制代码
如果出现上面的错误,说明权限已经设置成功了,此时远程连接数据库将会报出权限错误
需要执行下面权限登陆,
>db.auth('user','password')
>show collections
//可以操作成功了
复制代码
3.删除用户
db.dropUser(<user_name>)
删除某个用户,接受字符串参数
示例:db.dropUser(“admin”)
4.修改密码
有2个方法:
1.这是添加用户的方法,但是如果用户名相同,密码不同的话,就会更新密码。
> db.addUser('user','new password')
复制代码
2.db.changeUserPassword
db.changeUserPassword('user','new password');
复制代码
5.忘记数据库密码?
如果忘记了密码,可以执行非权限认证:
//先关掉服务(killing process with pid XXX)
bin/mongod --config /opt/data/mongodb/data/mongodb.conf -shutdown
bin/mongod --config /opt/data/mongodb/data/mongodb.conf
复制代码
再次执行,会得到admin数据库中的collections列表
>use admin
>show collections
复制代码
然后这个时候,操作权限恢复,可以再次进行用户的权限设置