mongodb的用戶管理及安全認證


 

1.確認mongodb的版本

> use admin
switched to db admin
> db.runCommand({"buildInfo":1})
{
        "version" : "2.6.6",
        "gitVersion" : "608e8bc319627693b04cc7da29ecc300a5f45a1f",
        "targetMinOS" : "Windows 7/Windows Server 2008 R2",
        "OpenSSLVersion" : "",
        "sysInfo" : "windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_49",
        "loaderFlags" : "/nologo /DEBUG /INCREMENTAL:NO /LARGEADDRESSAWARE",
        "compilerFlags" : "/TP /nologo /EHsc /W3 /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /we4099 /Z7 /errorReport:none /MT /O2 /Oy-",
        "allocator" : "system",
        "versionArray" : [
                2,
                6,
                6,
                0
        ],
        "javascriptEngine" : "V8",
        "bits" : 64,
        "debug" : false,
        "maxBsonObjectSize" : 16777216,
        "ok" : 1
}
>

 

2.啟用安全認證

默認啟動的mongodb是沒有啟用安全認證的,在安裝完成mongodb后想要啟動mongodb的安全認證只需要在啟動mongod的時候增加--auth參數或在配置文件中增加auth=true,例如:

mongod.exe --dbpath=D:\MongoDB2.6\data --auth
mongod.exe --config D:\MongoDB2.6\up\mongodb.conf

 

3.查看圖形界面

mongodb的圖形界面端口號為其監聽端口號加上1000,如我們默認的啟動端口號為27017,那么圖形界面的端口就為28017,當默認啟動mongodb時,訪問28017端口發現會無法訪問,這時只需要在啟動mongod的時候增加--auth參數或在配置文件中增加auth=true就可以正常訪問。

mongod.exe --dbpath=D:\MongoDB2.6\data --rest
mongod.exe --config D:\MongoDB2.6\up\mongodb.conf

 如圖:

 

 

4.創建用戶並驗證認證

> use admin
switched to db admin
> show collections
system.indexes
system.users
system.version
> db.system.users.find()
>

 

經過查詢發現目前庫中沒有任何用戶,現在創建用戶:

> use admin
switched to db admin
> show dbs
admin  0.078GB
local  0.078GB
test   0.078GB
> use mydb
switched to db mydb
> show dbs
admin  0.078GB
local  0.078GB
test   0.078GB
> use mydb
switched to db mydb
> db.book.insert({"name":"english"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin  0.078GB
local  0.078GB
mydb   0.078GB
test   0.078GB

上面的語句我們創建一個數據庫mydb

 

> use admin
switched to db admin
> db.addUser("root","123456")
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
> show collections      --當我們查看集合的時候提示沒有權限
2016-04-28T16:24:50.808+0800 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
> db.auth("root","123456")  --進行用戶驗證后,發現能夠使用后面的命令了
1
> show dbs
admin  0.078GB
local  0.078GB
mydb   0.078GB
test   0.078GB
> show collections
system.indexes
system.users
system.version
> db.system.users.find()   --查詢users集合發現已經有了一個root用戶,且角色為root
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "MONGODB-CR" : "34e5772aa66b703a319641d42a47d696" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
>

以上語句我們在admin庫下創建了一個root用戶。

 

> use mydb     --切換到mydb庫下
switched to db mydb
> db.addUser("livan","livan123")   
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
Successfully added user: { "user" : "livan", "roles" : [ "dbOwner" ] }
> show collections
book
system.indexes
> use admin
switched to db admin
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "MONGODB-CR" : "34e5772aa66b703a319641d42a47d696" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "mydb.livan", "user" : "livan", "db" : "mydb", "credentials" : { "MONGODB-CR" : "231eafd8ebf83e43a61d31fc3b9be671" }, "roles" : [ { "role" : "dbOwner", "db" : "mydb" } ] }
>

以上語句我們切換到mydb下創建了livan用戶,此用戶對用的數據庫為mydb,在admin庫下查詢system.users集合能夠看到livan用戶信息,且對應的角色為dbOwner。

 

 

D:\MongoDB2.6\up>D:\MongoDB2.6\bin\mongo.exe 127.0.0.1:27017
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:27017/test
> use mydb
switched to db mydb
> db.auth("livan","livan123")
1
> show dbs
2016-04-28T16:41:04.434+0800 listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
} at src/mongo/shell/mongo.js:47
> use admin
switched to db admin
> show dbs
2016-04-28T16:41:11.915+0800 listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
} at src/mongo/shell/mongo.js:47
> show collections
2016-04-28T16:41:34.197+0800 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
> db.system.users.find()
error: { "$err" : "not authorized for query on admin.system.users", "code" : 13 }
> use mydb
switched to db mydb
> show dbs
2016-04-28T16:42:03.305+0800 listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
} at src/mongo/shell/mongo.js:47
> show collections
book
system.indexes
>
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "mydb.book" }
> db.book.find()
{ "_id" : ObjectId("5721c7e579d5865b3c50facd"), "name" : "english" }
>

以上語句可以看到當使用livan用戶進行驗證時,是能夠切換到admin庫,但用不了show dbs,show collections等命令,更不能到查詢system.users集合,當切換回mydb庫時,
使用不了show dbs命令,但show collections命令能夠使用,且能夠正常訪問mydb下的集合。

 

D:\MongoDB2.6\up>D:\MongoDB2.6\bin\mongo.exe 127.0.0.1:27017
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:27017/test
> use admin
switched to db admin
> db.auth("root","123456")
1
> show dbs
admin  0.078GB
local  0.078GB
mydb   0.078GB
test   0.078GB
> show collections
system.indexes
system.users
system.version
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "MONGODB-CR" : "34e5772aa66b703a319641d42a47d696" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "mydb.livan", "user" : "livan", "db" : "mydb", "credentials" : { "MONGODB-CR" : "231eafd8ebf83e43a61d31fc3b9be671" }, "roles" : [ { "role" : "dbOwner", "db" : "mydb" } ] }
> use mydb
switched to db mydb
> show dbs
admin  0.078GB
local  0.078GB
mydb   0.078GB
test   0.078GB
> show collections
book
system.indexes
> db.book.find()
{ "_id" : ObjectId("5721c7e579d5865b3c50facd"), "name" : "english" }
> db.system.indexes()
2016-04-28T16:48:15.946+0800 TypeError: Property 'indexes' of object mydb.system is not a function
>

以上語句是使用root用戶進行登錄測試,root用戶可以執行所有操作命令,且能夠正常訪問其他數據庫集合,這是因為mongodb在admin庫中認證的用戶都為管理員用戶,
非admin數據庫的用戶不能使用數據庫命令,只能訪問本數據庫的集合。

 

5.其他創建用戶命令

在上面的測試中發現使用db.addUser()創建用戶是系統會給出一個警告,提示我們用createUser 創建用戶,如下:

 

> db.addUser("livan","livan123")   
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
Successfully added user: { "user" : "livan", "roles" : [ "dbOwner" ] }

 

對於db.createUser()的用法可參考 http://debugo.com/mongo-auth/?utm_source=tuicool&utm_medium=referral

db.createUser()用法:

db.createUser(user, writeConcern)
user 關於用戶的身份認證和訪問信息(JSON);
writeConcern 這個文檔描述保證MongoDB提供寫操作的成功報告。

 

user文檔的形式:

{ user: "<name>",
  pwd: "<cleartext password>",
  customData: { <any information> },
  roles: [
    { role: "<role>", db: "<database>" } | "<role>",
    ...
  ]
}

user字段,用戶的名字;
pwd字段,用戶的密碼;
cusomData字段,為任意內容,例如可以為用戶全名介紹;
roles字段,指定用戶的角色,可以用一個空數組給新用戶設定空角色; roles 字段,可以指定內置角色和用戶定義的角色。

 

示例創建一個管理員,直接給幾個所有數據庫權限即可:

db.createUser({
user:"test",
pwd:"test.com",
roles:
[ 
  {
    role:"userAdminAnyDatabase",
    db:"admin"
  },
  {
    role:"readWriteAnyDatabase",
    db:"admin"
  },
  {
    role:"dbAdminAnyDatabase",
    db:"admin"
  }
]})

 

示例創建某個用戶對數據庫只賦予只讀權限:

db.createUser({
user:"test",
pwd:"test.com",
roles:
[ 
  {
    role:"read",
    db:"test"
  }
]

 

以上創建的用戶,我們可以通過 db.auth("username","password") 或者mongo -u test -p test.com --authenticationDatabase test 來驗證。

 

 

6.mongodb的常用角色

MongoDB提供了很多內建角色,用戶通用的數據庫管理。內建角色的文檔在這里http://docs.mongodb.org/manual/reference/built-in-roles/
MongoDB提供了數據庫管理權限和數據庫用戶權限兩種類型,其他的權限只能作用於admin數據庫上。具體如下:

 

(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 hostManagerdropDatabase的權限組合。
clusterManager:提供了集群和復制集管理和監控操作。擁有該權限的用戶可以操作configlocal數據庫(即分片和復制功能)
clusterMonitor:僅僅監控集群和復制集。
hostManager:提供了監控和管理服務器的權限,包括shutdown節點,logrotate, repairDatabase等。
備份恢復權限:admin數據庫中包含了備份恢復數據的角色。包括backup、restore等等。

 

(4).所有數據庫角色

admin數據庫提供了一個mongod實例中所有數據庫的權限角色:
readAnyDatabase:具有read每一個數據庫權限。但是不包括應用到集群中的數據庫。
readWriteAnyDatabase:具有readWrite每一個數據庫權限。但是不包括應用到集群中的數據庫。
userAdminAnyDatabase:具有userAdmin每一個數據庫權限,但是不包括應用到集群中的數據庫。
dbAdminAnyDatabase:提供了dbAdmin每一個數據庫權限,但是不包括應用到集群中的數據庫。

 

 

(5). 超級管理員權限

root: dbadminadmin數據庫、useradminadmin數據庫以及UserAdminAnyDatabase。但它不具有備份恢復、直接操作system.*集合的權限,但是擁有root權限的超級用戶可以自己給自己賦予這些權限。

 

 

本文最后部分來源於http://debugo.com/mongo-auth/

 


免責聲明!

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



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