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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM