mongod 关键字参数:--auth

默认值是不需要验证,即 --noauth,该参数启用用户访问权限控制;当mongod 使用该参数启动时,MongoDB会验证客户端连接的账户和密码,以确定其是否有访问的权限。如果认证不通过,那么客户端不能访问MongoDB的数据库。

这个参数我们可以写在配置文件中,表示每次启动服务都打开auth认证,在这里我们是加在了mongod的启动指令中,如下所示

[root@:vg_adn_tidbCkhsTest /usr/local/mongodb]#bin/mongo -u "admin" -p "123456" --authenticationDatabase "admin"
MongoDB shell version v3.4.18
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.18
> db
test

这里的“admin”数据库是我们在安装mongo的时候就已经创建的,并且在数据库中创建了admin用户,且拥有“userAdminAnyDatabase”角色

下面讲解基于角色的访问控制

角色是授予User在指定资源上执行指定操作的权限,MongoDB官方手册对角色的定义是:

A role grants privileges to perform the specified actions on resource.

MongoDB为了方便管理员管理权限,在DB级别上预先定义了内置角色;如果用户需要对权限进行更为细致的管理,MongoDB允许用户创建自定义的角色,能够在集合级别上控制User能够执行的操作。
MongoDB使用角色(Role)授予User访问资源的权限,Role决定User能够访问的数据库资源和执行的操作。一个User能够被授予一个或多个Role,如果User没有被授予Role,那么就没有访问MongoDB系统的权限。

A user is granted one or more roles that determine the user’s access to database resources and operations. Outside of role assignments, the user has no access to the system.

1,内置角色(Built-In Roles)

内置角色是MongoDB预定义的角色,操作的资源是在DB级别上。MongoDB拥有一个SuperUser的角色:root,拥有最大权限,能够在系统的所有资源上执行任意操作。

数据库用户角色(Database User Roles):

  • read:授予User只读数据的权限
  • readWrite:授予User读写数据的权限

数据库管理角色(Database Administration Roles):

  • dbAdmin:在当前dB中执行管理操作
  • dbOwner:在当前DB中执行任意操作
  • userAdmin:在当前DB中管理User

备份和还原角色(Backup and Restoration Roles):

  • backup
  • restore

跨库角色(All-Database Roles):

    • readAnyDatabase:授予在所有数据库上读取数据的权限
    • readWriteAnyDatabase:授予在所有数据库上读写数据的权限
    • userAdminAnyDatabase:授予在所有数据库上管理User的权限
    • dbAdminAnyDatabase:授予管理所有数据库的权限

现在我们举例子介绍一下

上面我们已经创建好了admin用户,该用户拥有有grant权限,我们创建的admin用户是在admin数据库中创建的。即:账号管理的授权权限。注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)。

由于我们的admin用户建立了 userAdminAnyDatabase 角色,用来管理用户,可以通过这个角色来创建、删除用户。验证:需要开启auth参数

[root@:vg_adn_tidbCkhsTest:23.22.172.65:172.31.22.29 /usr/local/mongodb]#bin/mongo -u "admin" -p "123456" --authenticationDatabase "admin"
MongoDB shell version v3.4.18
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.18
> db
test
> use admin
switched to db admin
> db
admin
> show users;
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "dbOwner",
"db" : "test"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
> show dbs;
admin 0.000GB
local 0.000GB
test 0.000GB
test1 0.000GB

我们连接上去admin用户之后,在admin数据库中就有了权限,注意admin用户拥有的角色是userAdminAnyDatabase。所以才可以创建用户等等操作

> use test2                                   #在test2库中创建账号
switched to db test2
> db.createUser(
... {
... user:"test",
... pwd:"test",
... roles:[{role:"readWrite",db:"test2"}]
... }
... )
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "readWrite",
"db" : "test2"
}
]
}
> show users;
{
"_id" : "test2.test",
"user" : "test",
"db" : "test2",
"roles" : [
{
"role" : "readWrite",
"db" : "test2"
}
]
}

现在我们开始验证一下:

> use test2
switched to db test2> db
test2
> db.abc.insert({"name":"chaofeng","id":1})
WriteResult({
"writeError" : {
"code" : 13,
"errmsg" : "not authorized on test2 to execute command { insert: \"abc\", documents: [ { _id: ObjectId('5bea73410816d4c446c6c0d1'), name: \"chaofeng\", id: 1.0 } ], ordered: true }"
}
})

因为我目前还是admin登录的,所以在test2数据库中,admin用户没有权限,只有我们刚刚建立的“test”用户才有权限。

注意:admin用户只是拥有了创建用户,删除用户的角色,这并不是最高权限。

所以现在我想在test2数据库下插入数据,我得使用test用户才行。

这里还要注意一点:

1、我在admin数据库中认证test用户

> db.auth("test","test")
Error: Authentication failed.
0
> db
admin

我在admin数据库中使用test用户认,来让test用户可以访问test2数据库,是失败的。记住一点:在admin下创建的账户,不能直接在admin库上验证。

2、我在test2数据库中认证test用户

> db.auth("test","test")
1
> db
test2

这样就成功了,记住一点:在哪个库上创建的账户,就在那里认证,也说明了一点,数据库账户是跟着数据库走的,先有数据库,然后才有账户去认证这个数据库,从而有权限操作。

现在我们的test用户已经可以登录到test2数据库中操作了,我们尝试一下

> use test2
switched to db test2> db.abc.insert({"name":"chaofeng","id":1})
WriteResult({ "nInserted" : 1 })
> db.abc.find()
{ "_id" : ObjectId("5bea76f00816d4c446c6c0d2"), "name" : "chaofeng", "id" : 1 }
>

最后我们再看一下数据库中创建的所有账户

> use admin
switched to db admin> db.system.users.find().pretty()
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "2VmpmkRbVjolDoXjzbjHTw==",
"storedKey" : "/Rd7OGTHEsGhsK8ZsFGe8DOzHTk=",
"serverKey" : "8+JA2FBdUVtvo3AZNNDSvREZpOg="
}
},
"roles" : [
{
"role" : "dbOwner",
"db" : "test"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
{
"_id" : "test1.ccf",
"user" : "ccf",
"db" : "test1",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "cqPSk8h1ucAnJEl3mjx8MQ==",
"storedKey" : "kNNTRqVv63fVy0r1KH9Oem0iKNo=",
"serverKey" : "yTO6i7IIu7wuTEfd+VJG/l59veM="
}
},
"roles" : [
{
"role" : "readWrite",
"db" : "test1"
}
]
}
{
"_id" : "test2.test",
"user" : "test",
"db" : "test2",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "0K+o35PrySZbdTq0kl79vg==",
"storedKey" : "z3Z8dDswfQsnJ98qpUG8qChIafQ=",
"serverKey" : "b6kLZoYhZwgxXmSNLpVIqyr6AyE="
}
},
"roles" : [
{
"role" : "readWrite",
"db" : "test2"
}
]
}

查看所有的用户我们必须在admin数据库下,在其他的数据中是查看不到的。比如

> use test2
switched to db test2
> db.system.users.find().pretty()

同样的查看数据库用户的指令,在test2数据库中就不起作用,什么也查不出来。

同样的道理,当我们登录到mongo的时候,想要进入到admin库中查看所有用户的操作也是需要验证的,比如:

[root@:vg_adn_tidbCkhsTest /usr/local/mongodb]#bin/mongo
MongoDB shell version v3.4.18
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.18
> db
test
> use test2
switched to db test2
> use admin
switched to db admin
> db.system.users.find().pretty()
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { find: \"system.users\", filter: {} }",
"code" : 13,
"codeName" : "Unauthorized"
}
>

紧接着这里我们还没有在test2库中认证账户密码,还能访问数据库吗?

> use test2
switched to db test2
> show dbs #发现连数据库都查看不了
2018-11-13T07:09:19.437+0000 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:814:19
shellHelper@src/mongo/shell/utils.js:704:15
@(shellhelp2):1:1
> db.abc.find()                                          #test2数据库的记录也查看不了
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on test2 to execute command { find: \"abc\", filter: {} }",
"code" : 13,
"codeName" : "Unauthorized"
}
> db.auth("test","test");                                    #开启认证账户
1
> db.abc.find()                                          #成功
{ "_id" : ObjectId("5bea76f00816d4c446c6c0d2"), "name" : "chaofeng", "id" : 1 }
>

总结:mongo数据库和别的数据库认证过程是不一样的,我们无需退出客户端便可以自动切换用户,来实现对不同数据库的操作。mongo中,在哪个数据库下创建的用户,就在哪个数据库下开启认证,也就是说,在A数据库创建的用户user1,只能在数据库A下面开启认证,在B数据库下面认证user1是不能成功的,在B数据库下只能认证user2数据库。数据库账户是跟着数据库走的。

现在我想删除数据库,

> use test2
switched to db test2
> show dbs
admin 0.000GB
local 0.000GB
test1 0.000GB
test2 0.000GB
> db.auth("test","test");
1
> db.abc.find()
{ "_id" : ObjectId("5bea76f00816d4c446c6c0d2"), "name" : "chaofeng", "id" : 1 }
{ "_id" : ObjectId("5bea7b4f6aeeebc0eb076f44"), "name" : "chen", "id" : 2 }
> db.dropDatabase();
{
"ok" : 0,
"errmsg" : "not authorized on test2 to execute command { dropDatabase: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
}

发现是不能删除数据库的,仔细一想就知道test用户只有对当前test2数据库读写操作,但是没有删除权限。

我们再对test2数据库创建一个用户,使其拥有管理权限

> db
test2
> db.createUser(
... {
... user:"gl",
... pwd:"gl",
... roles:[{role:"dbOwner",db:"test2"}]
... }
... )
Successfully added user: {
"user" : "gl",
"roles" : [
{
"role" : "dbOwner",
"db" : "test2"
}
]
}> db.auth("gl","gl")
1
> db.dropDatabase()
{ "dropped" : "test2", "ok" : 1 }

现在我们创建的gl用户拥有dbOwner角色,也就是对当前数据库拥有最高管理权限,这个时候就可以删除数据库test2了。

MongoDB基础之 用户和数据库基于角色的访问控制的更多相关文章

  1. RBAC(基于角色的访问控制)用户权限管理数据库设计

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  2. .Net Core实战之基于角色的访问控制的设计

    前言 上个月,我写了两篇微服务的文章:<.Net微服务实战之技术架构分层篇>与<.Net微服务实战之技术选型篇>,微服务系列原有三篇,当我憋第三篇的内容时候一直没有灵感,因此先 ...

  3. Azure 门户中基于角色的访问控制入门

    面向安全的公司应侧重于向员工提供他们所需的确切权限. 权限过多,可能会向攻击者公开帐户. 权限太少意味着员工无法有效地完成其工作. Azure 基于角色的访问控制 (RBAC) 可通过为 Azure ...

  4. YIi 权限管理和基于角色的访问控制

    验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...

  5. idou老师教你学istio :基于角色的访问控制

    istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...

  6. PHP RBAC权限管理 基于角色的访问控制演示

    RBAC rbac:Role Based Access Controll,基于角色的访问控制. 今天理一理RBAC,话不多说,直接切入主题 功能需求: 权限管理(无限极) 角色管理(可以分配权限) 管 ...

  7. RBAC (基于角色的访问控制)

    基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而 ...

  8. idou老师教你学istio 21:基于角色的访问控制

    istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...

  9. 一个基于角色的访问控制(RBAC)的简单示例

    关于"基于角色的访问控制"是什么,本文不再赘述,如果不明白,请自行查阅资料了解. 本文参考用户·角色·权限·表的设计的思想设计. 本文用到的技术有Spring Boot.Sprin ...

随机推荐

  1. 局域网使用visual studio配合iis调试手机app

    描述:开发一款手机应用程序,服务器配置在iis,当局域网中即只有路由器无外网如何设置实时调试手机应用程序? vs配合iis调试程序的两种方式? 使用vs的debug(f5)调试网站比较常见,然而当网站 ...

  2. async/await 与 generator、co 的对比

    之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...

  3. 使用gitlab, jenkins搭建CI(持续集成)系统(4) 灰度发布publish

    publish环境是正式环境,和dev, test, prepublish环境不同的是,正式环境一般要更加谨慎一些,发布的时候需要有一个灰度过程,即:分多次部署,每次部署几个服务器节点,验证没有问题以 ...

  4. ES 入门记录之 match和term查询的区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  5. 深入出不来nodejs源码-timer模块(JS篇)

    鸽了好久,最近沉迷游戏,继续写点什么吧,也不知道有没有人看. 其实这个node的源码也不知道该怎么写了,很多模块涉及的东西比较深,JS和C++两头看,中间被工作耽搁回来就一脸懵逼了,所以还是挑一些简单 ...

  6. C# ABP - 创建自己的模块

    本篇文章介绍怎么创建自己的模块,并且使用依赖注入方法进行模块间的无缝结合. 我们创建一下自己的一个会员模块,针对不同的系统都可以用.你们可以看看我是怎么做的,或者从中得到启发. 目录 1.开始创建项目 ...

  7. js 前端分页空间控件

    现在web注重用户体验与交互性,ajax 提交数据的方式很早就流行了,它能够在不刷新网页的情况下局部刷新数据.前端分页多是用ajax请求数据(其他方式也有比如手动构造表单模拟提交事件等).通过js将查 ...

  8. sql 查询结果作为数据进行添加,where in 子查询

    查询结果作为数据进行添加 INSERT INTO a ( Aid, Atitle, Url, Pic1 ) SELECT c Aid,d Atitle,e Url,f Pic1 FROM b 对于大神 ...

  9. ABB机器人---PCSDK简介

    BB机器人为用户提供了大量便捷的二次开发及应用工具,PCSDK就是其中一项. 1) 首先,机器人使用PCSDK,必须要有pc interface选项. 2)此处举例使用C#编写简单界面,实现与机器人数 ...

  10. Oracle11g自带的SQL_developer无法打开

    在安装完Oracle Database 11g Release 2数据库,想试一下Oracle自带的SQL DeveloperW工具,在操作系统菜单的所有程序中找到SQL Developer如下所示, ...