MongoDB3.0.x版本使用者授權配置(單機環境)
MongoDB資料庫預設情況下是沒有做許可權控制的,只要能夠串連所開放的連接埠就能進行訪問,而且擁有root層級的許可權;對於生產環境而言是極不安全的,所以需要建立使用者,進行授權控制。
MongoDB的社區版本中有兩個模組可以控制使用者的訪問:
--auth: 在mongod啟動項中加入--auth,mongodb啟動後,就可以完成授權模組的啟用);
PS:雖然auth模組啟用後本機還能否登陸到資料庫,但是不具備增刪改查的許可權了,所以啟動auth模組之前就應該建立一個超級使用者--keyFile <file>: 主要用於分區叢集與複本集相互之間的授權使用,在單機情況下只要用到auth,如果是在叢集(分區+複本集)環境下,就必須要用到該參數;security.authorization: 在MongoDB 2.6版本開始,mongod/mongos的啟動設定檔增加了YAML格式的寫法,功能更auth是一樣的,後面的操作中,都是採用該格式security.keyFile: 格式與security.authorization相同,功能與--keyFile相同。
[root@fo169 bin]# ./mongoMongoDB shell version: 3.0.7connecting to: testServer has startup warnings:2015-10-29T15:12:14.257+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.2015-10-29T15:12:14.257+0800 I CONTROL [initandlisten]> show dbslocal 0.000GB
在沒有配置的情況下,登入到資料庫後,可以做任何操作。
編寫了一個啟動設定檔:mongodb.conf(檔案中標紅部分就為auth的授權模組)
[root@fo169 bin]# cat mongodb.conf systemLog: destination: file path: "/data/auth/log/mongod.log" logAppend: truestorage: journal: enabled: true dbPath: "/data/auth/db" directoryPerDB: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 4 directoryForIndexes: true journalCompressor: zlib collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: truenet: port: 27017processManagement: fork: truesecurity: authorization: enabled
MongoDB在V3.0版本之後內建了root 角色,也就是結合了readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin4個角色許可權,類似於Oracle的sysdba角色,但是MongoDB的超級管理使用者名稱是可以隨便定義的:
[root@fo169 bin]# ./mongoMongoDB shell version: 3.0.7connecting to: testServer has startup warnings: 2015-10-30T16:24:36.127+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.2015-10-30T16:24:36.127+0800 I CONTROL [initandlisten] > use adminswitched to db admin> db.createUser(... {... user: "ljaiadmin",... pwd: "123456",... roles: [ { role: "root", db: "admin" } ]... }... )Successfully added user: { "user" : "ljaiadmin", "roles" : [ { "role" : "root", "db" : "admin" } ]}
這樣就建立好一個ljaiadmin的超級管理使用者,建立全域使用者或者超級使用者,需要在MongoDB的admin資料庫中建立(在其他庫也可以建立,但是沒有該角色功能),重啟完mongod進程後,接下來做一下許可權的驗證:
[root@fo169 bin]# ./mongoMongoDB shell version: 3.0.7connecting to: test> show dbs (註:此時查看已提示沒有授權執行listDatabases命令了)2015-10-30T16:41:31.131+0800 E QUERY Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13} at Error (<anonymous>) at Mongo.getDBs (src/mongo/shell/mongo.js:47:15) at shellHelper.show (src/mongo/shell/utils.js:630:33) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47> use adminswitched to db admin> db.auth('ljaiadmin','123456') (註:切換到admin使用者進行授權驗證)1> show dbs (註:驗證完成後,就可以讀寫等操作)admin 0.000GBlocal 0.000GBtest100 0.000GBtest2 0.000GB> use test2switched to db test2> show tablestesttest2> db.test2.find(){ "_id" : ObjectId("5632cf116207909a76446af7"), "name" : "1" }> db.test2.drop()true> db.dropDatabase(){ "dropped" : "test2", "ok" : 1 }> show dbsadmin 0.000GBlocal 0.000GBtest100 0.000GB> use test100switched to db test100> db.test111.insert({"test":"test"})WriteResult({ "nInserted" : 1 })> db.test111.find(){ "_id" : ObjectId("56332db373f771b3d95638bb"), "test" : "test" }> use adminswitched to db admin> show users{ "_id" : "admin.ljaiadmin", "user" : "ljaiadmin", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ]}>
用可以對test123資料庫讀寫的rwtest123使用者為例:
> use test123switched to db test123> db.createUser(... {... user: "rwtest123",... pwd: "123456",... roles: [ { role: "readWrite", db: "test123" } ]... }... )Successfully added user: { "user" : "rwtest123", "roles" : [ { "role" : "readWrite", "db" : "test123" } ]}
#所建的rwtest123使用者可以在test123資料庫中進行增刪改查操作,但是其他動作就不行了>db.auth('rwtest123','123456')switched to db test123> db.test123.insert({"test":"test"})WriteResult({ "nInserted" : 1 })> db.test123.find(){ "_id" : ObjectId("563332ebc8a59ae4fe96bbf5"), "test" : "test" }> db.test123.drop()true> use test100switched to db test100> db.test100.find()Error: error: { "$err" : "not authorized for query on test100.test100", "code" : 13 }>
MongoDB資料庫的使用者權限控制許可權還是比較多的,有系統內建的,已經定義好的角色,也可以自己定義角色許可權,需要根據業務需要進行許可權分配:
內建角色的說明(一般內建的角色基本上就可以滿足生產環境需求了):
https://docs.mongodb.org/manual/core/security-built-in-roles/
使用者自行定義角色的說明:
https://docs.mongodb.org/manual/core/security-user-defined-roles/
使用者管理配置的說明
https://docs.mongodb.org/manual/reference/method/#user-management-methods
更多MongoDB相關內容可以看看以下的有用連結:
MongoDB 3.0 正式版發布下載
CentOS編譯安裝MongoDB
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務
MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡
本文永久更新連結地址: