天天看點

mongodb權限管理01

mongodb權限管理基礎概念

概念解釋

1.資料庫使用者角色

read:該角色擁有資料的隻讀權限,系統集合以及system.indexes,system.js,system.namespaces集合除外。

readWrite:該角色擁有對應資料庫的讀寫權限,系統集合和system.js集合除外。

2.資料庫管理角色

dbAdmin:該角色擁有指定資料庫資料庫管理權限,包括 system.indexes, system.namespaces, system.profile集合的操作權限。該角色不擁有所有非系統集合的讀權限。

dbOwner:該角色擁有指定資料庫的所有權限,該角色包括:readWrite、dbAdmin、userAdmin。

userAdmin:該角色擁有指定資料庫使用者和角色的管理權限。包括建立使用者等。

3.群集管理角色

clusterAdmin:該角色擁有群集的所有權限。該角色包含clusterManager,clusterMonitor,hostManager 角色權限。同時還要删除資料庫的權限。

clusterManager:該角色擁有群集的管理和監控權限,包括對local、config資料庫的通路權限。同時該角色擁有分片和複制集的管理權限。

clusterMonitor:該角色擁有群集的監控權限。

hostManager:該角色擁有群集的監控和服務管理權限。

//注意:這些角色隻能在Admin資料庫下建立

4.備份還原角色

backup:該角色擁有備份資料的權限。

restore:該角色擁有還原備份資料的權限。

5.所有資料庫角色

該分類下面的角色權限和資料庫角色權限一樣,差別在于它擁有的是所有資料庫的權限而不是指定資料庫下的權限。但是不擁有system.*相關集合、local、config資料庫的權限。

readAnyDatabase

readWriteAnyDatabase

userAdminAnyDatabase

dbAdminAnyDatabase

6.超級權限角色

root:該角色擁有所有權限,該角色包含readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin roles, restore, and backup角色。

注意:該角色隻能在建立在Admin庫中

7.内部角色

__system:該角色為系統内部角色,比如複制內建員、mongos使用。

參考連結:我們需要整理小結一下,整個流程

MongoDB 4.X 使用者和角色權限管理總結

https://www.cnblogs.com/dbabd/p/10811523.html

//完全參照此連結 可行

小結如下:

1、謹記:先在不開啟認證的情況下,建立使用者,之後關閉服務,然後再開啟認證,才生效。

2、我們正常的搭建mongodb,然後在建立自定義角色

(在admin資料庫中建立自定義使用者dbabd,對集合city有find,update權限,對集合user_operation隻有find權限。)

//我的猜想,我們可以不建立這個 後面進行驗證

3、使用者,必須先建立“建立使用者管理的使用者”

//啟用通路控制登入之前,首先需要在admin資料庫中建立角色為userAdmin或userAdminAnyDatabase作為使用者管理的使用者,之後才能通過這個使用者建立其它角色的使用者,這個使用者作為其它所有使用者的管理者。

4、開啟通路控制,在這裡我們在啟動 mongodb的時候加上--auth (注意,我們在配置檔案中加auth=true的時候沒有成功)

//[root@prd3-mysql-0-36 ~]# mongod -f /ivargo/app/mongodb/conf/mongo.conf --auth

5、使用者管理使用者驗證 可以使用我們建立的管理使用者的使用者去登入 ,在這裡就是user_admin 這個使用者去登入

//可以了解為 是目前mongodb的最高權限者

6、接下來,才是建立一個普通使用者,給他某個庫的可讀,可寫的權限

//也就是說,必須要自己先建立一個管理普通使用者的使用者,然後在登入到這個管理使用者的使用者下 去建立文明想要建立的使用者。

7、建立好了普通使用者,之後,就是為使用者添加角色(我的了解,角色就是權限的意思)

比如 為使用者dbabd_user添加dbabd資料庫的read角色(權限)。

接下來,我們可以根據我寫的小結,再次的實驗一次

上面的測試中建立管理使用者使用者名 的角色為 userAdminAnyDatabase 他的權限配置設定為:可以在指定資料庫建立和修改使用者(除了資料庫config和local之外)。

如果是root的角色的話,那麼就是超級最大的權限 ,我們下面試一下,最高的root權限

// 建立管理使用者使用者名為user_admin,密碼admin

db.createUser(

{

user: "user_admin",

pwd: "admin",

roles: [{ role: "userAdminAnyDatabase", db: "admin" }]

}

)

//總結

use admin switched to db admin db.system.users.find() { "_id" : "admin.user_admin", "user" : "user_admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "YVnHB6u4l4kxyVkAG9h6bQ==", "storedKey" : "u0bVa7oIMBQpyD8vzv9HQHAHBGk=", "serverKey" : "XE9j9YQKKWi8/1CdXchLWILs6Ds=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "q1riE6iDxYrY3ROeVAw59q8DXg47B5DeGxtw6w==", "storedKey" : "OVbdZPfC7CsmHGZKKiW2jH50cqMgPX8OfTgfcTg3MXM=", "serverKey" : "0TjC2lObSJ7lmzwTMNXWWeG6leHLpzK9n+VReDUrKEs=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } { "_id" : "admin.dbabd_user", "user" : "dbabd_user", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "Uvls4hIsjxHctMK8etQRQA==", "storedKey" : "/KAF4Zl7nOmeMEy+UBnpLVNPhvw=", "serverKey" : "/g85OaGcrfWAfisbllqAdqjUTP8=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "vCoqeEVfao5T6Rv6dMlw7J6zDFU0KoqDjRxXyA==", "storedKey" : "IL1NENjImUYXiRuxxSA3uz4ein8OPNx/VJZVag0BcV0=", "serverKey" : "GCRyzJ8siZEgAL6qURfuY4GQn7VYz4+o2PmtmT4rqmc=" } }, "customData" : { "info" : "user for dbabd" }, "roles" : [ { "role" : "read", "db" : "dbabd" }, { "role" : "dbabd", "db" : "admin" }, { "role" : "read", "db" : "admin" } ] } show users; "_id" : "admin.dbabd_user", "user" : "dbabd_user", //這是建立的普通的使用者 "db" : "admin", "customData" : { "info" : "user for dbabd" }, "roles" : [ "role" : "read", //角色為隻讀 "db" : "dbabd" //針對dbadb這個資料庫 "role" : "dbabd", //這個角色是我們自己建立自定義的角色 dbabd "db" : "admin" "role" : "read", ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] "_id" : "admin.user_admin", //管理普通使用者的使用者 "user" : "user_admin", "role" : "userAdminAnyDatabase",

自定義實驗 ***** 很重要,看完 https://www.cnblogs.com/dbabd/p/10811523.html 給自己出的題目 很重要

題目為:

在mongodb中需要先建立一個 管理使用者的使用者 vargo 密碼為 vargo123 配置設定給他的權限為root

在建立一個majihui的普通使用者 密碼為 majihui123 隻對 dbabd這個庫有隻讀的權限

為了保持實驗的可靠性,請重新安裝mongodb 完全幹淨的進行實驗

我們來驗證一下

[root@prd3-mysql-0-36 ~]# mongo

MongoDB shell version v4.0.2

connecting to: mongodb://127.0.0.1:27017

MongoDB server version: 4.0.2

db.auWarning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus db.auth('majihui','majihui123') 1 show dbs; dbabd 0.000GB use dbabd; switched to db dbabd show collections; city user_operation db.city.find(); { "_id" : ObjectId("5ce27f0484dc5c8b35081590"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5ce27f1184dc5c8b35081591"), "title" : "redis 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5ce27f1784dc5c8b35081592"), "title" : "mysql 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } db.user_operation.count(); //我們接下來 去嘗試的插入一個資料試一下 db.user_operation.insert({title: 'majihui 教程', description: 'MongoDB 是一個 Nosql 資料庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 300 }) 實際操作 ... description: 'MongoDB 是一個 Nosql 資料庫', ... by: '菜鳥教程', ... url: 'http://www.runoob.com', ... tags: ['mongodb', 'database', 'NoSQL'], ... likes: 300 ... }) WriteCommandError({ "ok" : 0, "errmsg" : "not authorized on dbabd to execute command { insert: \"user_operation\", ordered: true, lsid: { id: UUID(\"441b14ee-ab6e-44c3-9b23-7640ceeb6b1f\") }, $db: \"dbabd\" }", "code" : 13, "codeName" : "Unauthorized" 出現報錯,正确 //我們接下來嘗試的去删除一個文檔 db.user_operation.find(); { "_id" : ObjectId("5ce27f4684dc5c8b35081593"), "title" : "mysql 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } db.user_operation.deleteMany( title : "mysql 教程"); 2019-05-21T14:04:45.765+0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell):1:36 //報錯,無法删除,對了