zoukankan      html  css  js  c++  java
  • mongodb副本集用户权限设置

     mongodb副本集用户权限设置 

    用户权限参考文章

    一:先看看MongoDB中用户的角色说明

      read :   数据库的只读权限,包括:

      aggregate,checkShardingIndex,cloneCollectionAsCapped,collStats,count,dataSize,dbHash,dbStats,distinct,filemd5,mapReduce (inline output only.),text (beta feature.)geoNear,geoSearch,geoWalk,group

      readWrite    数据库的读写权限,包括:

          cloneCollection (as the target database.),convertToCapped,create (and to create collections implicitly.),renameCollection (within the same database.)findAndModify,mapReduce (output to a collection.) drop(),dropIndexes,emptycapped,ensureIndex() 

        和read的所有权限

      dbAdmin

        clean,collMod,collStats,compact,convertToCappe create,db.createCollection(),dbStats,drop(),dropIndexes ensureIndex(),indexStats,profile,reIndex renameCollection (within a single database.),validate 

      userAdmin角色:           数据库的用户管理权限

      clusterAdmin角色:

        集群管理权限(副本集、分片、主从等相关管理),包括:

        addShard,closeAllDatabases,connPoolStats,connPoolSync,_cpuProfilerStart_cpuProfilerStop,cursorInfo,diagLogging,dropDatabase 
        shardingState,shutdown,splitChunk,splitVector,split,top,touchresync 
        serverStatus,setParameter,setShardVersion,shardCollection 
        replSetMaintenance,replSetReconfig,replSetStepDown,replSetSyncFrom 
        repairDatabase,replSetFreeze,replSetGetStatus,replSetInitiate 
        logRotate,moveChunk,movePrimary,netstat,removeShard,unsetSharding 
        hostInfo,db.currentOp(),db.killOp(),listDatabases,listShardsgetCmdLineOpts,getLog,getParameter,getShardMap,getShardVersion 
        enableSharding,flushRouterConfig,fsync,db.fsyncUnlock()

      readAnyDatabase:任何数据库的只读权限(和read相似)

      readWriteAnyDatabase:任何数据库的读写权限(和readWrite相似)

      userAdminAnyDatabase:任何数据库用户的管理权限(和userAdmin相似)

      dbAdminAnyDatabase:任何数据库的管理权限(dbAdmin相似)

      __system:  什么权限都有

    创建用户,需要指定用户角色roles

    roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选:

      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数据库中可用。超级账号,超级权限

    二:配置步骤(一般刚配置的conf是没有auth认证的,我的已经配置完成,需要先屏蔽)

    1.先注释conf文件

      主节点mongo.conf文件先注释auth,key等文件

    从节点1,2先注释auth,keyFile,关闭认证:

    2: 创建用户

    现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)

    在主节点服务器上,启动mongo

    > use admin
    switched to db admin
    > db.createUser(
    ...   {
    ...     user: "root",
    ...     pwd: "shgbit",
    ...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    ...   }
    ... )
    Successfully added user: {
        "user" : "root",
        "roles" : [
            {
                "role" : "userAdminAnyDatabase",
                "db" : "admin"
            }
        ]
    }

    在admin库创建了一个高权限的用户root,然后切换到replSetTest数据库,创建一个可读写数据库权限的用户shgbit。

    > use replSetTest
    switched to db replSetTest
    > db.createUser(
    ...   {
    ...     user: "shgbit",
    ...     pwd: "shgbit",
    ...     roles: [ { role: "readWrite", db: "replSetTest" } ]
    ...   }
    ... )
    Successfully added user: {
        "user" : "shgbit",
        "roles" : [
            {
                "role" : "readWrite",
                "db" : "replSetTest"
            }
        ]
    }

     3:创建keyFile文件

    keyFile文件的作用: 集群之间的安全认证,增加安全认证机制KeyFile(开启keyfile认证就默认开启了auth认证了,为了保证后面可以登录,我已创建了用户)

      (1):openssl rand -base64 666 > /root/mongodb/keyfile    

     其中666是文件大小           /root/mongodb/keyfile : 文件存放路径 

      (2):该key的权限必须是600

       chmod 600 /root/mongodb/keyfile  

    注意:创建keyFile前,需要先停掉副本集中所有主从节点的mongod服务(systemctl stop mongodb.service),然后再创建,否则有可能出现服务启动不了的情况。

        mongodb集群有自动切换主库功能,如果先关主库,主库就切换到其它上面去了,这里预防主库变更,从库关闭后再关闭主库

     (3):将主节点中的keyfile文件拷贝到副本集其他从节点服务器中,路径地址对应mongo.conf配置文件中的keyFile字段地址。并设置keyfile权限为600

    4:更新配置mongo.conf

      配置好所有节点的keyFile文件后,打开主节点的mongo.conf配置,取消注释:auth,keyFile,oplogSize;从节点取消keyFile,oplogSize的注释即可,从节点不需要启用auth,然后重新启动所有节点服务(systemctrl start mongodb.service)

    启动mongo默认连接到test,每次都需要使用db.auth('root','shgbit')进行用户认证才能操作数据库

    因为:root账号只赋予了userAdminAnyDatabase权限,在操作rs.config(),rs.status()时,提示没有权限操作:

    Error: Could not retrieve replica set config: {
    "ok" : 0,
    "errmsg" : "not authorized on admin to execute command { replSetGetConfig: 1.0 }",
    "code" : 13
    }

    需要重新赋予副本集的操作权限:

    db.grantRolesToUser( "root" , [ { role: "dbOwner", db: "admin" },{ "role": "clusterAdmin", "db": "admin" },
    { "role": "userAdminAnyDatabase", "db": "admin" },
    { "role": "dbAdminAnyDatabase", "db": "admin" },
    { role: "root", db: "admin" } ])

    加上以上权限后,就可以操作副本集命令,dbOwner可以直接操作其他数据库如replSetTest,不需要重新认证 db.auth('shgbit','shgbit')

     其他操作:


    删除用户
    删除replSetTest库下面的admin用户
    > use replSetTest
    > db.dropUser('admin')


    >use admin
    switched to db admin
    testrepl:PRIMARY> db.system.users.find()    查看所有用户

  • 相关阅读:
    git 常用命令
    重要知识点
    HTML 标记语言
    js类型转换
    伪数组变数组 js
    在 JavaScript 中为什么 typeof null 的结果是 object?
    HTML中href、src区别
    解决for循环插入同一元素无法重复插入问题
    HTML5-语义化
    mount 和 /etc/fstab关系。
  • 原文地址:https://www.cnblogs.com/Joans/p/7724144.html
Copyright © 2011-2022 走看看