• 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 756 > <path-to-keyfile>
    chmod 400 <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: 0
    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: 0
    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: 27017
    setParameter:
       enableLocalhostAuthBypass: 0
    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: "1",    roles: [{role: "readWrite", db: "test"}]})

      然后我们在test库上使用新用户来进行操作:

    use test
    db.auth("rw", "1")

      可以试验我们的新用户是可以读写的。

      

  • 相关阅读:
    vue路由动态过渡效果
    完美解决safari、微信浏览器下拉回弹效果
    从零开始搭建VUE项目
    上传图片(photoClip)
    手机移动端input date placehoder不显示
    evaluate-reverse-polish-notation
    Minimum Depth of Binary Tree
    前端学习02-01分帧的作用
    前端学习02-01表格标签
    前端学习01-07图像地图
  • 原文地址:https://www.cnblogs.com/gaoze/p/7418898.html
Copyright © 2020-2023  润新知