跳至主要內容
在 GitHub 上編輯此頁面

安全性設定

Superset 中的身分驗證和授權由 Flask AppBuilder (FAB) 處理,這是一個建立在 Flask 之上的應用程式開發框架。FAB 提供身分驗證、使用者管理、權限和角色。請閱讀其安全性文件

提供的角色

Superset 隨附一組由 Superset 本身處理的角色。您可以假設這些角色會隨著 Superset 的發展(以及您更新 Superset 版本時)保持最新狀態。

即使管理員使用者有權限,我們也不建議變更與每個角色相關聯的權限(例如,透過移除或新增權限)。當您執行 superset init 命令時(通常在 Superset 版本之間完成),與每個角色相關聯的權限將會重新同步到其原始值。

有關這些角色的權限表格,請參閱 /RESOURCES/STANDARD_ROLES.md

管理員

管理員擁有所有可能的權利,包括授予或撤銷其他使用者的權利,以及變更其他人的切片和儀表板。

Alpha

Alpha 使用者可以存取所有資料來源,但他們無法授予或撤銷其他使用者的存取權。他們也僅限於變更他們擁有的物件。Alpha 使用者可以新增和變更資料來源。

Gamma

Gamma 使用者的存取權限有限。他們只能使用來自他們已透過另一個補充角色獲得存取權的資料來源的資料。他們只能存取檢視由他們可以存取的資料來源製作的切片和儀表板。目前 Gamma 使用者無法變更或新增資料來源。我們假設他們主要為內容消費者,但他們可以建立切片和儀表板。

另請注意,當 Gamma 使用者檢視儀表板和切片清單檢視時,他們只會看到他們有權存取的物件。

sql_lab

sql_lab 角色授予對 SQL Lab 的存取權。請注意,雖然 管理員 使用者預設可以存取所有資料庫,但 AlphaGamma 使用者都需要在每個資料庫的基礎上獲得存取權。

公開

若要允許登出使用者存取某些 Superset 功能,您可以使用 PUBLIC_ROLE_LIKE 設定並將其指派給另一個您想要將其權限傳遞給此角色的角色。

例如,透過在您的 superset_config.py 檔案中設定 PUBLIC_ROLE_LIKE = "Gamma",您授予公開角色與 Gamma 角色相同的權限集。如果要讓匿名使用者能夠檢視儀表板,這非常有用。仍然需要對特定資料集進行明確授予,這表示您需要編輯 Public 角色並手動將公開資料來源新增至該角色。

管理 Gamma 角色的資料來源存取權

以下是如何提供使用者僅存取特定資料集的權限。首先,請確保具有有限存取權的使用者已指派 [只有] Gamma 角色給他們。其次,建立一個新角色(選單 -> 安全性 -> 列出角色)並按一下 + 號。

這個新視窗可讓您為這個新角色命名、將其歸屬給使用者,並在權限下拉式選單中選取表格。若要選取您想要與此角色相關聯的資料來源,只需按一下下拉式選單並使用預先輸入功能來搜尋您的表格名稱。

然後,您可以向指派給 Gamma 角色的使用者確認,他們可以看到與您剛剛擴充的表格相關聯的物件(儀表板和切片)。

用於使用者和角色管理的 REST API

Flask-AppBuilder 支援用於使用者 CRUD 的 REST API,但此功能處於 Beta 版,並且預設未在 Superset 中啟用。若要啟用此功能,請在您的 Superset 設定中設定以下內容

FAB_ADD_SECURITY_API = True

設定完成後,其他「安全性」端點的文件將會在 Swagger 中顯示,供您探索。

自訂權限

FAB 公開的權限非常精細,可實現高度自訂。FAB 會為建立的每個模型自動建立許多權限(can_add、can_delete、can_show、can_edit、...)以及每個檢視。最重要的是,Superset 可以公開更精細的權限,例如 all_datasource_access

我們不建議變更 3 個基本角色,因為 Superset 是建立在一組假設上的。雖然您可以建立自己的角色,並將它們與現有角色結合。

權限

角色由一組權限組成,而 Superset 有許多類別的權限。以下是不同的權限類別

  • 模型和動作:模型是儀表板、切片或使用者等實體。每個模型都有一組固定的權限,例如 can_editcan_showcan_deletecan_listcan_add 等。例如,您可以允許使用者透過將對儀表板實體的 can_delete 新增至角色並授予該使用者該角色來刪除儀表板。
  • 檢視:檢視是個別的網頁,例如「探索」檢視或「SQL Lab」檢視。當授予使用者時,他們會在其選單項目中看到該檢視,並且能夠載入該頁面。
  • 資料來源:針對每個資料來源,都會建立一個權限。如果使用者未獲得 all_datasource_access permission 權限,則使用者只能看到授予給他們的切片或探索資料來源
  • 資料庫:授予對資料庫的存取權可讓使用者存取該資料庫中的所有資料來源,並讓使用者能夠在 SQL Lab 中查詢該資料庫,前提是已授予使用者 SQL Lab 特定權限

限制對資料來源子集的存取權

我們建議授予使用者 Gamma 角色,以及任何其他會新增對特定資料來源存取權的角色。我們建議您為每個存取設定檔建立個別的角色。例如,財務團隊的使用者可能可以存取一組資料庫和資料來源;這些權限可以合併到單一角色中。然後,具有此設定檔的使用者需要指派 Gamma 角色作為他們可以存取的模型和檢視的基礎,以及作為資料物件權限集合的「財務」角色。

一個使用者可以有多個與其相關聯的角色。例如,財務團隊的主管可以被授予 Gamma財務主管 角色。主管 角色可以提供對僅提供給主管的一組資料來源和儀表板的存取權。在儀表板檢視中,使用者只能看到他們有權存取的儀表板,這取決於已歸屬的角色和權限。

資料列層級安全性

使用資料列層級安全性篩選器(在安全性選單下),您可以建立指派給特定表格以及一組角色的篩選器。如果您希望財務團隊的成員只能存取 department = "finance" 的資料列,您可以

  • 建立具有該子句的資料列層級安全性篩選器 (department = "finance")
  • 然後將子句指派給 Finance 角色和它適用的表格

clause 欄位可以包含任意文字,然後會新增至產生的 SQL 陳述式的 WHERE 子句。因此,您甚至可以執行類似操作,例如為最後 30 天建立篩選器並將其套用至特定角色,並使用類似 date_field > DATE_SUB(NOW(), INTERVAL 30 DAY) 的子句。它也支援多個條件:client_id = 6 AND advertiser="foo" 等。

所有相關的資料列層級安全性篩選器將會合併在一起(在底層,不同的 SQL 子句會使用 AND 陳述式組合在一起)。這表示可能會出現兩個角色衝突的情況,從而將表格子集限制為空。

例如,套用至角色的篩選器 client_id=4client_id=5 將導致該角色的使用者將 client_id=4 AND client_id=5 新增至其查詢,而這永遠不可能為真。

使用者工作階段

Superset 使用 FlaskFlask-Login 進行使用者工作階段管理。

工作階段 Cookie 用於在要求之間維護工作階段資訊和使用者狀態,雖然它們不包含個人使用者資訊,但它們的作用是在伺服器端識別使用者工作階段。工作階段 Cookie 使用應用程式 SECRET_KEY 加密,並且用戶端無法讀取。因此,將 SECRET_KEY 保密並設定為安全且唯一且複雜的隨機值非常重要。

Flask 和 Flask-Login 提供許多組態選項來控制工作階段行為。

  • 相關的 Flask 設定

SESSION_COOKIE_HTTPONLY: (預設值:False):控制是否應使用 HttpOnly 旗標設定 Cookie。

SESSION_COOKIE_SECURE:(預設值:False) 如果 Cookie 標示為「安全」,則瀏覽器只會透過 HTTPS 將 Cookie 與要求一起傳送。應用程式必須透過 HTTPS 提供服務,這樣才有意義。

SESSION_COOKIE_SAMESITE:(預設值:"Lax") 防止瀏覽器將此 Cookie 與跨網站要求一起傳送。

PERMANENT_SESSION_LIFETIME:(預設值:「31 天」) 永久工作階段的生命週期,為 datetime.timedelta 物件。

切換到伺服器端工作階段

伺服器端會話在安全性和效能方面比用戶端會話更具優勢。啟用伺服器端會話後,會話資料會儲存在伺服器端,只會將會話 ID 發送給用戶端。當用戶登入時,會在伺服器端建立會話,並將會話 ID 以 Cookie 的形式發送給用戶端。用戶端會在每次請求時發送會話 ID,而伺服器會使用它來檢索會話資料。在登出時,伺服器端的會話會被銷毀,而用戶端的會話 Cookie 會被刪除。這降低了重播攻擊和會話劫持的風險。

Superset 使用 Flask-Session 來管理伺服器端會話。要啟用這個擴充功能,您必須設定

SESSION_SERVER_SIDE = True

Flask-Session 為 Flask 提供了多個後端會話介面,以下是一個 Redis 的範例

from redis import Redis

SESSION_TYPE = "redis"
SESSION_REDIS = Redis(host="redis", port=6379, db=0)
# sign the session cookie sid
SESSION_USE_SIGNER = True

內容安全策略 (CSP)

Superset 使用 Talisman 擴充功能來實作 內容安全策略 (CSP),這是一個額外的安全層,有助於偵測和緩解某些類型的攻擊,包括跨網站指令碼 (XSS) 和資料注入攻擊。

CSP 使伺服器管理員能夠透過指定瀏覽器應視為有效執行指令碼來源的網域,來減少或消除 XSS 可能發生的途徑。與 CSP 相容的瀏覽器將只會執行從這些允許網域接收到的來源檔案中載入的指令碼,而忽略所有其他指令碼(包括內嵌指令碼和事件處理 HTML 屬性)。

政策是使用一系列政策指令來描述的,每個指令都描述了特定資源類型或政策區域的政策。您可以在這裡查看可能的指令。

在部署 Superset 時,正確配置內容安全策略以防止多種類型的攻擊至關重要。 Superset 在 config.py 中提供了兩個變數來部署 CSP

  • TALISMAN_ENABLED 預設為 True;將其設定為 False 以停用 CSP
  • TALISMAN_CONFIG 包含實際的政策定義(請參閱下面的範例)以及要傳遞給 Talisman 的任何其他引數。

在生產模式下執行時,Superset 會在啟動時檢查是否存在 CSP。如果未找到,它會發出包含安全風險的警告。對於使用其他軟體在 Superset 外部定義 CSP 策略的環境,管理員可以使用 config.py 中的 CONTENT_SECURITY_POLICY_WARNING 鍵來停用此警告。

CSP 要求

  • Superset 需要 style-src unsafe-inline CSP 指令才能運作。

    style-src 'self' 'unsafe-inline'
  • 只有標記了 nonce 的指令碼才能被載入和執行。Nonce 是 Talisman 在每次頁面載入時自動產生的隨機字串。您可以透過呼叫 jinja 巨集 csp_nonce() 來取得目前的 nonce 值。

    <script nonce="{{ csp_nonce() }}">
    /* my script */
    </script>
  • 有些儀表板使用資料 URI 來載入影像,並且在其 img-src 中需要 data:

    img-src 'self' data:
  • MapBox 圖表使用 workers,除了 Superset 來源外,還需要連線到 MapBox 伺服器

    worker-src 'self' blob:
    connect-src 'self' https://api.mapbox.com https://events.mapbox.com
  • 其他 CSP 指令預設為 'self',以將內容限制為與 Superset 伺服器相同的來源。

為了根據您的需求調整提供的 CSP 配置,請遵循 內容安全策略參考中提供的說明和範例

其他 Talisman 安全考量

設定 TALISMAN_ENABLED = True 將會以其預設引數調用 Talisman 的保護,其中 content_security_policy 只是其中之一。這些可以在 Talisman 文件中的選項下找到。這些通常可以提高安全性,但管理員應注意它們的存在。

特別是,如果 workers 設定為透過以 http:// 開頭的 WEBDRIVER_BASEURL 來存取圖表,force_https = True 選項(預設為 False)可能會破壞 Superset 的警示和報表。只要 Superset 部署在上游強制執行 https,例如透過負載平衡器或應用程式閘道,則保持此選項停用是可以接受的。否則,您可能需要像這樣啟用 force_https

TALISMAN_CONFIG = {
"force_https": True,
"content_security_policy": { ...

回報安全性漏洞

Apache 軟體基金會在消除其軟體專案中的安全問題方面採取嚴格的立場。 Apache Superset 對於其功能和特性相關的問題非常敏感和願意處理。

如果您對 Superset 的安全性有疑慮,或者您發現了漏洞或潛在威脅,請隨時透過發送郵件至 security@apache.org 與 Apache 安全團隊聯繫。在郵件中,請指定專案名稱 Superset,並描述問題或潛在威脅。您也應建議重現和複製問題的方法。安全團隊和 Superset 社群在評估和分析調查結果後會回覆您。

請注意在公開發布之前,先透過安全電子郵件回報安全性問題。 ASF 安全團隊維護一個頁面,其中描述如何處理漏洞和潛在威脅,請查看他們的網頁以取得更多詳細資訊。