一文讀懂圖資料庫 Nebula Graph 訪問控制實現原理
摘要:資料庫許可權管理對大家都很熟悉,然而怎麼做好資料庫許可權管理呢?在本文中將詳細介紹 Nebula Graph 的使用者管理和許可權管理。
本文首發 Nebula Graph 部落格: https://nebula-graph.com.cn/posts/access-control-design-code-nebula-graph/
資料庫許可權管理對大家來說都已經很熟悉了。Nebula Graph 本身是一個高效能的海量圖資料庫,資料庫的安全問題更是資料庫設計的重中之重。目前 Nebula Graph 已支援基於角色的許可權控制功能。在這篇文章中將詳細介紹 Nebula Graph 的使用者管理和許可權管理。
Nebula Graph 架構體系
由上圖可知,Nebula Graph的主體架構分為三部分:Computation Layer、Storage Layer 和 Meta Service。Console 、API 和 Web Service 被統稱為 Client API。 賬戶資料和許可權資料將被儲存在 Meta Engine中,當Query Engine 啟動後,將會初始 Meta Client,Query Engine 將通過 Meta Client 與 Meta Service 進行通訊。
當使用者通過 Client API 連線 Query Engine 時,Query Engine 會通過 Meta Client 查詢 Meta Engine 的使用者資料,並判斷連線賬戶是否存在,以及密碼是否正確。當驗證通過後,連線建立成功,使用者可以通過這個連線執行資料操作。當使用者通過 Client API 傳送操作指令後,Query Engine 首先對此指令做語法解析,識別操作型別,通過操作型別、使用者角色等資訊進行許可權判斷,如果許可權無效,則直接在 Query Engine 阻擋操作,並返回錯誤資訊至 Client API。 在整個許可權檢查的過程中,Nebula Graph 對 Meta data 進行了快取,將在以下章節中介紹。
功能描述
在介紹功能之前,需要先描述一下 Nebula Graph 的邏輯結構:Nebula Graph 是一個支援多圖空間(Space) 的圖資料庫,Space 中獨立管理 Schema 和 Data,Space 和 Space 之間相互獨立。另外,Nebula Graph 還提供了一系列高階命令用於全域性管理 Cluster,Cluster 的操作命令和 Space 的操作命令將在下文中詳細描述。
因此 Nebula Graph 的許可權管理將會基於 圖空間(Space)、 角色(Role)、 操作(Operation) 三個維度進行。詳細描述請看下列子章節。
角色劃分
Nebula Graph 提供了五種操作角色,分別是 GOD、ADMIN、DBA、USER、GUEST,這五種操作角色基本覆蓋了所有的資料安全控制的場景。 一個登陸賬戶(Account)可以在不同的 Space 中擁有不同角色,但一個 Account 在同一個 Space 中只能擁有一種角色。角色講解:
- GOD:相當於 Linux 作業系統中的 root 使用者, 擁有最高的管理許可權。Nebula Graph Cluster 在初始化時會預設建立一個 GOD 角色的 Account,名為 root。
- ADMIN:基於 Space 的高階管理員,擁有此 Space 之內的所有管理許可權, 但對整個叢集則沒有管理許可權。
- DBA:資料庫管理員,可以對許可權內的 Space 進行管理,例如對 Schema / Data 進行修改和查詢。和 ADMIN 的區別是 DBA 不能對某個 Account 進行授權操作,但 ADMIN 可以。
- USER:普通的資料庫使用角色。 可讀寫 Data,可讀 Schema 但沒有寫許可權。
- GUEST:訪問者角色, 對許可權內 Space 的 Schema 和 Data 有隻讀許可權。
詳細許可權列表如下圖所示:
OPERATION | GOD | ADMIN | DBA | USER | GUEST |
---|---|---|---|---|---|
Read Space | Y | Y | Y | Y | Y |
Write Space | Y | ||||
Read Schema | Y | Y | Y | Y | Y |
Write Schema | Y | Y | Y | ||
Write User | Y | ||||
Write Role | Y | Y | |||
Read Data | Y | Y | Y | Y | Y |
Write Data | Y | Y | Y | Y | |
Special operation | Y | Y | Y | Y | Y |
注 : Special Operation 為特殊操作,例如 SHOW SPACE,每個角色都可以執行,但其執行結果只顯示 Account 許可權內的結果。
資料庫操作許可權細分
基於上邊的角色列表,不同的角色擁有不同的操作許可,詳細如下:
OPERATION | STATEMENTS |
---|---|
Read Space | 1.
USE
2. DESCRIBE SPACE |
Write Space | 1.
CREATE SPACE
2. DROP SPACE 3. CREATE SNAPSHOT 4. DROP SNAPSHOT 5. BALANCE |
Read Schema | 1.
DESCRIBE TAG
2. DESCRIBE EDGE 3. DESCRIBE TAG INDEX 4. DESCRIBE EDGE INDEX |
Write Schema | 1.
CREATE TAG
2. ALTER TAG 3. CREATE EDGE 4. ALTER EDGE 5. DROP TAG 6. DROP EDGE 7. CREATE TAG INDEX 8. CREATE EDGE INDEX 9. DROP TAG INDEX 10. DROP EDGE INDEX |
Write User | 1.
CREATE USER
2. DROP USER 3. ALTER USER |
Write Role | 1.
GRANT
2. REVOKE |
Read Data | 1.
GO
2. PIPE 3. LOOKUP 4. YIELD 5. ORDER BY 6. FETCH VERTEX 7. FETCH EDGE 8. FIND PATH 9. LIMIT 10. GROUP BY 11. RETURN |
Write Data | 1.
REBUILD TAG INDEX
2. REBUILD EDGE INDEX 3. INSERT VERTEX 4. UPDATE VERTEX 5. INSERT EDGE 6. UPDATE DEGE 7. DELETE VERTEX 8. DELETE EDGE |
Special Operation | 1. SHOW,eg:
SHOW SPACE、
SHOW ROLES
2. CHANGE PASSWORD |
控制邏輯
Nebula Graph 的使用者管理和許可權管理和大多數資料庫的控制相似, 基於 meta server,對圖空間(Space)、角色(Role)、操作(Operation)三個層面進行許可權管理,當 Client 連線 Nebula Graph Server 的時候,Nebula Graph Server 首先會驗證登陸賬戶( Account)是否存在,並驗證密碼是否有效。
登入成功後,Nebula Graph Server 會為此連線初始 Session ID,並將 Session ID、使用者資訊、許可權資訊和 Space 資訊一起載入到 Session 結構中。後續的每次操作將基於 Session 結構中的資訊進行許可權判斷。直到使用者主動退出連線或 session timeout,Session 銷燬。另外,Meta Client 對許可權資訊進行了快取,並根據設定的時間頻率進行快取同步,有效降低了使用者連線的過程的時間耗費。
控制邏輯程式碼片段
Permission Check
bool PermissionCheck::permissionCheck(session::Session *session, Sentence* sentence) {
auto kind = sentence->kind();
switch (kind) {
case Sentence::Kind::kUnknown : {
return false;
}
case Sentence::Kind::kUse :
case Sentence::Kind::kDescribeSpace : {
/**
* Use space and Describe space are special operations.
* Permission checking needs to be done in their executor.
* skip the check at here.
*/
return true;
}
...
Permission Check Entry
Status SequentialExecutor::prepare() {
for (auto i = 0U; i < sentences_->sentences_.size(); i++) {
auto *sentence = sentences_->sentences_[i].get();
auto executor = makeExecutor(sentence);
if (FLAGS_enable_authorize) {
auto *session = executor->ectx()->rctx()->session();
/**
* Skip special operations check at here. they are :
* kUse, kDescribeSpace, kRevoke and kGrant.
*/
if (!PermissionCheck::permissionCheck(session, sentence)) {
return Status::PermissionError("Permission denied");
}
}
...
}
示例
檢視現有使用者角色
(root@127.0.0.1:6999) [(none)]> SHOW USERS;
===========
| Account |
===========
| root |
-----------
Got 1 rows (Time spent: 426.351/433.756 ms)
建立使用者
(root@127.0.0.1:6999) [(none)]> CREATE USER user1 WITH PASSWORD "pwd1"
Execution succeeded (Time spent: 194.471/201.007 ms)
(root@127.0.0.1:6999) [(none)]> CREATE USER user2 WITH PASSWORD "pwd2"
Execution succeeded (Time spent: 33.627/40.084 ms)
# 檢視現有使用者角色
(root@127.0.0.1:6999) [(none)]> SHOW USERS;
===========
| Account |
===========
| root |
-----------
| user1 |
-----------
| user2 |
-----------
Got 3 rows (Time spent: 24.415/32.173 ms)
為 Space 中的不同 Account 指定角色
# 建立圖空間
(root@127.0.0.1:6999) [(none)]> CREATE SPACE user_space(partition_num=1, replica_factor=1)
Execution succeeded (Time spent: 218.846/225.075 ms)
(root@127.0.0.1:6999) [(none)]> GRANT DBA ON user_space TO user1
Execution succeeded (Time spent: 203.922/210.957 ms)
(root@127.0.0.1:6999) [(none)]> GRANT ADMIN ON user_space TO user2
Execution succeeded (Time spent: 36.384/49.296 ms)
檢視特定 Space 的已有角色
(root@127.0.0.1:6999) [(none)]> SHOW ROLES IN user_space
=======================
| Account | Role Type |
=======================
| user1 | DBA |
-----------------------
| user2 | ADMIN |
-----------------------
Got 2 rows (Time spent: 18.637/29.91 ms)
取消特定 Space 的角色授權
(root@127.0.0.1:6999) [(none)]> REVOKE ROLE DBA ON user_space FROM user1
Execution succeeded (Time spent: 201.924/216.232 ms)
# 檢視取消之後,user_space 現有角色
(root@127.0.0.1:6999) [(none)]> SHOW ROLES IN user_space
=======================
| Account | Role Type |
=======================
| user2 | ADMIN |
-----------------------
Got 1 rows (Time spent: 16.645/32.784 ms)
刪除某個 Account 角色
(root@127.0.0.1:6999) [(none)]> DROP USER user2
Execution succeeded (Time spent: 203.396/216.346 ms)
# 檢視 user2 在 user_space 的角色
(root@127.0.0.1:6999) [(none)]> SHOW ROLES IN user_space
Empty set (Time spent: 20.614/34.905 ms)
# 檢視資料庫現有 account
(root@127.0.0.1:6999) [(none)]> SHOW USERS;
===========
| Account |
===========
| root |
-----------
| user1 |
-----------
Got 2 rows (Time spent: 22.692/38.138 ms)
本文到此結束,如果你喜歡本文,可以給我們點個 star 喲 ? GitHub 傳送門: https://github.com/vesoft-inc/nebula ;
想了解、交流圖資料庫技術的小夥伴,可以聯絡 Nebula Graph 官方小助手微訊號: NebulaGraphbot 來群裡和業內大牛聊聊喲~~
Hi,我是 bright-starry-sky,是圖資料 Nebula Graph 研發工程師,對資料庫儲存有濃厚的興趣,希望本次的經驗分享能給大家帶來幫助,如有不當之處希望你能在本文【評論】區留言,謝謝~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952037/viewspace-2695872/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 圖資料庫 Nebula Graph TTL 特性資料庫
- OceanBase 原始碼解讀(七):一文讀懂資料庫索引實現原理原始碼資料庫索引
- 分散式圖資料庫 Nebula Graph 的 Index 實踐分散式資料庫Index
- GraphX 在圖資料庫 Nebula Graph 的圖計算實踐資料庫
- 圖資料庫 Nebula Graph 的安裝部署資料庫
- 圖資料庫|[Nebula Graph v3.1.0 效能報告資料庫
- 圖資料庫|Nebula Graph v3.1.0 效能報告資料庫
- Jepsen 測試框架在圖資料庫 Nebula Graph 中的實踐框架資料庫
- 一文讀懂 TKE 及 Kubernetes 訪問許可權控制訪問許可權
- 淺析圖資料庫 Nebula Graph 資料匯入工具——Spark Writer資料庫Spark
- 圖資料庫實操:用 Nebula Graph 破解成語版 Wordle 謎底資料庫
- 圖資料庫 Nebula Graph v.1.0.0-beta 已上線資料庫
- 圖資料庫|基於 Nebula Graph 的 BetweennessCentrality 演算法資料庫演算法
- 圖資料庫 Nebula Graph 在 Boss 直聘的應用資料庫
- 初識分散式圖資料庫 Nebula Graph 2.0 Query Engine分散式資料庫
- TiDB、Nebula Graph、ArgoDB、Couchbase等資料庫TiDBGo資料庫
- 一文了解 Nebula Graph DBaaS 服務——Nebula Graph Cloud ServiceCloud
- 圖資料庫|基於 Nebula Graph 的 Betweenness Centrality 演算法資料庫演算法
- 使用圖資料庫 Nebula Graph 資料匯入快速體驗知識圖譜 OwnThink資料庫
- 圖資料庫 Nebula Graph 的資料模型和系統架構設計資料庫模型架構
- 圖資料庫 Nebula Graph 的程式碼變更測試覆蓋率實踐資料庫
- 圖資料庫對比:Neo4j vs Nebula Graph vs HugeGraph資料庫
- 用 Docker swarm 快速部署分散式圖資料庫 Nebula Graph 叢集DockerSwarm分散式資料庫
- 一文讀懂資料庫發展史資料庫
- 一文讀懂如何實施資料治理?
- 一文讀懂知識圖譜與向量資料庫的異同資料庫
- 開源之夏專案分享:圖資料庫 Nebula Graph 支援 JDBC 協議資料庫JDBC協議
- Nebula Graph 原始碼解讀系列 | Vol.03 Planner 的實現原始碼
- 圖資料庫 Nebula 在 HBase 的分享實錄資料庫
- 一文讀懂擁塞控制
- 一文讀懂 OceanBase 資料庫的SLog日誌資料庫
- 一文讀懂資料庫70年發展史資料庫
- 一文讀懂大資料實時計算大資料
- Nebula Graph 在眾安保險的圖實踐
- 解析 Nebula Graph 子圖設計及實踐
- 從 Neo4j 匯入 Nebula Graph 實踐見 SPark 資料匯入原理Spark
- 一文讀懂 Kubernetes APIServer 原理APIServer
- Holer實現外網訪問SQLServer資料庫SQLServer資料庫