mongodb副本集用户权限设置

时间:2022-03-10 00:39:29

 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等文件

mongodb副本集用户权限设置

从节点1,2先注释auth,keyFile,关闭认证:mongodb副本集用户权限设置

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')进行用户认证才能操作数据库

mongodb副本集用户权限设置

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

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

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

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()    查看所有用户