保護嵌入式 Metabase 的安全

如何在不同類型的嵌入中隱藏和保護敏感資料。

使用驗證和授權保護嵌入的安全

有兩種基本方法可以在網路上保護內容安全

  1. 驗證著眼於某人是(使用 JWTSAML 等標準)。
  2. 授權著眼於某人有權存取什麼(使用 OAuth 2.0 等標準)。

公開嵌入

公開嵌入不涉及任何驗證或授權。公開嵌入會顯示一個公開連結,結尾帶有唯一的字串,如下所示

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 授權的靜態嵌入

Static embedding with JWT authorization.

此圖說明了嵌入如何透過簽署的 JWT 受到保護

  1. 訪客抵達:您的前端收到顯示 Metabase 嵌入 URL 的請求。
  2. 簽署的請求:您的後端產生具有 簽署的 JWT 的 Metabase 嵌入 URL。簽署的 JWT 應編碼您用於篩選資料的任何查詢參數
  3. 回應:您的 Metabase 後端根據簽署的 JWT 中編碼的查詢參數傳回資料。
  4. 成功:您的前端顯示具有正確資料的嵌入式 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 登入,我們將需要

  • 具有帳戶資料的可嵌入式儀表板
  • 帳戶 ID 篩選條件的鎖定的參數
  • 我們的嵌入應用程式(我們想要嵌入 Metabase 的 Web 應用程式)中的登入流程。

流程可能看起來像這樣

  1. 客戶登入我們的 Web 應用程式。
  2. 我們的應用程式後端根據登入期間使用的帳戶電子郵件查詢客戶的 account_id
  3. 我們的應用程式後端使用 Metabase 的秘密金鑰產生嵌入 URL,其中包含簽署的 JWT。簽署的 JWT 編碼查詢參數,以依 Account ID = account_id 篩選帳戶儀表板。
  4. Metabase 在靜態嵌入 URL 傳回篩選後的儀表板。
  5. 我們的應用程式前端在 iframe 中顯示篩選後的儀表板。

如需程式碼範例,請參閱靜態嵌入參考應用程式

互動式嵌入在一個流程中驗證和授權人員

互動式嵌入與 SSO (JWTSAML) 整合,以便在一個流程中驗證和授權人員。驗證整合讓使用者屬性(例如人員的角色或部門)對應到精細層級的資料存取權變得容易,包括

使用 SSO 的互動式嵌入

Interactive embedding with SSO.

此圖表向您顯示互動式嵌入如何透過 SSO 受到保護

  1. 訪客抵達:您的前端收到顯示所有內容(包括 Metabase 元件,例如 React 元件)的請求。
  2. 載入嵌入:您的前端元件使用您的嵌入 URL載入 Metabase 前端。
  3. 檢查工作階段:若要在嵌入 URL 顯示資料,您的 Metabase 後端會檢查有效的工作階段(已登入的訪客)。
  4. 如果沒有有效的工作階段:
    • 重新導向至 SSO:您的 Metabase 前端將訪客重新導向至您的 SSO 登入頁面。
    • SSO 驗證:您的 SSO 流程驗證訪客的身分,並根據其身分產生工作階段。工作階段資訊應編碼使用者屬性,例如群組成員資格和資料沙盒權限。
    • 重新導向至 Metabase:您的 SSO 流程使用工作階段資訊將訪客重新導向至您的 Metabase 前端。
  5. 請求:您的 Metabase 前端將資料請求與工作階段資訊一起傳送至 Metabase 後端。
  6. 回應:您的 Metabase 後端根據工作階段資訊中編碼的使用者屬性傳回資料。
  7. 成功:您的前端元件顯示具有已登入訪客正確資料的嵌入式 Metabase 頁面。

步驟 4 的機制會根據您是否使用 JWTSAML 進行 SSO 而略有不同。

範例:使用 SSO 和資料沙盒保護資料安全

在我們的靜態嵌入範例中,我們使用鎖定的參數來顯示帳戶表格的安全篩選檢視。

關於互動式嵌入和 SSO 整合的好處是,我們不必為每個嵌入手動管理鎖定的參數。相反地,我們可以將使用者屬性從我們的身分提供者 (IdP) 對應到 Metabase 中的權限資料沙盒。人員可以從他們第一次登入時就獲得驗證和授權,以自助服務特定的資料子集。

讓我們擴展我們的帳戶範例,以包含租戶 ID。租戶 ID 代表一群客戶的父組織

租戶 ID 帳戶 ID 方案 狀態
999 1 基本 有效
999 2 基本 有效
999 3 基本 無效
777 4 進階 無效
777 5 進階 有效

我們仍然想要向客戶公開帳戶表格,但有一些額外要求

  • 個別客戶只能檢視其自身帳戶 ID 的資料。
  • 租戶可以檢視其所有子帳戶(但不能檢視其他租戶的資料)。

若要設定這些多租戶權限,我們需要

  1. 在我們的 IdP 中建立 primary_id 屬性,以唯一識別所有租戶和客戶。
  2. 在我們的 IdP 中建立名為 role 的使用者屬性,並為每個將使用 Metabase 的人員將其設定為 tenantcustomer
  3. 在 Metabase 中建立兩個群組:租戶和客戶。
  4. 在 Metabase 和我們的 IdP 之間同步群組成員資格,以便
    • 具有 role=tenant 的人員會指派給租戶群組。
    • 具有 role=customer 的人員會指派給客戶群組。
  5. 為每個群組設定帳戶表格的沙盒檢視
    • 對於客戶群組,帳戶表格將沙盒化(篩選)為 Account ID = primary_id
    • 對於租戶群組,帳戶表格將沙盒化為 Tenant ID = primary_id

當租戶 A 第一次使用 SSO 登入時

  • Metabase 將為他們建立一個帳戶。
  • 我們的 IdP 將 role=tenantprimary_id=999 屬性傳送至 Metabase。
  • Metabase 將自動將租戶 A 指派給租戶群組。
  • 租戶 A 將獲得租戶群組的權限(包括資料沙盒)。
  • 租戶 A 將在 Metabase 的每個地方看到帳戶表格的沙盒檢視
租戶 ID 帳戶 ID 方案 狀態
999 1 基本 有效
999 2 基本 有效
999 3 基本 無效

當客戶 1 登入時,他們將根據其 roleprimary_id 屬性看到不同篩選版本的帳戶表格

租戶 ID 帳戶 ID 方案 狀態
A 1 基本 有效

範例應用程式

延伸閱讀