跳至主要内容
在 GitHub 上编辑此页面

安全配置

Superset 中的身份验证和授权由 Flask AppBuilder (FAB) 处理,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角色相同的权限集。如果有人想允许匿名用户查看仪表板,这将很有用。仍然需要对特定数据集进行显式授权,这意味着您需要编辑公共角色,并手动将公共数据源添加到该角色。

管理 Gamma 角色的数据源访问权限

以下是向用户提供特定数据集访问权限的方法。首先,确保具有有限访问权限的用户 [仅] 被分配了 Gamma 角色。其次,创建一个新角色(菜单 -> 安全 -> 列表角色),然后单击 + 号。

此新窗口允许您为该新角色命名、将其分配给用户并在权限下拉菜单中选择表。要选择要与该角色关联的数据源,只需单击下拉菜单并使用联想输入搜索表名。

然后,您可以确认分配了Gamma角色的用户是否看到了与您刚刚扩展的表关联的对象(仪表板和切片)。

用户和角色管理的 REST API

Flask-AppBuilder 支持用于用户 CRUD 的 REST API,但此功能处于测试阶段,在 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权限,则用户只能看到授予他们的切片或浏览数据源
  • 数据库:授予访问数据库的权限将允许用户访问该数据库中的所有数据源,并使用户能够在 SQL Lab 中查询该数据库,前提是已向用户授予 SQL Lab 特定权限

限制对数据源子集的访问

我们建议为用户授予Gamma角色以及任何其他会向特定数据源添加访问权限的角色。我们建议您为每个访问配置文件创建单独的角色。例如,财务团队的用户可能可以访问一组数据库和数据源;这些权限可以合并到一个角色中。然后,具有此配置文件的用户需要分配Gamma角色作为他们可以访问的模型和视图的基础,以及作为对数据对象的权限集合的财务角色。

用户可以关联多个角色。例如,财务团队的执行官可以获得Gamma财务执行官角色。执行官角色可以提供对仅供执行官使用的一组数据源和仪表板的访问权限。在仪表板视图中,用户只能看到根据分配给他们的角色和权限可以访问的仪表板。

行级安全

使用行级安全过滤器(在安全菜单下),您可以创建分配给特定表以及一组角色的过滤器。如果您想让财务团队成员只能访问department = "finance"的行,您可以

  • 使用该子句(department = "finance")创建行级安全过滤器
  • 然后将该子句分配给财务角色及其适用的表

子句字段(可以包含任意文本)将被添加到生成的 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 days") 作为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;要禁用 CSP,请将其设置为False
  • TALISMAN_CONFIG保存实际的策略定义(请参见下面的示例)以及要传递给 Talisman 的任何其他参数。

在生产模式下运行时,Superset 将在启动时检查 CSP 的存在。如果未找到 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>
  • 一些仪表盘使用 data URI 加载图像,并需要在其 img-src 中包含 data:

    img-src 'self' data:
  • MapBox 图表使用工作线程,除了 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 文档 的“选项”部分找到。这些通常会提高安全性,但管理员应该注意它们的存在。

特别是,force_https = True(默认情况下为 False)选项可能会破坏 Superset 的警报和报告,如果工作线程配置为通过以 http:// 开头的 WEBDRIVER_BASEURL 访问图表。只要 Superset 部署在 upstream 强制实施 https,例如通过负载均衡器或应用程序网关,保持此选项禁用是可以接受的。否则,您可能希望像这样启用 force_https

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

报告安全漏洞

Apache 软件基金会在其软件项目中采取了严格的立场,以消除安全问题。Apache Superset 对与其功能相关的安全问题非常敏感,并愿意及时解决。

如果您对 Superset 安全有任何疑虑,或者您发现漏洞或潜在威胁,请随时通过邮件联系 Apache 安全团队 security@apache.org。在邮件中,请说明项目名称 Superset,并描述问题或潜在威胁。我们还建议您推荐重现和复制问题的方法。安全团队和 Superset 社区将在评估和分析发现结果后与您联系。

请注意,在公共领域公开披露之前,请先通过安全电子邮件报告安全问题。ASF 安全团队维护一个页面,其中描述了如何处理漏洞和潜在威胁,请访问 他们的网页 获取更多详细信息。