MongoDB的使用者密碼許可權設定
本人也是按照此文章操作的,但是有些不妥,紅色文字就是我實踐後,需要改正的地方
關於許可權的預設配置
在預設情況下,mongod是監聽在0.0.0.0之上的,任何客戶端都可以直接連線27017,且沒有認證。這樣做的好處是,使用者可以即時上手,不用擔心被一堆配置弄的心煩意亂。然而壞處也是顯而易見,如果直接在公網伺服器上如此搭建MongoDB,那麼所有人都可以直接訪問並修改資料庫資料了。
預設情況下,mongod也是沒有管理員賬戶的。因此除非你在admin資料庫中使用db.addUser()命令添加了管理員帳號,且使用–auth引數啟動mongod,否則在資料庫中任何人都可以無需認證執行所有命令。包括delete和shutdown。
此外,mongod還會預設監聽28017埠,同樣是繫結所有ip。這是一個mongod自帶的web監控介面。從中可以獲取到資料庫當前連線、log、狀態、執行系統等資訊。如果你開啟了–rest引數,甚至可以直接通過web介面查詢資料,執行mongod命令。
其實MongoDB本身有非常詳細的安全配置準則,顯然開發者也是想到了,然而他是將安全的任務推給使用者去解決,這本身的策略就是偏向易用性的,對於安全性,則得靠邊站了。
MongoDB使用者型別
MongoDB的使用者分為兩種,一種是admin使用者,另一種是特定資料庫使用者。admin使用者擁有最高的許可權,而特定資料庫使用者則只能訪問特定的資料庫。當MongoDB的admin庫裡沒有任何使用者的時候,也就是說整個MongoDB沒有一個MongoDB使用者的時候,即便–auth許可權需求打開了,使用者還是可以通過localhost介面進入MongoDB進行使用者設定,否則的話整個MongoDB就完全沒法訪問了。而當這個使用者建立完成之後,之後的使用者登入和操作就需要授權了,不是直接登入就能使用的了。
MongoDB有一個比較奇怪的設定是,即便是一個admin使用者,授權也必須在admin資料庫下進行,而不能在其他資料庫下進行。而授權之後admin使用者就可以在任何資料庫下進行任何操作了。當然資料庫級別的使用者在他自己的資料庫下授權之後是不能到其他資料庫進行操作的。舉例來說:
> use test
> db.auth(“someAdminUser”, password)
操作失敗,提示還沒有在admin資料庫下對afmin使用者進行授權。
開啟認證
修改配置檔案MongoDB.conf
開啟auth的註釋,設定為auth = true
新增管理員
使用命令mongo進入命令列
建立第一個使用者,該使用者需要有使用者管理許可權
這裡設定其角色為root
use admin
db.createUser({user:"admin",pwd:"password",roles:["root"]})
新增的使用者在system.users中
> db.getCollectionNames()
[ "system.indexes", "system.users", "system.version" ]
第一個使用者新增完成後,便需要認證才能繼續新增其他使用者
使用db.auth("admin", "password")認證
新增資料庫使用者
為其他資料庫新增使用者,新增使用者前需要切換到該資料庫
這裡設定其角色為dbOwner
use testdb1
db.createUser({user: "testdb1u1", pwd: "xyz123", roles: [{ role: "dbOwner", db: "testdb1" }]})
檢視使用者
> use admin
switched to db admin
> db.system.users.find()
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "Fdh2ldIW3Aw8Cxz9Dt+96g==", "storedKey" : "zbkfj6ZQH1xwGoOg8JJ6OjtR3Cs=", "serverKey" : "yqkqHABZ64rEeq1X0htOAtUnwFU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "testdb1.testdb1u1", "user" : "testdb1u1", "db" : "testdb1", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "Xxt2uET3jRtAYVigyLUydw==", "storedKey" : "yinLG61nRFzfC+3NtB5p9RR+avM=", "serverKey" : "OX/Pdft7JWJm/g0jg07q49OC4c8=" } }, "roles" : [ { "role" : "dbOwner", "db" : "testdb1" } ] }
(
1、mongovue不能很好支援mongoDB3.x問題:(顯示不出資料,使用者也顯示的有問題)
參考https://my.oschina.net/chiyong/blog/599326
我用的是NoSQL Manager for MongoDB
mongodb預設資料庫角色分類
(1).資料庫使用者角色
針對每一個數據庫進行控制。
read :提供了讀取所有非系統集合,以及系統集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read許可權,以及修改所有非系統集合的和系統集合中的system.js的許可權.
(2).資料庫管理角色
每一個數據庫包含了下面的資料庫管理角色。
dbOwner:該資料庫的所有者,具有該資料庫的全部許可權。
dbAdmin:一些資料庫物件的管理操作,但是沒有資料庫的讀寫許可權。(參考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
userAdmin:為當前使用者建立、修改使用者和角色。擁有userAdmin許可權的使用者可以將該資料庫的任意許可權賦予任意的使用者。
(3).叢集管理許可權
admin資料庫包含了下面的角色,使用者管理整個系統,而非單個數據庫。這些許可權包含了複製集和共享叢集的管理函式。
clusterAdmin:提供了最大的叢集管理功能。相當於clusterManager, clusterMonitor, and hostManager和dropDatabase的許可權組合。
clusterManager:提供了叢集和複製集管理和監控操作。擁有該許可權的使用者可以操作config和local資料庫(即分片和複製功能)
clusterMonitor:僅僅監控叢集和複製集。
hostManager:提供了監控和管理伺服器的許可權,包括shutdown節點,logrotate, repairDatabase等。
備份恢復許可權:admin資料庫中包含了備份恢復資料的角色。包括backup、restore等等。
(4).所有資料庫角色
admin資料庫提供了一個mongod例項中所有資料庫的許可權角色:
readAnyDatabase:具有read每一個數據庫許可權。但是不包括應用到叢集中的資料庫。
readWriteAnyDatabase:具有readWrite每一個數據庫許可權。但是不包括應用到叢集中的資料庫。
userAdminAnyDatabase:具有userAdmin每一個數據庫許可權,但是不包括應用到叢集中的資料庫。
dbAdminAnyDatabase:提供了dbAdmin每一個數據庫許可權,但是不包括應用到叢集中的資料庫。
(5). 超級管理員許可權
root: dbadmin到admin資料庫、useradmin到admin資料庫以及UserAdminAnyDatabase。但它不具有備份恢復、直接操作system.*集合的許可權,但是擁有root許可權的超級使用者可以自己給自己賦予這些許可權。
(6). 備份恢復角色:backup、restore;
(7). 內部角色:__system
針對某個資料庫建立使用者
給mydb建立讀寫許可權的使用者 kerry
use mydb
db.createUser({
... user:'kerry',
... pwd:'123456',
... roles:[
... {role:'readWrite',db:'mydb'}
... ]})
啟動mongodb時候,要加--auth 如何不加--auth預設不需要密碼即可訪問。
D:\Program Files\MongoDB\Server\3.4\bin>mongod.exe --dbpath="D:\Program Files\MongoDB\Server\3.4\data" --logpath="D:\Program Files\MongoDB\Server\3.4\
log\mongo.log" --auth
2017-06-21T11:29:15.515+0800 I CONTROL [main] log file "D:\Program Files\MongoDB\Server\3.4\log\mongo.log" exists; moved to "D:\Program Files\MongoDB
\Server\3.4\log\mongo.log.2017-06-21T03-29-15".
當不輸入使用者密碼連線是報錯如下:做不了任何操作。
D:\Program Files\MongoDB\Server\3.4\bin>mongo.exe
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
> show dbs
2017-06-21T11:32:15.576+0800 E QUERY [main] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
} :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/mongo.js:62:1
[email protected]/mongo/shell/utils.js:755:19
[email protected]/mongo/shell/utils.js:645:15
@(shellhelp2):1:1
正確的連線方式:
D:\Program Files\MongoDB\Server\3.4\bin>mongo mydb -u kerry -p 123456
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/mydb
MongoDB server version: 3.4.1
進入命令列後,只能use mydb自己的庫操作。kerry使用者沒有其他庫的操作許可權。
> show dbs
2017-06-21T11:34:26.523+0800 E QUERY [main] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
} :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/mongo.js:62:1
[email protected]/mongo/shell/utils.js:755:19
[email protected]/mongo/shell/utils.js:645:15
@(shellhelp2):1:1
> use mydb
switched to db mydb
> show tables
data
users
> show tables
data
users
> db.data.find()
{ "_id" : ObjectId("5938e6a24cc242261473547e"), "begintime" : "20170608100000", "endtime" : "
: "1", "response" : [ { "type" : "11", "nub" : "81", "city" : "2" } ] }
{ "_id" : ObjectId("5938e6a34cc242261473547f"), "begintime" : "20170608101000", "endtime" : "
: "1", "response" : [ { "type" : "11", "nub" : "66", "city" : "2" } ] }
---------------------
更換埠
詳見:http://blog.csdn.net/pgwindwind/article/details/8005262
比如要改變MongoDB的預設埠,則可以這樣使用--port引數:
開啟cmd,在mongodb路徑的bin目錄下,執行mongod --port 50107 --dbpath d:\work\data\mongodb\db --auth
這樣訪問MongoDB就是以50107的埠訪問了