保護嵌入式 Metabase 的安全
如何在不同類型的嵌入中隱藏和保護敏感資料。
使用驗證和授權保護嵌入的安全
有兩種基本方法可以在網路上保護內容安全
公開嵌入
公開嵌入不涉及任何驗證或授權。公開嵌入會顯示一個公開連結,結尾帶有唯一的字串,如下所示
http://my-metabase.com/public/dashboard/184f819c-2c80-4b2d-80f8-26bffaae5d8b
字串(在此範例中:184f819c-2c80-4b2d-80f8-26bffaae5d8b
)唯一識別您的 Metabase 問題或儀表板。由於公開嵌入不執行任何驗證或授權,因此任何擁有 URL 的人都可以檢視資料。
範例:公開連結中的篩選條件無法保護資料
那麼,有人可能如何利用公開嵌入?假設我們有一個顯示帳戶資料的儀表板
帳戶 ID | 方案 | 狀態 |
---|---|---|
1 | 基本 | 有效 |
2 | 基本 | 有效 |
3 | 基本 | 無效 |
4 | 進階 | 無效 |
5 | 進階 | 有效 |
我們想要新增一個「狀態 = 有效」篩選條件,並在嵌入中顯示儀表板的公開連結
帳戶 ID | 方案 | 狀態 |
---|---|---|
1 | 基本 | 有效 |
2 | 基本 | 有效 |
5 | 進階 | 有效 |
若要套用並隱藏「狀態 = 有效」篩選條件,我們會在嵌入中將 查詢參數新增至公開連結的結尾
http://my-metabase.com/public/dashboard/184f819c-2c80-4b2d-80f8-26bffaae5d8b?status=active#hide_parameters=status
即使我們已從嵌入中隱藏篩選條件,還是有人可以取得嵌入中使用的公開連結,並移除查詢參數 ?status=active
http://my-metabase.com/public/dashboard/184f819c-2c80-4b2d-80f8-26bffaae5d8b
載入不含查詢參數的公開連結會從資料中移除「狀態 = 有效」篩選條件。該人員將可以存取原始帳戶資料,包括具有無效帳戶的列。
靜態嵌入已使用 JWT 授權
靜態嵌入使用 JWT 授權流程來執行兩件事
- 簽署資源(例如,圖表或儀表板的 URL),以確保只有您的嵌入應用程式可以向您的 Metabase 請求資料。
- 簽署參數(例如,儀表板篩選條件),以防止人員變更篩選條件並取得其他資料的存取權。
靜態嵌入沒有使用者工作階段
靜態嵌入不會在 Metabase 端驗證人員的身分,因此人員可以在不建立 Metabase 帳戶的情況下檢視靜態嵌入。但是,如果沒有 Metabase 帳戶,Metabase 將無法記住使用者或其工作階段,這表示
- Metabase 權限和 資料沙盒將無法運作 — 如果您需要鎖定敏感資料,則必須為每個靜態嵌入設定鎖定的參數。
- 靜態嵌入中的任何篩選條件選取項目都會在簽署的 JWT 過期後重設。
- 所有靜態嵌入使用情況都會在「外部使用者」下的使用情況分析中顯示。
靜態嵌入安全性 vs. 互動式嵌入安全性
靜態嵌入僅保證對您的 Metabase 資料進行授權存取(您決定什麼是可存取的)。
如果您想要根據某人的身分來保護您的靜態嵌入的安全(您決定誰可以存取什麼),則需要設定您自己的驗證流程,並手動將其連接到每個靜態嵌入上的 鎖定的參數。請注意,鎖定的參數本質上是篩選條件,因此您只能在靜態嵌入中設定列層級限制。
如果您想要更輕鬆地為不同客戶嵌入不同資料檢視(而不允許客戶看到彼此的資料),請瞭解互動式嵌入如何在一個流程中驗證和授權人員。
使用 JWT 授權的靜態嵌入
此圖說明了嵌入如何透過簽署的 JWT 受到保護
- 訪客抵達:您的前端收到顯示 Metabase 嵌入 URL 的請求。
- 簽署的請求:您的後端產生具有 簽署的 JWT 的 Metabase 嵌入 URL。簽署的 JWT 應編碼您用於篩選資料的任何查詢參數。
- 回應:您的 Metabase 後端根據簽署的 JWT 中編碼的查詢參數傳回資料。
- 成功:您的前端顯示具有正確資料的嵌入式 Metabase 頁面。
範例:使用靜態嵌入上鎖定的參數保護資料安全
在公開嵌入範例中,我們向您展示(可能不明智地)有人如何透過編輯其查詢參數來利用唯一的公開連結。
讓我們回到我們的帳戶範例
帳戶 ID | 方案 | 狀態 |
---|---|---|
1 | 基本 | 有效 |
2 | 基本 | 有效 |
3 | 基本 | 無效 |
4 | 進階 | 無效 |
5 | 進階 | 有效 |
請記住,我們可以透過在嵌入 URL 的結尾包含查詢參數來篩選公開嵌入中的資料
http://my-metabase.com/public/dashboard/184f819c-2c80-4b2d-80f8-26bffaae5d8b?status=active
帳戶 ID | 方案 | 狀態 |
---|---|---|
1 | 基本 | 有效 |
2 | 基本 | 有效 |
5 | 進階 | 有效 |
使用靜態嵌入,我們可以透過在簽署的 JWT 中編碼查詢參數來「鎖定」篩選條件。例如,假設我們將「狀態 = 有效」篩選條件設定為鎖定的參數。?status=active
查詢參數將在簽署的 JWT 中編碼,因此從靜態嵌入 URL 看不到或無法編輯
http://my-metabase.com/dashboard/your_signed_jwt
如果有人嘗試將(未簽署的)查詢參數新增至靜態嵌入 URL 的結尾,例如這樣
http://my-metabase.com/dashboard/your_signed_jwt?status=inactive
Metabase 將拒絕此未經授權的資料請求,因此無效帳戶列將保持從嵌入中隱藏。
範例:將使用者屬性傳送至鎖定的參數
假設我們想要向客戶公開帳戶表格,以便客戶可以根據帳戶 ID 查詢列。
帳戶 ID | 方案 | 狀態 |
---|---|---|
1 | 基本 | 有效 |
2 | 基本 | 有效 |
3 | 基本 | 無效 |
4 | 進階 | 無效 |
5 | 進階 | 有效 |
如果我們想要避免為每位客戶建立 Metabase 登入,我們將需要
流程可能看起來像這樣
- 客戶登入我們的 Web 應用程式。
- 我們的應用程式後端根據登入期間使用的帳戶電子郵件查詢客戶的
account_id
。 - 我們的應用程式後端使用 Metabase 的秘密金鑰來產生嵌入 URL,其中包含簽署的 JWT。簽署的 JWT 編碼查詢參數,以依
Account ID = account_id
篩選帳戶儀表板。 - Metabase 在靜態嵌入 URL 傳回篩選後的儀表板。
- 我們的應用程式前端在 iframe 中顯示篩選後的儀表板。
如需程式碼範例,請參閱靜態嵌入參考應用程式。
互動式嵌入在一個流程中驗證和授權人員
互動式嵌入與 SSO (JWT 或 SAML) 整合,以便在一個流程中驗證和授權人員。驗證整合讓使用者屬性(例如人員的角色或部門)對應到精細層級的資料存取權變得容易,包括
使用 SSO 的互動式嵌入
此圖表向您顯示互動式嵌入如何透過 SSO 受到保護
- 訪客抵達:您的前端收到顯示所有內容(包括 Metabase 元件,例如 React 元件)的請求。
- 載入嵌入:您的前端元件使用您的嵌入 URL載入 Metabase 前端。
- 檢查工作階段:若要在嵌入 URL 顯示資料,您的 Metabase 後端會檢查有效的工作階段(已登入的訪客)。
- 如果沒有有效的工作階段:
- 重新導向至 SSO:您的 Metabase 前端將訪客重新導向至您的 SSO 登入頁面。
- SSO 驗證:您的 SSO 流程驗證訪客的身分,並根據其身分產生工作階段。工作階段資訊應編碼使用者屬性,例如群組成員資格和資料沙盒權限。
- 重新導向至 Metabase:您的 SSO 流程使用工作階段資訊將訪客重新導向至您的 Metabase 前端。
- 請求:您的 Metabase 前端將資料請求與工作階段資訊一起傳送至 Metabase 後端。
- 回應:您的 Metabase 後端根據工作階段資訊中編碼的使用者屬性傳回資料。
- 成功:您的前端元件顯示具有已登入訪客正確資料的嵌入式 Metabase 頁面。
步驟 4 的機制會根據您是否使用 JWT 或 SAML 進行 SSO 而略有不同。
範例:使用 SSO 和資料沙盒保護資料安全
在我們的靜態嵌入範例中,我們使用鎖定的參數來顯示帳戶表格的安全篩選檢視。
關於互動式嵌入和 SSO 整合的好處是,我們不必為每個嵌入手動管理鎖定的參數。相反地,我們可以將使用者屬性從我們的身分提供者 (IdP) 對應到 Metabase 中的權限和資料沙盒。人員可以從他們第一次登入時就獲得驗證和授權,以自助服務特定的資料子集。
讓我們擴展我們的帳戶範例,以包含租戶 ID。租戶 ID 代表一群客戶的父組織
租戶 ID | 帳戶 ID | 方案 | 狀態 |
---|---|---|---|
999 | 1 | 基本 | 有效 |
999 | 2 | 基本 | 有效 |
999 | 3 | 基本 | 無效 |
777 | 4 | 進階 | 無效 |
777 | 5 | 進階 | 有效 |
我們仍然想要向客戶公開帳戶表格,但有一些額外要求
- 個別客戶只能檢視其自身帳戶 ID 的資料。
- 租戶可以檢視其所有子帳戶(但不能檢視其他租戶的資料)。
若要設定這些多租戶權限,我們需要
- 在我們的 IdP 中建立
primary_id
屬性,以唯一識別所有租戶和客戶。 - 在我們的 IdP 中建立名為
role
的使用者屬性,並為每個將使用 Metabase 的人員將其設定為tenant
或customer
。 - 在 Metabase 中建立兩個群組:租戶和客戶。
- 在 Metabase 和我們的 IdP 之間同步群組成員資格,以便
- 具有
role=tenant
的人員會指派給租戶群組。 - 具有
role=customer
的人員會指派給客戶群組。
- 具有
- 為每個群組設定帳戶表格的沙盒檢視
- 對於客戶群組,帳戶表格將沙盒化(篩選)為
Account ID = primary_id
。 - 對於租戶群組,帳戶表格將沙盒化為
Tenant ID = primary_id
。
- 對於客戶群組,帳戶表格將沙盒化(篩選)為
當租戶 A 第一次使用 SSO 登入時
- Metabase 將為他們建立一個帳戶。
- 我們的 IdP 將
role=tenant
和primary_id=999
屬性傳送至 Metabase。 - Metabase 將自動將租戶 A 指派給租戶群組。
- 租戶 A 將獲得租戶群組的權限(包括資料沙盒)。
- 租戶 A 將在 Metabase 的每個地方看到帳戶表格的沙盒檢視
租戶 ID | 帳戶 ID | 方案 | 狀態 |
---|---|---|---|
999 | 1 | 基本 | 有效 |
999 | 2 | 基本 | 有效 |
999 | 3 | 基本 | 無效 |
當客戶 1 登入時,他們將根據其 role
和 primary_id
屬性看到不同篩選版本的帳戶表格
租戶 ID | 帳戶 ID | 方案 | 狀態 |
---|---|---|---|
A | 1 | 基本 | 有效 |