MongoDB3.X单机及shading cluster集群的权限管理(基于3.4.5)
mongodb集群的权限管理分为两部分,一部分是最常用的Role-Based Access Control,也就是用户名密码方式,这种验证方式一般出现在单机系统,或者集群中client端连接Mongos端;另一种是Internal Authentication.有英文基础想获取security完整信息的请点击访问官方文档。
1、Role-Based Access Control
官方文档上介绍如下:MongoDB采用基于角色的访问控制(RBAC)来管理对MongoDB系统的访问。 授予用户一个或多个角色,以确定用户对数据库资源和操作的访问。 在角色分配之外,用户无法访问系统。(不得不说。。google翻译做的不错,这一段翻出来竟然毫无违和感)。
RBAC通过角色来赋予用户权限,在开启权限管理之前,个人建议先创建几个用户,至少要有一个拥有用户管理权限的角色存在。在mongodb中,系统自带了若干角色:
库使用权限:read, readWrite
库管理权限:dbAdmin, dbOwner, userAdmin
集群管理权限:clusterAdmin, clusterManager, clusterMonitor, hostManager
备份恢复权限:backup, restore
全局权限:readAnyDatabase, readWriteAnyDatabase, userAdminAnyDatabase, dbAdminAnyDatabase
超级用户:root,__system(包含所有权限官方不建议使用)
对于使用来讲,建议首先创建一个包含全局权限的用户(dbAdmin并不能readwrite),这样在启用权限管理之后便可以通过这个用户来创建其他用户。Mongodb权限管理默认是精确到DB的,如果需要区分一个DB下的不同collection的权限需要自定义role。对用户赋予库使用和库管理权限的时候需要指定库,这样用户会获得此库下的对应权限。对mongodb来讲,在哪个库下创建的用户,就需要每次在创建的库进行认证。所以建议在创建用户的时候,库使用用户和库管理用户在指定库下创建用户。
2、Internal Authentication
这个东西是用来在集群中进行互相认证的,每个Mongo实例在互相访问的过程中会验证彼此的权限,只有满足条件才可以进行数据读写等操作。分为两种方式,一种是Keyfiles,一种是x.509,在普通集群中Keyfiles已经足够了,而且相对比较简单,只需要在每个节点启动的时候指定相同的Keyfile就行。x.509提供了一个SSL/TLS连接,并不常用。
3、开启验证
首先登录单机Mongod或者集群的mongos创建一个有权限的用户:
use admin
db.createUser({
... user: "gaoze",
... pwd: "gaolaoban",
... roles: [
... {role: "clusterAdmin", db: "admin"},
... {role: "readWriteAnyDatabase", db: "admin"},
... {role: "userAdminAnyDatabase", db: "admin"},
... {role: "dbAdminAnyDatabase", db: "admin"}]
... })
我们这个帐号创建在admin库下,用户拥有所有库的读写权限和admin权限,还有用户管理权限及集群管理权限,如果是单机系统可以把clusterAdmin那个删掉。
然后开启认证:
RBAC的认证开启比较简单,如果是单机系统启动的时候加上--auth参数即可,如果是集群的话,在Mongos的配置里加上keyfile文件,Mongos会自动启动认证。
Internal Authentication认证需要创建一个keyfile文件,keyfile文件只能包含base64字符集的字符,位数可以为6到1024位,官方文档给出的创建方式如下:
openssl rand -base64 > <path-to-keyfile>
chmod <path-to-keyfile>
如果不好用可以自己随便找一段文字,转成base64字符集,然后用下面操作生成keyfile文件,记得赋予400或者600权限,否则在启动的时候会报错keyfile too open permissions
touch keyfile
echo "keyfile内容" > keyfile
创建完keyfile文件然后把这个文件分发到每台mongodb的机器上,然后修改配置文件(具体参见上篇构建集群的配置说明):
shard节点:
systemLog:
destination: file
path: "/home/gaoze/platform/logs/mongodb/shardsvr.log"
logAppend: true
storage:
dbPath: "/home/gaoze/platform/data/shardData"
journal:
enabled: true
setParameter:
enableLocalhostAuthBypass:
processManagement:
fork: true
replication:
replSetName: "shardsvr1"
sharding:
clusterRole: "shardsvr"
security:
keyFile: "/home/gaoze/platform/mongodb-3.4.5/keyfile0"
authorization: enabled
config节点:
systemLog:
destination: file
path: "/home/gaoze/platform/logs/mongodb/configsvr.log"
logAppend: true
storage:
dbPath: "/home/gaoze/platform/data/configData"
journal:
enabled: true
setParameter:
enableLocalhostAuthBypass:
processManagement:
fork: true
replication:
replSetName: "configsvr0"
sharding:
clusterRole: "configsvr"
security:
keyFile: "/home/gaoze/platform/mongodb-3.4.5/keyfile0"
authorization: enabled
mongos(可以看到,mongos不必指定security.authorization):
systemLog:
destination: file
path: "/home/gaoze/platform/logs/mongodb/mongos.log"
logAppend: true
net:
bindIp: 192.168.2.48
port:
setParameter:
enableLocalhostAuthBypass:
processManagement:
fork: true
sharding:
configDB: "configsvr0/192.168.2.48:27019,192.168.2.49:27019"
security:
keyFile: "/home/cloud/platform/mongodb-3.4.5/keyfile0"
4、验证下的集群使用
shell登录进去需要进行验证才可以使用集群,简而言之就是:
use admin
db.auth("gaoze", "gaolaoban")
我们在其他库上创建个使用者(在目标库上创建用户!):
use test
db.createUser({user: "rw", pwd: "", roles: [{role: "readWrite", db: "test"}]})
然后我们在test库上使用新用户来进行操作:
use test
db.auth("rw", "")
可以试验我们的新用户是可以读写的。
MongoDB3.X单机及shading cluster集群的权限管理(基于3.4.5)的更多相关文章
- 2、Redis 底层原理:Cluster 集群部署与详解
Redis 简介 Redis 提供数据缓存服务,内部数据都存在内存中,所以访问速度非常快. 早期,Redis 单应用服务亦能满足企业的需求.之后,业务量的上升,单机的读写能力满足不了业务的需求,技术上 ...
- 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!
转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208 版权声明:本文为博主 ...
- Redis Cluster集群知识学习总结
Redis集群解决方案有两个: 1) Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...
- Nodejs【单机】多进程模式集群
Nodejs[单机]多进程模式集群实例: 1.安装:npm install -s cluster 2.服务代码: var debug = require('debug'); var express = ...
- redis cluster 集群畅谈(一)
redis单机在大数据量情况的会出现瓶颈问题,通过redis 主从架构和 哨兵集群结合可以实现99.99% 高可用 .水平扩容支持更高QPS的解决方案. 在大数据量面前,主从架构结合哨兵集群的解决方案 ...
- redis cluster集群的原理
redis集群的概述: 在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有.有一些red ...
- Redis Cluster 集群扩容与收缩
http://blog.csdn.net/men_wen/article/details/72896682 Redis 学习笔记(十五)Redis Cluster 集群扩容与收缩 标签: redis集 ...
- 【原创】强撸基于 .NET 的 Redis Cluster 集群访问组件
Hello 大家好,我是TANZAME,我们又见面了.今天我们来聊聊怎么手撸一个 Redis Cluster 集群客户端,纯手工有干货,您细品. 随着业务增长,线上环境的QPS暴增,自然而然将当前的单 ...
- redis cluster集群中键的分布算法
Redis Cluster Redis Cluster是Redis的作者 Antirez 提供的 Redis 集群方案 —— 官方多机部署方案,每组Redis Cluster是由多个Redis实例组成 ...
随机推荐
- (1.7)mysql profiles分析
mysql profiles分析 作用:记录会话查询SQL所用时间 1.开启 2.使用 [2.1]先使用一个查询 [2.2]然后再运行 show profiles; [2.3]查看执行过程中每个状态和 ...
- ntpdata 同步时间
ntpdate用来同步时间 [root@localhost ~]# yum install -y ntp [root@localhost ~]# ntpdate time.windows.com # ...
- 帝国cms调用相关文章若没有则调取最新文章
前面我们说了帝国cms调用最新文章 利用文字调用标签phomenews,现在我们说下相关文章的调用,如果文章有设置关键词的话可以直接用[!--other.link--]进行调取,现在我们来升级一下,如 ...
- 6个laravel常用目录路径函数
public_path() public_path函数返回public目录的绝对路径:$path = public_path(); base_path() base_path函数返回项目根目录的绝对路 ...
- Finecms模板标签调用小结 方便快速入门
最近接了一个单子客户要求用finecms进行建站,由于也是php代码,也可以直接调用相关函数,所以上手相对比较快,ytkah总结了一些常用的函数方便您快速入门Finecms.一个网站一般由主页.栏目页 ...
- ORACLE环境变量定义.md
export在linux的bash中可以理解为设置环境变量.设置后能够被当前的shell及子shell使用.这些变量的含义有一些有意义,可以查看相应的文档,我给你解释一些我知道的:ORACLE_HOM ...
- 图片在IE8浏览器多一个有边框问题解决办法
最后在网上找了一下答案,IE8浏览器图片多一个有色边框,而Chrome浏览器没有边框的解决办法. 指定img的边框样式: img{border-style:none;}
- Response实例
Response部分方法介绍及实例 客户端浏览器每访问一次web服务器的页面都会提交一次请求,与request对象对应的是response对象,该对象可以用来对客户的请求做出响应,向客户端发送数据.输 ...
- Ext.define细节分析
自己写的其实还是不懂,再看看别人写的吧Extjs4 源码分析系列一 类的创建过程https://www.cnblogs.com/creazyguagua/p/4302864.htmlhttp://ww ...
- jenkins借助winscp传本地文件到远程服务器上
有这样的场景,我们的ftp上都是些重要的资料,所以大家基本只有可看的权限,只有部分管理人员有可读可写的权限,但是jenkins上基本使用的都是ftp的路径,这个时候就存在一些问题,某些开发需要将自己构 ...