MongoDB安全:創建角色(User-Defined Roles)
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)