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