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"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:755:19
shellHelper@src/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"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:755:19
shellHelper@src/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的端口訪問了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章