DBA MongoDB 用户权限

功能概述

​ MongoDB默认是没有开启权限认证的,这意味着你不需要用户与密码就能随意链接我们的MongoDB服务。

​ 如下图所示,我在MAC上链接了部署在Centos上的MongoDB服务,并未输入任何用户名与密码:

image-20210315230853449

​ 这是极度不安全的,意味着黑客可以在你的MongoDB中做任何事。

​ 我们该怎么做?

  1. 创建一个用户,并与某个数据库建立联系(生成认证库),此时该用户登录MongDB后将不再进入test库,而是进入自己的认证库

  2. 配置文件中指定,在登录时,必须输入认证库才能登录

​ 一般来说,管理员用户的认证库是内置库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: 超级用户
posted @ 2021-03-16 00:18  云崖君  阅读(94)  评论(0编辑  收藏  举报