[ MongoDB ] 3.X权限认证控制

1. 前言

介绍 Mongodb 3.X 的认证控制

2. 环境搭建

[[email protected]192.168.118.16 /usr/local/src]#wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-3.6.11.tgz
[[email protected]192.168.118.16 /usr/local/src]#tar xf mongodb-linux-x86_64-3.6.11.tgz
[[email protected]192.168.118.16 /usr/local/src]#mv mongodb-linux-x86_64-3.6.11 /usr/local/mongodb
[[email protected]192.168.118.16 /usr/local/src]#cd /usr/local/mongodb/
[[email protected]192.168.118.16 /usr/local/mongodb]#mkdir -pv data conf log
mkdir: created directory ‘data’
mkdir: created directory ‘conf’
mkdir: created directory ‘log’

编写配置文件:
[[email protected]192.168.118.16 /usr/local/mongodb/conf]#cat mongod.conf
bind_ip = 0.0.0.0    # 监听地址
port = 27017    # 监听端口
fork = true    # 后台运行
dbpath = /usr/local/mongodb/data    # 数据存储位置
logpath = /usr/local/mongodb/log/mongodb.log    # 日志存储位置

配置环境变量:
[[email protected]192.168.118.16 /usr/local/mongodb]#cat /etc/profile.d/mongodb.sh
#!/bin/bash
# Author:hukey
export PATH=/usr/local/mongodb/bin:$PATH
[[email protected]192.168.118.16 /usr/local/mongodb]#source /etc/profile.d/mongodb.sh

启动:
[[email protected]192.168.118.16 ~]#mongod -f /usr/local/mongodb/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 14553
child process started successfully, parent exiting

连接 mongodb
[[email protected]192.168.118.16 ~]#mongo 192.168.118.16

> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB

3. 权限控制

首先对mongodb权限认证有个了解:

mongodb - 内置角色:
Built-In Roles(内置角色):
    1. 数据库用户角色:read、readWrite;
    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
    4. 备份恢复角色:backup、restore;
    5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超级用户角色:root
    // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
    7. 内部角色:__system
具体角色:
	Read:允许用户读取指定数据库
	readWrite:允许用户读写指定数据库
	dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
	userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
	clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
	readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
	readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
	userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
	dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
	root:只在admin数据库中可用。超级账号,超级权限

首先,在默认没有开启认证(auth)的前提下,创建一个管理用户的管理员账号,即:账号管理的授权权限

[[email protected]192.168.118.16 ~]#mongod -f /usr/local/mongodb/conf/mongod.conf
[[email protected]192.168.118.16 ~]#mongo 192.168.118.16
> use admin
switched to db admin
> db.createUser({user: ‘dba‘, pwd: ‘dba‘, roles: [{role: ‘userAdminAnyDatabase‘, db: ‘admin‘}]})
Successfully added user: {
    "user" : "dba",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

查看创建的用户
> show users
{
    "_id" : "admin.dba",
    "user" : "dba",
    "db" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

这样就建立了一个 userAdminAnyDatabase 角色,用来管理用户,可以通过这个角色来创建、删除用户。

添加 auth 并启动 mongodb

[[email protected]192.168.118.16 ~]#mongod -f /usr/local/mongodb/conf/mongod.conf --shutdown
[[email protected]192.168.118.16 ~]#mongod -f /usr/local/mongodb/conf/mongod.conf --auth
[[email protected]192.168.118.16 ~]#mongo 192.168.118.16
开启 auth 如果没有验证,导致报错
> show dbs
2020-03-16T11:48:42.045+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "there are no users authenticated",
    "code" : 13,
    "codeName" : "Unauthorized"
} :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/mongo.js:67:1
[email protected]/mongo/shell/utils.js:860:19
[email protected]/mongo/shell/utils.js:750:15
@(shellhelp2):1:1

验证,因为是在 admin 下添加的账号,所以需要在 admin 库下验证。
> use admin
switched to db admin
> db.auth(‘dba‘, ‘dba‘)
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

创建只读用户

> use test
> db.createUser({user:‘rr‘, pwd: ‘123‘, roles:[{role: ‘read‘, db: ‘test‘}]})
Successfully added user: {
    "user" : "rr",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}

创建读写用户

> use test
> db.createUser({user:‘ww‘, pwd: ‘123‘, roles:[{role: ‘readWrite‘, db: ‘test‘}]})
Successfully added user: {
    "user" : "ww",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        }
    ]
}

查看当前库下所有用户

> use test
switched to db test
> show users
{
    "_id" : "test.rr",
    "user" : "rr",
    "db" : "test",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
{
    "_id" : "test.ww",
    "user" : "ww",
    "db" : "test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        }
    ]
}

上面添加了两个用户,验证一下,首先使用 读写用户登录: ww/123

> use test
switched to db test
> db.auth(‘ww‘,‘123‘)
1
> db.abc.insert({‘a‘:1, ‘b‘:2})
WriteResult({ "nInserted" : 1 })
> db.abc.find()
{ "_id" : ObjectId("5e6ef903f055137c529de0d8"), "a" : 1, "b" : 2 }

ww/123 用户只能在 test 库中执行读写操作,无法执行其他任何操作。
> show dbs
2020-03-16T11:57:18.503+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0, lsid: { id: UUID(\"e73be962-001c-4896-967d-4d3a5ecbd64f\") }, $db: \"admin\" }",
    "code" : 13,
    "codeName" : "Unauthorized"
} :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/mongo.js:67:1
[email protected]/mongo/shell/utils.js:860:19
[email protected]/mongo/shell/utils.js:750:15
@(shellhelp2):1:1

读用户:rr/123

> use test
switched to db test
> db.auth(‘rr‘,‘123‘)
1
> db.abc.find()
{ "_id" : ObjectId("5e6ef903f055137c529de0d8"), "a" : 1, "b" : 2 }

当只读用户执行写操作时,会发生没有授权的错误。
> db.abc.insert({‘aa‘:11,‘bb‘:22})
WriteResult({
    "writeError" : {
        "code" : 13,
        "errmsg" : "not authorized on test to execute command { insert: \"abc\", ordered: true, lsid: { id: UUID(\"30ef763c-d883-4793-8a16-2dbcd13b648e\") }, $db: \"test\" }"
    }
})

通过上面的操作,发现某个用户只能在某个库下执行操作,如果需要有夸库操作等,就显得非常不方便。

上面的问题可以通过角色以下权限解决:
	readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
	readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

创建对所有库只读的权限

> use admin
switched to db admin
> db.auth(‘dba‘,‘dba‘)
1
> db.createUser({user:‘anyrr‘, pwd:‘123‘, roles:[{role: ‘readAnyDatabase‘, db: ‘admin‘}]})
Successfully added user: {
    "user" : "anyrr",
    "roles" : [
        {
            "role" : "readAnyDatabase",
            "db" : "admin"
        }
    ]
}

验证:在哪个库下创建就需要在哪里去验证

> use admin
switched to db admin
> db.auth(‘anyrr‘,‘123‘)
1
> show dbs;
admin   0.000GB
beta    0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> use test
switched to db test
> db.abc.find()
{ "_id" : ObjectId("5e6ef903f055137c529de0d8"), "a" : 1, "b" : 2 }
> use beta
switched to db beta
> db.abc.find()
{ "_id" : ObjectId("5e6efbd8276c4a4cf5aa3f3c"), "aaa" : 111, "bbb" : 222 }

尝试写入数据,因为没有写入权限。
> db.abc.insert({"aaac" : 111, "bbbc" : 222})
WriteResult({
    "writeError" : {
        "code" : 13,
        "errmsg" : "not authorized on beta to execute command { insert: \"abc\", ordered: true, lsid: { id: UUID(\"1348e445-d00e-434c-89c9-f363df619855\") }, $db: \"beta\" }"
    }
})

创建对所有库读写的权限

> use admin
switched to db admin
> db.auth(‘dba‘,‘dba‘)
> db.createUser({user:‘anyrw‘, pwd:‘123‘, roles:[{role: ‘readWriteAnyDatabase‘, db:‘admin‘}]})
Successfully added user: {
    "user" : "anyrw",
    "roles" : [
        {
            "role" : "readWriteAnyDatabase",
            "db" : "admin"
        }
    ]
}

验证对所有库的读写权限
> use admin
switched to db admin
> db.auth(‘anyrw‘, ‘123‘)
1
> show dbs
admin   0.000GB
beta    0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> use test
switched to db test
> db.abc.insert({‘x‘: 123, ‘y‘:345})
WriteResult({ "nInserted" : 1 })
> db.abc.find()
{ "_id" : ObjectId("5e6ef903f055137c529de0d8"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("5e6f106ff60792da65189693"), "x" : 123, "y" : 345 }
> use beta
switched to db beta
> db.abc.insert({‘x‘: 123, ‘y‘:345})
WriteResult({ "nInserted" : 1 })
> db.abc.find()
{ "_id" : ObjectId("5e6efbd8276c4a4cf5aa3f3c"), "aaa" : 111, "bbb" : 222 }
{ "_id" : ObjectId("5e6f1080f60792da65189694"), "x" : 123, "y" : 345 }

在 mongodb 中有一个类似 MySQL root 的权限,能够对mongodb做所有权限的操作

创建 root 权限:
> db.createUser({user: ‘root‘, pwd:‘123‘, roles:[{role: ‘root‘, db: ‘admin‘}]})
Successfully added user: {
    "user" : "root",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}

验证:
> use admin
switched to db admin
> db.auth(‘root‘,‘123‘)
1
> show dbs;    # 查看所有库
admin   0.000GB
beta    0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> use test
switched to db test
> db.abc.find()    # 查看某一个库
{ "_id" : ObjectId("5e6ef903f055137c529de0d8"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("5e6f106ff60792da65189693"), "x" : 123, "y" : 345 }
> db.drop
db.dropAllRoles(  db.dropAllUsers(  db.dropDatabase(  db.dropRole(      db.dropUser(
> use beta
switched to db beta
> db.abc.find()
{ "_id" : ObjectId("5e6efbd8276c4a4cf5aa3f3c"), "aaa" : 111, "bbb" : 222 }
{ "_id" : ObjectId("5e6f1080f60792da65189694"), "x" : 123, "y" : 345 }
> db.dropDatabase()    # 删除某个库
{ "dropped" : "beta", "ok" : 1 }
> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

> use test
switched to db test
> show users # 查看 test 库的用户
{
    "_id" : "test.rr",
    "user" : "rr",
    "db" : "test",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
{
    "_id" : "test.ww",
    "user" : "ww",
    "db" : "test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        }
    ]
}

> db.dropUser(‘rr‘)    # 删除某个库下的用户
true
> show users
{
    "_id" : "test.ww",
    "user" : "ww",
    "db" : "test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        }
    ]
}

通过上面 root 用户的验证,root权限非常高,慎用!

4.总结

1. 首先在默认没有auth参数的启动下创建管理用户权限的用户,以后添加管理删除用户都使用这个用户操作

db.createUser({user: ‘dba‘, pwd: ‘dba‘, roles: [{role: ‘userAdminAnyDatabase‘, db: ‘admin‘}]})

2. 为mognodb 添加认证参数并重启生效

关闭mongodb:
mongod -f mognod.conf --shutdown

命令行开启认证服务
mongod -f mongod.conf --auth

配置文件开启认证服务
auth on
如果是yaml格式则添加
security:
  authorization: enabled

3. 权限控制

Read:对某个库的读权限;
use 库名
db.createUser({user:‘rr‘, pwd: ‘123‘, roles:[{role: ‘read‘, db: ‘库名‘}]})

ReadWrite:对某个库的读写权限;
use 库名
db.createUser({user:‘ww‘, pwd: ‘123‘, roles:[{role: ‘readWrite‘, db: ‘库名‘}]})

readAnyDatabase:对所有库的读权限;
use admin
db.createUser({user:‘anyrr‘, pwd:‘123‘, roles:[{role: ‘readAnyDatabase‘, db: ‘admin‘}]})

readWriteAnyDatabase:对所有库的读写权限
use admin
db.createUser({user:‘anyrw‘, pwd:‘123‘, roles:[{role: ‘readWriteAnyDatabase‘, db:‘admin‘}]})

root:开启mongodb最高权限
use admin
db.createUser({user: ‘root‘, pwd:‘123‘, roles:[{role: ‘root‘, db: ‘admin‘}]})

参考链接:

https://www.cnblogs.com/seasonzone/p/9359501.html

原文地址:https://www.cnblogs.com/hukey/p/12503536.html

时间: 2024-10-10 12:51:19

[ MongoDB ] 3.X权限认证控制的相关文章

MongoDB安全及身份认证

前面的话 本文将详细介绍MongoDB安全相关的内容 概述 MongoDB安全主要包括以下4个方面 1.物理隔离 系统不论设计的多么完善,在实施过程中,总会存在一些漏洞.如果能够把不安全的使用方与MongoDB数据库做物理上的隔离,即通过任何手段都不能连接到数据库,这是最安全的防护.但,通常这是不现实的.一些重要的数据可能会保存下来,放置到物理隔离的机房中 2.网络隔离 许多公司的开发机处于内网环境中.即使数据库存在漏洞,外部环境也没有机会利用,因为根本无法访问内网 3.防火墙隔离 可以利用防火

MongDB开启权限认证

在生产环境中MongoDB已经使用有一段时间了,但对于MongoDB的数据存储一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),最近在酷壳网看了一篇技术文章(https://coolshell.cn/?s=从+MONGODB+"赎金事件"+看安全问题&from=timeline&isappinstalled=0)介绍的mongodb未开启权限认证导致数据被黑客窃取,要比特币赎回的事件,考虑到数据安全的原因特地花了一点时间研究了一下,我现在用的版本是Mon

**[权限控制] 利用CI钩子实现权限认证

http://codeigniter.org.cn/forums/thread-10877-1-1.html 一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了,后来仿着jsp firter的方式用CI钩子写了一下,感觉还可以,做个小网站,小应用足够了,没必要搞得太复杂.看到很多人在网上问,这里把我们的方法分享一下,如果你有更好的实现,也请记得分享给我们.^_^ 通常我们后台路径看起来都会像下面这样: http://www.php-chongqing.com

MongoDB学习笔记—权限管理

1.MongoDB权限介绍 a 上篇文章中,我们在Linux下配置了MongoDB环境并且将其设置为服务随机器启动而启动,那么接下来这篇文章我们就来简单说一下MongoDB下对登录用户权限的管理. b  MongoDB安装完成后,默认是不需要输入用户名密码即可登录的,但是往往数据库方面我们会处于安全性的考虑而设置用户名密码,本篇文章主要介绍了MongoDB添加管理员/普通用户的方法. c 在我们使用的关系型数据库中,一般都是含有权限控制的,也就是说配置什么用户访问什么数据库,什么数据表,什么用户

asp.net权限认证:Forms认证

摘要: 明天就除夕了,闲着也是闲着,特地总结一些关于.net下的权限认证的方法. 一.Forms认证示意图 Forms认证即是表单认证,需提供身份id和密码password的进行认证和授权管理. 应该是大家比较熟悉的一种,刚接触.net可能都会学学这个东西. 下面看看他的工作方式: 二.看图太乏味,我准备了一个demo 因为默认首页为:IndexController/Index,这个页面只要一行字 “Index”, 效果图: OK,页面没有做任何权限控制,显示正常. 接下来看看DefaultCo

​web服务目录的访问权限的控制

web服务目录的访问权限的控制 1.确认web服务器已经安装并启动 [[email protected] ~]# ls /usr/local/httpd/ [[email protected] ~]# netstat -utpln |grep 80 tcp        0      0 :::80                       :::*                        LISTEN      73341/httpd 2.设置只允许192.168.100.110访问,

关于如何在你的Web项目中实现对空间数据访问权限的控制(一)

Wednesday, 23 JUNE 近来一直在研究关于如何在我的WebGIS项目中实现对空间数据(已发布在GeoServer上)进行权限管理的问题.虽然到目前为止没能找到一个完美的解决方案,但通过这些天的学习与查阅资料,思路上多少有了一些进展,因此记录下来,做一个简单的小结. 1-GeoServer中的Security模块 GeoServer是一个基于J2EE基础实现的,允许用户共享和编辑地理空间数据的GIS应用服务器.——FROM GeoServer官方介绍. 其实,GeoServer的本质

Restful风格wcf调用4——权限认证

写在前面 在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作.本篇文章将介绍一下,调用restful的权限认证的内容.在调用的接口,为了安全,总会需要对请求进行权限认证的.以防一些非法的操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 Restful风格wcf调用3——Stream 一个例子 在REST WCF中,我们可以利用 HttpHeader 来完成这一目标. 首先我们添加一个校验身份的一个方法. ///

APACHE + LDAP 的权限认证配置方法

原文地址:http://www.chinaunix.net/jh/49/627646.html一.前言     很多朋友希望利用 Apache 通过 LDAP 进行用户认证及权限管理.     通过多次试验,总结出以下方法,与大家共享.          配置思路:对用户通过"组(groups)"进行管理,对于需要权限控制的目录,     则通过"组"进行控制.     参考:         http://www.moocky.net/Manual/apache/