DBA MongoDB 用户权限
功能概述
MongoDB默认是没有开启权限认证的,这意味着你不需要用户与密码就能随意链接我们的MongoDB服务。
如下图所示,我在MAC上链接了部署在Centos上的MongoDB服务,并未输入任何用户名与密码:
这是极度不安全的,意味着黑客可以在你的MongoDB中做任何事。
我们该怎么做?
-
创建一个用户,并与某个数据库建立联系(生成认证库),此时该用户登录MongDB后将不再进入test库,而是进入自己的认证库
-
配置文件中指定,在登录时,必须输入认证库才能登录
一般来说,管理员用户的认证库是内置库admin,普通用户的认证库是在后期业务中需要使用的库。
从MongoDB3.6开始,默认不允许远程登录,除非你在配置文件中指定了bindIp参数。
操作流程
新建管理员
现在我们准备创建一个管理员,管理员的认证库为admin:
> use admin
> db.createUser({
"user" : "root",
"pwd" : "123",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
})
基本语法说明:
# user : 用户名
# pwd : 密码
# roles->role : 角色名,常用可选角色有root,readWrite,read
# roles->db : 认证库,也就是该角色可以管理的库,admin库下的用户可以管理所有库
查看用户
在shell中,进入admin库,查看所有用户:
> use admin
> db.system.users.find().pretty()
{
"_id" : "admin.root",
"userId" : UUID("860407d1-8b43-48a7-b03b-7f2c16145d4c"),
"user" : "root",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "cozD4fwgSKKcJTjLlH5Jwg==",
"storedKey" : "Z+x/d0QVEqXTvVyYcEsmozTY5Vg=",
"serverKey" : "GIwY7rxwY7cD1fV8A4z4g8FmCcA="
},
"SCRAM-SHA-256" : {
"iterationCount" : 15000,
"salt" : "eQFhTTPWWA/Pi97osUzJE5l/LUXtCnUBPAytlw==",
"storedKey" : "e4xhvS+CanPjQdIWxFlNQwsnzqOeH4Ka4ENd4P59ZDk=",
"serverKey" : "bMM1ddWZONP5FjWETBUgeMkSkJCdA/K9nDP0O1Mgt6w="
}
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
新建普通用户
接下来创建普通用户,你需要use到该用户日后要使用的库中。
这里以db1库举例:
> use db1
> db.createUser({
"user" : "user01",
"pwd" : "user01",
"roles" : [
{"role" : "readWrite", "db" : "db1"}
]
})
如果你想让该用户管理和使用多个库,可在db中指定一个数组,并在数组中输入要管理和使用的库名。
用户授权
接下来我们需要进入到这两个角色各自的库中,对其进行授权操作:
> use admin
> db.auth('root','123')
> use db1
> db.auth('user01','user01')
开启验证
在配置文件中,首先加入如下配置项:
security:
authorization: enabled
重启MongoDB服务:
T > systemctl restart mongod
# mongod -f /usr/local/mongodb/conf/mongod.conf --shutdown
# mongod -f /usr/local/mongodb/conf/mongod.conf
如何登陆
现在,如果要在本地shell中进行登录的话,你可以向下面这样登录:
T > mongo -uroot -p123 127.0.0.1/admin
T > mongo -uuser01 -puser01 127.0.0.1/db1
这样的登录就是加了授权的登录了,如果没有加后面的授权库,登陆上去很多操作是不被允许的。
如果我们用user01这个普通用户进行登录后,使用db命令查看所在的库名就是db1库,并且使用show dbs库也只能查看到db1库:
> db
db1
> show dbs
db1
如果是远程登录,可用以下的形式:
mongodb://用户名:密码@地址:端口号/?authSource=验证库
mongodb://root:123@192.168.1.120:27017/?authSource=admin
用户管理
修改用户
如果要对一个用户进行修改,必须登录管理员用户且在该用户的认证库中使用如下命令:
T > mongo -uroot -p123 127.0.0.1/admin
> use db1
> db.updateUser('user01',
{
pwd:'user123',
roles:[
{
role:'read',
db:'db1'
}
]
}
)
别忘记进行一次授权。
> use db1
> db.auth('user01','user123')
删除用户
如果要删除一个用户,需要管理员用户进入其验证库中执行以下命令。
T > mongo -uroot -p123 127.0.0.1/admin
> use db1
> db.dropUser("user01")
可选角色
数据库用户角色:
- read: 只读数据权限
- readWrite:学些数据权限
数据库管理角色:
- dbAdmin: 在当前db中执行管理操作的权限
- dbOwner: 在当前db中执行任意操作
- userADmin: 在当前db中管理user的权限
备份和还原角色:
- backup
- restore
跨库角色:
- readAnyDatabase: 在所有数据库上都有读取数据的权限
- readWriteAnyDatabase: 在所有数据库上都有读写数据的权限
- userAdminAnyDatabase: 在所有数据库上都有管理user的权限
- dbAdminAnyDatabase: 管理所有数据库的权限
集群管理:
- clusterAdmin: 管理机器的最高权限
- clusterManager: 管理和监控集群的权限
- clusterMonitor: 监控集群的权限
- hostManager: 管理Server
超级权限:
- root: 超级用户