1. 程式人生 > >MongoDB 基礎安全性(許可權操作)

MongoDB 基礎安全性(許可權操作)

和其他所有資料庫一樣,許可權的管理都差不多一樣。mongodb儲存所有的使用者資訊在admin 資料庫的集合system.users中,儲存使用者名稱、密碼和資料庫資訊。mongodb預設不啟用授權認證,只要能連線到該伺服器,就可連線到mongod。若要啟用安全認證,需要更改配置檔案引數auth。

以下測試理解

檢視資料庫:

> show dbs

發現 admin 竟然沒有!~

找了好久,找不到相關說明,於是直接建立使用者admin

  1. use admin

  2. db.createUser(

  3. {

  4. user: "admin",

  5. pwd: "admin",

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

  7. }

  8. )

成功建立,再查詢admin中的集合,有資料了!

  1. > show collections

  2. system.indexes

  3. system.users

  4. system.version


檢視3個集合的資訊:

  1. > db.system.users.find();

  2. { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "cFISfpbm04pmIFpqiL340g==", "storedKey" : "WG1DSEEEHUZUBjsjsnEA4RFVY2M=", "serverKey" : "9Lm+IX6l9kfaE/4C25/ghsQpDkE=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }

  3. >

  4. > db.system.indexes.find();

  5. { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "admin.system.version" }

  6. { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "admin.system.users" }

  7. { "v" : 1, "unique" : true, "key" : { "user" : 1, "db" : 1 }, "name" : "user_1_db_1", "ns" : "admin.system.users" }

  8. >

  9. > db.system.version.find();

  10. { "_id" : "authSchema", "currentVersion" : 5 }

  11. >


現在啟用 auth:
[[email protected] ~]# vi /etc/mongod.conf

auth=true


重啟 mongod 服務:

[[email protected] ~]# service mongod restart

直接預設登入,檢視集合,發現無權操作了:

[[email protected] ~]# mongo

  1. [[email protected] ~]# mongo

  2. MongoDB shell version: 3.0.2

  3. connecting to: test

  4. > show dbs

  5. 2015-05-09T21:57:03.176-0700 E QUERY Error: listDatabases failed:{

  6. "ok" : 0,

  7. "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",

  8. "code" : 13

  9. }

  10. at Error (<anonymous>)

  11. at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)

  12. at shellHelper.show (src/mongo/shell/utils.js:630:33)

  13. at shellHelper (src/mongo/shell/utils.js:524:36)

  14. at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47

  15. >

剛才在資料庫 admin 建立了一個賬戶 admin ,先到資料admin進來連線(其他db則失敗):

  1. [[email protected] ~]# mongo

  2. MongoDB shell version: 3.0.2

  3. connecting to: test

  4. >

  5. > db.auth("admin","admin")

  6. Error: 18 Authentication failed.

  7. 0

  8. > use mydb

  9. switched to db mydb

  10. > db.auth("admin","admin")

  11. Error: 18 Authentication failed.

  12. 0

  13. > use admin

  14. switched to db admin

  15. > db.auth("admin","admin")

  16. 1

  17. >


db.auth("admin","admin") 返回值為1,說明登入成功!~db.auth("admin","admin") 記錄是不存在的,執行完後這一行在shell中不會記錄歷史。

所以現在建立另一個使用者"myuser"

  1. db.createUser(

  2. {

  3. user: "myuser",

  4. pwd: "myuser",

  5. roles: [ { role: "readWrite", db: "mydb" } ]

  6. }

  7. )


也可以增刪角色:

  1. #授予角色:db.grantRolesToUser( "userName" , [ { role: "<role>", db: "<database>" } ])

  2. db.grantRolesToUser( "myuser" , [ { role: "dbOwner", db: "mydb" } ])

  3. #取消角色:db.grantRolesToUser( "userName" , [ { role: "<role>", db: "<database>" } ])

  4. db.revokeRolesFromUser( "myuser" , [ { role: "readWrite", db: "mydb" } ])


因為在admin資料庫建立的,只能在 admin 資料庫中登入:

  1. > db.auth("myuser","myuser")

  2. Error: 18 Authentication failed.

  3. 0

  4. >

  5. > db

  6. mydb

  7. > use admin

  8. switched to db admin

  9. > db.auth("myuser","myuser");

  10. 1

  11. >


此時是可以切換到所在的資料庫進行相關操作:

  1. > use mydb

  2. switched to db mydb

  3. >

  4. > db.tab.save({"id":999});

  5. WriteResult({ "nInserted" : 1 })

  6. >

  7. > db.tab.find({"id":999});

  8. { "_id" : ObjectId("554ef5ac1b590330c00c7d02"), "id" : 999 }

  9. >

  10. > show collections

  11. system.indexes

  12. tab

  13. >


在建立使用者時可以在其資料庫中建立,這樣不用每次都進入admin資料庫登入後再切換。如在資料庫"mydb"建立使用者"userkk"。

  1. use admin

  2. db.auth("admin","admin")

  3. use mydb

  4. db.createUser(

  5. {

  6. user: "userkk",

  7. pwd: "userkk",

  8. roles: [ { role: "dbOwner", db: "mydb" } ]

  9. }

  10. )

  11. db.auth("userkk","userkk")

------------------------------------------------------------------------------------------------------------------

                                                      華麗分割

------------------------------------------------------------------------------------------------------------------

現在授權測試:

#先訪問到admin資料庫

  1. use admin

  2. db.auth("admin","admin")

#切換到 mydb ,在資料庫 mydb 中建立角色
#roles: 建立角色"testRole"在資料庫 "mydb" 中
#privileges: 該角色可檢視"find"資料庫"mydb"的所有集合
#db.dropRole("testRole")

  1. use mydb

  2. db.createRole({

  3. role: "testRole",

  4. privileges: [{ resource: { db: "mydb", collection: "" }, actions: [ "find" ] }],

  5. roles: []

  6. })


#在admin資料庫生成集合system.roles。檢視角色。

  1. > use admin

  2. switched to db admin

  3. >

  4. > show collections

  5. system.indexes

  6. system.roles

  7. system.users

  8. system.version

  9. >

  10. > db.system.roles.find();

  11. { "_id" : "mydb.testRole", "role" : "testRole", "db" : "mydb", "privileges" : [ { "resource" : { "db" : "mydb", "collection" : "" }, "actions" : [ "find" ] } ], "roles" : [ ] }

  12. >


#回到mydb,在資料庫mydb中建立使用者並授予角色"testRole"
#db.dropUser("userkk")

  1. use mydb

  2. db.createUser(

  3. {

  4. user: "userkk",

  5. pwd: "userkk",

  6. roles: [ { role: "testRole", db: "mydb" } ]

  7. }

  8. )


退出mongodb,重新登入進行操作。發現只能使用find
>exit

  1. [[email protected] ~]# mongo

  2. MongoDB shell version: 3.0.2

  3. connecting to: test

  4. > use mydb

  5. switched to db mydb

  6. >

  7. > db.auth("userkk","userkk")

  8. 1

  9. >

  10. > db.tab.find({"id":999})

  11. { "_id" : ObjectId("554ef5ac1b590330c00c7d02"), "id" : 999 }

  12. >

  13. > db.tab.insert({"id":1000})

  14. WriteResult({

  15. "writeError" : {

  16. "code" : 13,

  17. "errmsg" : "not authorized on mydb to execute command { insert: \"tab\", documents: [ { _id: ObjectId('554f145cdf782b42499d80e5'), id: 1000.0 } ], ordered: true }"

  18. }

  19. })

  20. >


給角色 "testRole"  新增3個 “Privileges”許可權: "update", "insert", "remove"。再重新操作。

  1. use admin

  2. db.auth("admin","admin")

  3. use mydb

  4. #新增Privileges給角色

  5. db.grantPrivilegesToRole("testRole",

  6. [{ resource: { db: "mydb", collection: "" },actions: [ "update", "insert", "remove" ]}

  7. ])

  8. exit #退出mongodb重新登入

  9. use mydb

  10. db.auth("userkk","userkk")

  11. #增刪資料可以操作了!~

  12. db.tab.insert({"id":1000})

  13. db.tab.find({"id":1000})

  14. db.tab.remove({"id":1000})

  15. #此時admin的角色記錄為:

  16. > db.system.roles.find();

  17. { "_id" : "mydb.testRole", "role" : "testRole", "db" : "mydb", "privileges" : [ { "resource" : { "db" : "mydb", "collection" : "" }, "actions" : [ "find", "insert", "remove", "update" ] } ], "roles" : [ ] }

  18. >


#更改角色 roles,把roles值全部更新。同樣Privileges也可以更新替換!~

  1. use admin

  2. db.auth("admin","admin")

  3. use mydb

  4. db.updateRole("testRole",{ roles:[{ role: "readWrite",db: "mydb"}]},{ w:"majority" })

  5. db.auth("userkk","userkk")

  6. show dbs

相關推薦

MongoDB 基礎安全性許可權操作

和其他所有資料庫一樣,許可權的管理都差不多一樣。mongodb儲存所有的使用者資訊在admin 資料庫的集合system.users中,儲存使用者名稱、密碼和資料庫資訊。mongodb預設不啟用授權認證,只要能連線到該伺服器,就可連線到mongod。若要啟用安全認證,需要更改

Python基礎檔案操作

一、檔案操作基本步驟:   一般需要經歷如下步驟: 開啟檔案 操作檔案 示例: #1. 開啟檔案,得到檔案控制代碼並賦值給一個變數 f=open('1.txt','r',encoding='utf-8') #預設開啟模式就為r #2. 通過控制代碼對檔案進行操作 data=f.r

MySQL基礎資料操作

續: 資料操作: 查詢表整體結構  :select * from 表名 增加: 全行(欄位)插入:insert  表名 values(各欄位對應的型別值) 預設插入:      &nbs

Node基礎檔案操作

檔案操作 相關模組 Node核心提供了很多與檔案操作相關的模組,每個模組都提供了一些最基本的操作API,在NPM中也有社群提供的功能包 fs: 基礎的檔案操作 API path: 提供和路徑相關的操作 API readline: 用於讀取大文字檔案,一行一行讀 fs-extra(第三方): https://w

php操作MongoDB基礎教程連線、新增、修改、刪除、查詢

舊版本mongo例項化用:new Mongo(); 新mongo例項化 <?php $m = new MongoClient(); // 連線 $db = $m->selectDB("example"); ?> //連線localhost:2701

MongoDB基礎知識

解決方案 互聯網 我們很好 數據庫 基礎知識 互聯網行業的發展非常的迅速,數據存儲以及架構優化方面也有很多不同的解決方案,例如關系型數據庫、非關系型數據庫、數據倉庫技術等。更多數據庫類產品的出現,為我們很好的解決了數據存儲的問題,例如Redis緩存,MySQL關系型數據庫,MongoDB

Mongodb基礎實踐

數據庫查詢 表達式 where 技術 文章 在前面的文章裏面主要介紹了MongoDB的文檔,集合,數據庫等操作和對文檔的增、刪、改相關知識,接下來會總結一點有關查詢的相關知識。 在MySQL中,我們知道數據查詢是優化的主要內容,讀寫分離等技術都是可以用來處理數據庫查詢優化的,足以見數

Python學習基礎筆記——modules模組操作

modules(模組) 1.引入模組,例如math模組 import math root=math.sqrt(36) flr=math.floor(89.9) print(root) print(flr) 6.0 89.0 2.給模組的名字賦予簡稱,之後都可以使用簡稱 im

python3基礎07程序操作及執行系統級命令等

#subprocess 建立子程序 連線輸入 輸出 管道錯誤,及獲取他們的狀態,可執行作業系統級的命令# subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False,#

linux基礎十二:Redhat7系統中rpm的相關操作與第三方軟體庫的搭建與共享

RPM RPM是Red-Hat Package Manager(RPM軟體包管理器)的縮寫,這一檔案格式名稱雖然打上了RedHat的標誌,但是其原始設計理念是開放式的,現在包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分發版本都

MongoDB基礎教程

1。連線mongodb cmd進入mongo/bin目錄下,輸入: mongo 2。建立資料庫 如果資料庫不存在建立資料庫,否則開啟該資料庫。 use 資料庫名 EG:建立資料庫runoob use runoob 建立並檢視當前使用的資

Python基礎檔案操作

檔案讀取: 1 #檔案讀取方式一 2 f=open("a.txt","r+",encoding="utf8") 3 data=f.read() 4 print(data) 5 f.close() 6 7 #檔案讀取方式二 8 with open("a.txt","r+",encodi

MongoDB資料庫操作

經過上一篇文章的介紹,大家已經成功安裝MongoDB了,現在來讓我們建立MongoDB的資料庫吧。 可能會出現的問題:安裝完成之後再命令列執行mongod命令可能會出現錯誤,這個問題只需要在一個盤的根目錄下新建一個目錄名為data,在data目錄下新建名為db

MongoDB集合操作

一、 建立集合 在MongoDB中,建立集合採用db.createCollection(name, options)方法。 在該命令中,name是所要建立的集合名稱。options是一個用來指定集合

spark連線mongodb許可權認證示例

final String mgohost = "127.0.0.1"; SparkSession spark = SparkSession.builder() .appN

藍橋杯-- 基礎練習 十六進位制轉八進位制大數操作

  基礎練習 十六進位制轉八進位制   時間限制:1.0s   記憶體限制:512.0MB 問題描述   給定n個十六進位制正整數,輸出它們對應的八進位制數。 輸入格式   輸入的第一行為一個正整數n (1<=n<=10)。   接下來n

Mongodb基礎入門3——排序和索引

今天繼續Mongodb,簡單的記錄下其排序和索引的使用。 在Mongodb中使用sort()方法對資料進行排序。 命令格式:db.collectionName.find().sort({key:引數

MongoDBjava操作

一、 準備工作 MongoDB與java連線需要相應驅動,可用maven新增相應依賴: <dependencies> <dependency> <groupId>org.mongo</gro

Apache Flink 零基礎入門十八Flink windows和Time操作

Time型別 在Flink中常用的Time型別: 處理時間 攝取時間 事件時間 處理時間 是上圖

vector最最最基礎用法非原創

sort排序 兩個 src per pre 開始 程序 -1 logs 在c++中,vector是一個十分有用的容器,下面對這個容器做一下總結。 1 基本操作 (1)頭文件#include<vector>. (2)創建vector對象,vector<int