暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mongo用户和权限管理

程序猿读历史 2021-05-31
2973


权限概述

  Mongodb用role来划分规则,角色是将一些权限组成一个集合,然后再将该集合授权给某个用户,某个用户就拥有一些列的权限。MysQL5.7版本还不支持role的配置,8.0开始支持role。
  安装 MongoDB 时,会自动创建 admin 数据库,这是一个特殊数据库,提供了普通数据库没有的功能。有些用户角色赋予用户操作多个数据库的权限,而这些角色只能在 admin 数据库中创建,要创建有权操作所有数据库的超级用户,必须将该用户加入到 admin 数据库中。连接验证时,MongoDB 将在指定数据库和 admin 数据库中检查用户账户。

注意:

  • mongodb语句大小写敏感。

  • 不要在admin库下,创建表业务表。

系统权限介绍

权限名称权限介绍角色类型备注
read该角色拥有读取指定数据库用户角色系统集合以及system.indexes,system.js,system.namespaces集合除外
readWrite该角色拥有读写指定数据库用户角色系统集合和system.js集合除外
dbAdmin该角色拥有指定数据库数据库管理权限,包括 system.indexes,system.namespaces, system.profile集合的操作权限。管理角色该角色不拥有所有非系统集合的读权限
dbOwner该角色拥有指定数据库的所有权限,该角色包括:readWrite、dbAdmin、userAdmin管理角色
userAdmin该角色拥有指定数据库用户和角色的管理权限。包括创建用户等。管理角色
clusterAdmin该角色拥有群集的所有权限。该角色包含clusterManager,clusterMonitor,hostManager 角色权限,同时还有删除数据库的权限群集管理角色只能创建在admin库下
clusterManager该角色拥有群集的管理和监控权限,包括对local、config数据库的访问权限,同时该角色拥有分片和复制集的管理权限群集管理角色只能创建在admin库下
clusterMonitor该角色拥有群集的监控权限群集管理角色只能创建在admin库下
hostManager该角色拥有群集的监控和服务管理权限群集管理角色只能创建在admin库下
backup该角色拥有备份数据的权限备份还原角色只能创建在admin库下
restore该角色拥有还原备份数据的权限。备份还原角色只能创建在admin库下
readAnyDatabase该角色拥有所有数据库的读权限所有数据库角色只能创建在admin库下
readWriteAnyDatabase该角色拥有所有数据库的读写权限所有数据库角色只能创建在admin库下
userAdminAnyDatabase该角色拥有所有数据库的userAdmin权限所有数据库角色只能创建在admin库下
dbAdminAnyDatabase该角色拥有所有数据库的dbAdmin权限。所有数据库角色只能创建在admin库下
root赋予超级账号,超级权限超级权限角色只能创建在admin库下,该角色跳出五行中,不在三界内,慎用

1.创建用户

用户创建语法:

{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}

user字段:用户的名字;
pwd字段:用户的密码;
cusomData字段:为任意内容,例如可以为用户全名介绍;
roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色;
roles 字段:可以指定内置角色和用户定义的角色。



用户名是read的用户,密码是read,对test01库下有只读操作。

db.createUser(
{
user: "read",
pwd: "read",
roles: [ { role: "read", db: "test01" } ]
}
)

注意:

  • 创建管理员角色用户的时候,必须到admin下创建。

  • 创建普通库的用户时,删除的时候也要到相应的库下操作。

  • 只有只读或者读写角色,没有只写角色。

2.新增权限

给read用户新增对test02库有只读权限

db.grantRolesToUser( "read", [{'role':'read','db':'test02'}])

3.回收用户权限

use test

db.revokeRolesFromUser ( "read",[ { role : "read", db :"test02"} ] )

4.删除用户

方法1:
use admin
db.system.users.remove({user:"read"})

方法2:
use admin
db.dropUser("read")

5.查看用户权限

方法1:
use admin
show user

方法2:
use admin
db.system.users.find().pretty()

6.错误示例

  • 将readAnyDatabase建在非admin库下

在test01库下,创建对任何库可读的read01用户,发现报错,报错信息如下。

mongo>
mongo> db.auth('root','123456')
1
mongo>
mongo> db.createUser(
... {
... user: "read01",
... pwd: "123456",
... roles: [ { role: "readAnyDatabase", db: "test01" } ]
... }
... )
2019-09-01T19:46:54.083+0800 E QUERY [thread1] Error: couldn't add user: No role named readAnyDatabase@test01 :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1290:15
@(shell):1:1
mongo>

注意:以下角色都必须在admin库下创建。
clusterAdmin
clusterManager
clusterMonitor
hostManager
backup
restore
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase
root

  • 用户在哪个数据库下创建的,则在什么用户下验证,一般建议在admin库下创建

在test01库下,创建read02用户,该用户只对test01库有只读权限,在read02用户只能在test01库下验证,无法在其他库下验证。

mongo> use test01
switched to db test01
mongo> db.createUser(
... {
... user: "read02",
... pwd: "123456",
... roles: [ { role: "read", db: "test01" } ]
... }
... )
Successfully added user: {
"user" : "read02",
"roles" : [
{
"role" : "read",
"db" : "test01"
}
]
}
mongo>
mongo>
mongo> use test02 ###在test02库下验证,报错
switched to db test02
mongo> db.auth('read02','123456')
Error: Authentication failed.
0
mongo> use test01 ###在test01库下验证,成功
switched to db test01
mongo>
mongo> db.auth('read02','123456')
1
mongo>
mongo> show tables;
test_col
mongo>

  • 创建对不同库的权限的用户

创建read03用户,该用户对test01只读,对test02只能写,发现报错。原因是mongo没有只写角色,只有读写角色,改为对test02库可读可写,发现用户创建成功。

mongo> use admin
switched to db admin
mongo> db.auth('root','123456')
1
mongo>db.createUser (
... {
... user : "read03",
... pwd : "123456",
... roles : [ { role : "read", db : "test01" },
... { role : "write", db : "test02" }
... ]
... }
... )
2019-09-01T20:19:44.768+0800 E QUERY [thread1] Error: couldn't add user: No role named write@test02 :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1290:15
@(shell):1:1
mongo>
mongo>
mongo> db.createUser (
... {
... user : "read03",
... pwd : "123456",
... roles : [ { role : "read", db : "test01" },
... { role : "readWrite", db : "test02" }
... ]
... }
... )
Successfully added user: {
"user" : "read03",
"roles" : [
{
"role" : "read",
"db" : "test01"
},
{
"role" : "readWrite",
"db" : "test02"
}
]
}
mongo>

7.常见用户管理函数

###密码验证
db.auth() :Authenticates a user to a database.

###创建用户
db.createUser() :Creates a new user.

###修改用户权限
db.updateUser() :Updates user data.

###修改用户密码
db.changeUserPassword() :Changes an existing user’s password.

###删除所有用户
db.dropAllUsers() :Deletes all users associated with a database.

###删除用户
db.dropUser() :Removes a single user.

###给用户赋予权限
db.grantRolesToUser() :Grants a role and its privileges to a user.

###回收用户权限
db.revokeRolesFromUser() :Removes a role from a user.

###查看某个用户权限
db.getUser("指定 username") :Returns information about the specified user.

###查看所有用户权限

db.getUsers() :Returns information about all users associated with a database



8.开启验证

修改mongo配置文件

在配置文件中加上authorization: "enabled"
,不开启验证,登陆mongo不需要密码。


[root@192-168-0-171 mongodb]# cat mongodb.yml
。。。
security:
keyFile: "/opt/soft/mongodb/key/mongodb-keyfile"
clusterAuthMode: "keyFile"
authorization: "enabled"
。。。

文章转载自程序猿读历史,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论