1. 程式人生 > >MongoDB安全:創建角色(User-Defined Roles)

MongoDB安全:創建角色(User-Defined Roles)

scrip upd ima 不同 知識 ase tutorial 重要 blank

MongoDB已經定義了一些內建角色,同時還提供了用戶自定義角色的功能,以滿足用戶千差萬別的需求。

官文User-Defined Roles中對其有簡略介紹,但要熟悉怎麽創建角色,還需要了解下面的這些概念:

-(數據庫)操作(Privilege Actions)

-(數據庫)資源(Resource)

-Scope

-權限(Privileges)

-權限繼承(Inherited Privileges)

-

上面的概念可以參考下面的官文:

Role-Based Access Control

Privilege Actions

Resource Document

官文中下面幾句話孤以為是重點:

1.When adding a role, you create the role in a specific database.

在添加角色時,是將角色添加到某個數據庫下。

2.MongoDB uses the combination of the database and the role name to uniquely define a role.

MongoDB使用 數據庫和角色名 作為 角色的 唯一標識

3.MongoDB stores all role information in the system.roles collection in the admin database.

MongoDB將所有角色信息存儲到 admin數據庫下的名為system.roles的集合 中。

4.A MongoDB privilege comprises a resource and the permitted actions.

一個MongoDB權限 包含一個資源上允許的操作,即可以對某個資源做什麽

5.a user-defined role scoped for a non-admin database VS. User-defined roles scoped for the admin database

自定義在非admin數據庫上的角色 對比 自定義在admin數據庫上的角色

上面兩種角色 孤的翻譯或許不準確,請讀者提供意見,後者有用更多能力——創建、更新、繼承等方面。

怎麽創建角色呢?

本文的重點。更準確的說法應該是 怎麽創建某個數據庫的角色?使用db.createRole()

官文db.createRole()中給出了其具體使用方法:

db.createRole(role, writeConcern)

參數role是必須的,定義了角色名稱及其權限定義;參數writeConcern可選的暫不熟悉其用法及意義,請參考官文Write Concern

官文db.createRole()中給出的role參數(document)的規範:

技術分享圖片

其中,

role為角色名稱;

privileges為 權限(資源上的操作)列表;

roles為 需要繼承的 某些角色 在 某個數據庫上的權限 的列表;

authenticationRestrictions為 服務器對該角色 強制要求的認證限制,可選項,比如,只允許某些IP地址的擁有該角色的用戶的連接請求(很有用啊!)。

當然,具體細節請參考官文db.createRole()及其它官文。

疑問:角色名稱 可以使用哪些字符?是否能用點號(.)等?是否可以用中文?長度限制?加上數據庫名後的長度限制(唯一標識)?每個數據庫可以創建多少個角色?整個服務器呢?整個Replica Set呢?更大規模的呢?

提示:本文涉及到單例MongoDB服務器,而沒有涉及到Replica Set、集群等更大規模的角色管理,還需要繼續dig(以後項目用到了再dig也不遲,近期可以考慮熟悉Replica Set的相關操作)。

提示:在創建角色前,請確認當前用戶是否在目標資源上擁有createRole、grantRole、setAuthenticationRestriction等操作的權力。否則,創建失敗。

下面是官文db.createRole()中的一個示例(JavaScript格式?):

 1 use admin
 2 db.createRole(
 3    {
 4      role: "myClusterwideAdmin",
 5      privileges: [
 6        { resource: { cluster: true }, actions: [ "addShard" ] },
 7        { resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert", "remove" ] },
 8        { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert", "remove" ] },
 9        { resource: { db: "", collection: "" }, actions: [ "find" ] }
10      ],
11      roles: [
12        { role: "read", db: "admin" }
13      ]
14    },
15    { w: "majority" , wtimeout: 5000 }
16 )

更多示例請參考官文Manage Users and Roles(下午孤也會去看看這個)。

提示:示例 真的很重要!可以加快學習的進程和效率!節約時間(生命)!

【角色管理】

對了,除了創建角色,MongoDB還允許修改角色、更新角色、刪除角色等,請在官文mongo Shell Methods - Role Management查看更多信息:

技術分享圖片

後記

怎麽為不同規模的MongoDB應用創建角色呢?策略是什麽?

做了MongoDB裏面的相關安全操作,可以保證多大程度的安全?

模糊地記得,數據庫文件會被鎖住,這個又該怎麽辦?提高操作系統、網絡等的安全性?

MongoDB源碼漏洞出現時,怎麽第一時間發現並解決?保證數據的安全性、保證基於MongoDB的應用的穩定性?

額,還有好多要做的。

當然,知識的內容很多,普通程序員、高級程序員、架構師需要了解的東西不一樣,需要循序漸進才是!

要是精通MongoDB了,直接做MongoDB管理員好了!

路漫漫~

角色創建成功後,就可以考慮建立基於角色的用戶了。

MongoDB安全:創建角色(User-Defined Roles)