Mongodb 認證鑒權那點事

来源:http://www.cnblogs.com/littleatp/archive/2017/10/21/7702539.html
-Advertisement-
Play Games

[TOC] 一、Mongodb 的許可權管理 認識許可權管理,說明主要概念及關係 與大多數資料庫一樣,Mongodb同樣提供了一套許可權管理機制。 為了體驗Mongodb 的許可權管理,我們找一臺已經安裝好的Mongodb,可以 "參照這裡" 搭建一個單節點的Mongodb。 直接打開mongo shell ...


[TOC]

一、Mongodb 的許可權管理

認識許可權管理,說明主要概念及關係

與大多數資料庫一樣,Mongodb同樣提供了一套許可權管理機制。 為了體驗Mongodb 的許可權管理,我們找一臺已經安裝好的Mongodb,可以參照這裡搭建一個單節點的Mongodb。

直接打開mongo shell:

./bin/mongo --port=27017

嘗試執行stats命令以查看appdb資料庫的狀態:

MongoDB Enterprise > use appdb
MongoDB Enterprise > db.stats()
{
    "ok" : 0,
    "errmsg" : "not authorized on nscl to execute command { dbstats: 1.0, scale: undefined }",
    "code" : 13
}

此時的提示正是說明你當前的操作沒有獲得許可,使用appdb預創建的用戶進行鑒權:

> db.auth('appuser','yourpassword')
1
> db.stats()
{
    "db" : "appdb",
    "collections" : 0,
    "views" : 0,
    "objects" : 0,
    "avgObjSize" : 0,
    "dataSize" : 0,
    "storageSize" : 0,
    "numExtents" : 0,
    "indexes" : 0,
    "indexSize" : 0,
    "fileSize" : 0,
    "ok" : 1
}

可以發現,在通過驗明身份之後,stats操作的鑒權獲得了許可。


以上例子可能讓你對資料庫鑒權有了點淺顯認識,那麼接下來開始說點概念了,大致是叫基於角色的許可權控制

[圖-角色許可權控制]

先解釋下圖中的幾個實體:

  • Resource,資源 一個資源可以是一個資料庫、集合、或者一個集群..往大了說,任何可能被操作的事物都可以被當做資源。
  • Action,動作 動作是指對資源的一個執行行為,比如讀取表、讀取資料庫,其中讀取便是一個動作。
  • Privilege,許可權 許可權指的是對某類或某一些資源執行某些動作的允許,與Permission的意義一致。
  • Role,角色 系統中的角色,通常是代表了一種權力等級的象徵,比如論壇中的管理員、版主、游客等等,就是角色; 系統定義中,角色往往代表一組許可權的集合。
  • User,用戶 可登錄系統的實體,一個用戶通常可被賦予多個角色。

噢,關於圖的簡單解釋: 許可權定義了對某些資源的某些操作,角色則可以擁有多個許可權; 用戶User可以被賦予多個角色,從而獲得這些角色所擁有的許可權以操作某些資源。

對於Mongodb來說,只要開啟鑒權,所有的DB訪問操作都需要通過許可權檢查。而大致的操作流程跟下圖類似

[圖-mongo鑒權]

  1. Mongodb 的用戶歸屬於某個資料庫,用戶需要在所屬的資料庫中進行鑒權;
  2. 一旦通過鑒權,當前的會話(連接)中所有操作將按照用戶被賦予的角色許可權執行檢查。

二、鑒權方式

闡述Mongodb支持的幾種鑒權方式 鑒權方式是指Mongodb如何識別接入用戶,如何檢查許可權是否合法的一系列校驗機制。

  • SCRAM-SHA-1 SCRAM-SHA-1 是預設的鑒權機制,定義於 IETF standard, RFC 5802 是一種安全性較高的"挑戰-應答"鑒權機制。關於"挑戰-應答"可以參考維基百科

  • MongoDB Challenge and Response (MONGODB-CR) 3.0 以前採用的機制,已經廢棄

  • x.509 Certificate Authentication. 基於證書的鑒權,採用該方式可建立 SSL/TLS 加密連接

  • LDAP proxy authentication 基於LDAP 系統的鑒權,僅企業版支持

  • Kerberos authentication 基於Kerberos 的鑒權,僅企業版支持

SCRAM-SHA-1 是當前推薦使用的鑒權方式,既然如此,有必要上圖繼續解釋:

步驟解讀

  1. 客戶端發起一個SCRAM鑒權請求; 鑒權參數中帶上用戶名、客戶端隨機字元串(防止重放攻擊);
  2. 服務端發出一個挑戰響應; 服務側先檢查用戶名,通過後生成一個salt因數、迭代數、合併字元串(包含客戶端隨機串和服務端隨機串)
  3. 客戶端響應一個proof(證明數據)和合併字元串; 響應的 proof數據根據服務所給的隨機參數以及客戶端密鑰生成,是一個客戶端簽名與密鑰異或計算後的結果;
  4. 服務端將存儲的密鑰結合隨機參數,使用同樣的演算法生成簽名並校驗客戶端 proof數據; 若校驗通過,服務端採用類似方式發送自己的簽名;
  5. 客戶端校驗服務端簽名數據。

可以看到,SCRAM鑒權時也類似SSL/TLS 的握手過程,但相比之下簡單許多,同時在性能方面也要具備優勢; 然後我們看看安全性的部分:

  • 信息竊聽,傳輸過程中全部採用動態簽名,保證密碼不會被傳輸;
  • 重放攻擊,由於使用了隨機數,每次生成的數據都不一樣,可避免重覆數據攻擊;
  • 服務假冒,鑒權過程是雙向的,即客戶端會校驗服務端身份,而服務端密鑰也根據密碼生成,中間人無法仿造;
  • 存儲安全,密碼在資料庫中均沒有明文存儲,都通過不可逆的演算法加密存儲。

另外SCRAM-SHA-1 相比MONGODB-CR的優勢還有:

A tunable work factor (iterationCount), 可靈活調整的安全繫數 Per-user random salts rather than server-wide salts 每個用戶有獨立的隨機繫數 A cryptographically stronger hash function (SHA-1 rather than MD5), 更安全的hash函數 Authentication of the server to the client as well as the client to the server. 支持雙向認證

對 SCRAM-SHA-1的實現感興趣?戳這裡

三、內部鑒權

副本集、分片集群內鑒權方式

內部鑒權是指 Mongo集群內部節點之間進行訪問的鑒權方式,比如副本集內主備之間的訪問、分片集群內Mongos 與Mongod之間的訪問。 內部鑒權目前支持兩種方式:

  1. KeyFiles 密鑰文件方式,採用SCAM-SHA-1 的鑒權機制,文件內包含了一個共用密鑰,由集群內所有成員共同持有。 通常,密鑰的長度在6-1024字元內,採用Base64編碼。 如何使用?

  2. X.509 證書 證書鑒權,用於SSL/TLS加密連接通道。 如何使用?

四、資料庫角色

針對Mongodb資料庫中的各種角色進行說明

資料庫訪問

角色名稱 擁有許可權
read 允許讀取指定資料庫的角色
readWrite 允許讀寫指定資料庫的角色

資料庫管理

角色名稱 擁有許可權
dbAdmin 允許用戶在指定資料庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin 允許管理當前資料庫的用戶,如創建用戶、為用戶授權
dbOwner 資料庫擁有者(最高),集合了dbAdmin/userAdmin/readWrite角色許可權

集群管理

角色名稱 擁有許可權
clusterAdmin 集群最高管理員,集合clusterManager/clusterMonitor/hostManager角色許可權
clusterManager 集群管理角色,允許對分片和副本集集群執行管理操作,如addShard,resync等
clusterMonitor 集群監控角色,允許對分片和副本集集群進行監控,如查看serverStatus
hostManager 節點管理角色,允許監控和管理節點,比如killOp、shutdown操作

備份恢復

角色名稱 擁有許可權
backup 備份許可權,允許執行mongodump操作
restore 恢復許可權,允許執行mongoresotre操作

資料庫通用角色

角色名稱 擁有許可權
readAnyDatabase 允許讀取所有資料庫
readWriteAnyDatabase 允許讀寫所有資料庫
userAdminAnyDatabase 允許管理所有資料庫的用戶
dbAdminAnyDatabase 允許管理所有資料庫

特殊角色

角色名稱 擁有許可權
root 超級管理員,擁有所有許可權
__system 內部角色,用於集群間節點通訊

基本是這些,有興趣可看看官方的內置角色 Mongodb 的用戶及角色數據一般位於當前實例的 admin資料庫,system.users存放了所有數據; 存在例外的情況是分片集群,應用接入mongos節點,鑒權數據則存放於config節點。因此有時候為了方便分片集群管理,會單獨為分片內部節點創建獨立的管理操作用戶;

五、相關操作

簡單列舉用戶許可權相關的常用操作

授權啟動

./bin/mongod --auth

預設為非授權啟動 也可以通過security.authorization配置指定

創建管理員用戶

use admin
db.createUser({
    user:'admin',pwd:'admin@2016',roles:[
        {role:'clusterAdmin',db:'admin'},
        {role:'userAdminAnyDatabase',db:'admin'}
        ]})

創建用戶

use appdb
db.createUser({user:'appuser',pwd:'appuser@2016'})

授予許可權

use appdb
db.grantRolesToUser("appuser", [{role:'readWrite',db:'appdb'}])

刪除許可權

use appdb
db.revokeRolesFromUser("appuser",[{ role: "read", db: "appdb" }])

更多操作

六、常見問題

shell 操作提示錯誤

use appdb
MongoDB Enterprise > db.stats()
{
    "ok" : 0,
    "errmsg" : "not authorized on appdb to execute command { dbstats: 1.0, scale: undefined }",
    "code" : 13
}

原因:當前連接未鑒權或用戶沒有操作許可權 解決:為用戶分配適當許可權,並執行auth操作,如下:

db.auth('appuser','yourpassword');

無法執行 eval 操作

db.eval() 是一個全局操作,可執行任意資料庫腳本; 執行該命令需要擁有anyAction或anyResource的許可權,通常不建議為資料庫用戶賦予這樣的許可權。 該命令存在安全風險,已不建議使用(mongodb 3.0之後已經過期)。

七、擴展閱讀

Mongodb 鑒權機制 https://docs.mongodb.com/manual/core/authentication/

Mongodb 內置角色介紹 https://docs.mongodb.com/manual/reference/built-in-roles/#database-user-roles

Mongodb 許可權操作介紹 https://docs.mongodb.com/manual/reference/privilege-actions/#security-user-actions

運維-Mongodb鑒權介紹 http://www.ywnds.com/?p=5635


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 直奔主題 第一步:為AndroidStudio安裝Kotlin插件 線上安裝步驟:File—>Settings—>Plugins—>Install JetBrains plugin…出現以下界面,選中Kotlin 點擊右邊的Install(因為我的已經安裝了所以顯示的是Update升級) 然後就是漫 ...
  • 枚舉增強程式的可讀性,用法上還是需要註意的 1.C語言的寫法 enum XMPPReconnectFlags { kShouldReconnect = 1 << 0, // If set, disconnection was accidental, and autoReconnect may be ...
  • 首先,在正式使用Masonry之前,我們先來看看在xib中我們是如何使用AutoLayout 從圖中我們可以看出,只要設置相應得局限,控制好父視圖與子視圖之間的關係就應該很ok的拖出你需要的需求。這裡就不詳細講解具體拖拽的方法..... 然後,我們按著上圖的屬性來看看如何簡單得使用Masonry 首 ...
  • 最近公司有了一個新的需求,學生在購買課時的時候,需要讓家長或者朋友代付。這樣的話我首先想到的就是微信的H5支付(微信內置瀏覽器調用支付模塊)。當時想用這個支付的原因因為是前端代碼十分簡單。。 然而恰恰是因為自己選擇了這個方法,讓自己連續兩天陷入了困境。 下麵是正文跟代碼截圖 首先咱們先來看下H5的支 ...
  • 第一種方法:通過設置layer的屬性 最簡單的一種,但是很影響性能,一般在正常的開發中使用很少. ? 1 2 3 4 5 6 7 UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, ...
  • 引言 為了後面的例子做準備,本篇及接下來幾篇將介紹Android應用程式的原理及術語,這些也是作為一個Android的開發人員必須要瞭解,且深刻理解的東西。本篇的主題如下: 1、應用程式基礎 2、應用程式組件 2.1、活動(Activities) 2.2、服務(Services) 2.3、廣播接收者 ...
  • ——工欲善其事必先利其器 引言 本系列適合0基礎的人員,因為我就是從0開始的,此系列記錄我步入Android開發的一些經驗分享,望與君共勉!作為Android隊伍中的一個新人的我,如果有什麼不對的地方,還望不吝賜教。 在開始Android開發之旅啟動之前,首先要搭建環境,然後創建一個簡單的Hello ...
  • 一:理解sql執行順序 在sql中,第一個被執行的是from語句,每一個步驟都會產生一個虛擬表,該表供下一個步驟查詢時調用,比如語句:select top 10 column1,colum2,max(column3) from user where id>1 group by column1,col ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...