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)的更多相关文章

  1. 2、Redis 底层原理:Cluster 集群部署与详解

    Redis 简介 Redis 提供数据缓存服务,内部数据都存在内存中,所以访问速度非常快. 早期,Redis 单应用服务亦能满足企业的需求.之后,业务量的上升,单机的读写能力满足不了业务的需求,技术上 ...

  2. 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!

    转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208  版权声明:本文为博主 ...

  3. Redis Cluster集群知识学习总结

    Redis集群解决方案有两个: 1)  Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...

  4. Nodejs【单机】多进程模式集群

    Nodejs[单机]多进程模式集群实例: 1.安装:npm install -s cluster 2.服务代码: var debug = require('debug'); var express = ...

  5. redis cluster 集群畅谈(一)

    redis单机在大数据量情况的会出现瓶颈问题,通过redis 主从架构和 哨兵集群结合可以实现99.99% 高可用 .水平扩容支持更高QPS的解决方案. 在大数据量面前,主从架构结合哨兵集群的解决方案 ...

  6. redis cluster集群的原理

    redis集群的概述: 在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有.有一些red ...

  7. Redis Cluster 集群扩容与收缩

    http://blog.csdn.net/men_wen/article/details/72896682 Redis 学习笔记(十五)Redis Cluster 集群扩容与收缩 标签: redis集 ...

  8. 【原创】强撸基于 .NET 的 Redis Cluster 集群访问组件

    Hello 大家好,我是TANZAME,我们又见面了.今天我们来聊聊怎么手撸一个 Redis Cluster 集群客户端,纯手工有干货,您细品. 随着业务增长,线上环境的QPS暴增,自然而然将当前的单 ...

  9. redis cluster集群中键的分布算法

    Redis Cluster Redis Cluster是Redis的作者 Antirez 提供的 Redis 集群方案 —— 官方多机部署方案,每组Redis Cluster是由多个Redis实例组成 ...

随机推荐

  1. opencv手工编译

    opencv手工编译方法1.下载cmake gui2.在where is the source code路径下配置opencv根目录,在where to build the binaries路径下配置 ...

  2. SQL SERVER 基于数据库镜像的主从同步(数据库镜像实践汇总)

    SQL SERVER 基于数据库镜像的主从同步 Author:chaoqun.guo    createtime:2019-03-26 目录 SQL SERVER 基于数据库镜像的主从同步... 1 ...

  3. jmeter报错:响应数据HTTP Status 500 & 后台日志Typed variable declaration : Object constructor

    今天在测试文件下载接口,发现在测试单个文件下载1次时,文件成功下载.但是在测试单个文件并发下载50次时,Jmeter报错了,后台服务器tomcat竟然没有发现报错信息. Jmeter响应信息报错: H ...

  4. Linux发展历程

    阅读内容 一.linux基础 二.linux发展史 三.linux图形界面 回到顶部 一.linux基础 1.操作系统的分类 1.1 Windows 系统 优点:Windows 用户群体大:应用软件多 ...

  5. log4j。日志输出

    log4j.rootLogger = debug , stdout , D , E log4j.appender.stdout = org.apache.log4j.ConsoleAppender l ...

  6. Sublime Text 许可证

    ----- BEGIN LICENSE Alexander Single User License EA7E- 51F47F09 4EAB1285 7827EFF0 8B1207DC A76A6EA3 ...

  7. Java通过jxl读取Excel

    package com.hd.all.test.testjava; import java.io.File; import java.io.IOException; import java.util. ...

  8. JS 8-1 OOP概念与继承

    function Foo(){ this.y=2; } typeof Foo.prototype; Foo.prototype.x = 1; var obj3= new Foo(); obj3.x; ...

  9. git push 报错:you are not allowed to upload merges

    git rebase Cannot rebase: You have unstaged changes. git stash # 每次 push 前 git pull --rebase git pus ...

  10. 大数据工具比较:R 语言和 Spark 谁更胜一筹?

    本文有两重目的,一是在性能方面快速对比下R语言和Spark,二是想向大家介绍下Spark的机器学习库 背景介绍 由于R语言本身是单线程的,所以可能从性能方面对比Spark和R并不是很明智的做法.即使这 ...