安全配置
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 的权限。请注意,虽然管理员用户默认可以访问所有数据库,但Alpha和Gamma用户需要逐个数据库地授予访问权限。
公共
要允许未登录用户访问某些 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_edit、can_show、can_delete、can_list、can_add等。例如,你可以通过在仪表板上添加can_delete来允许用户删除仪表板。 将仪表板实体分配给一个角色,并授予该用户该角色。
- 视图:视图是独立的网页,如探索视图或SQL实验室视图。 当授予用户时,他们将在菜单项中看到该视图,并能够加载该页面。
- 数据源:对于每个数据源,都会创建一个权限。如果用户没有被授予
all_datasource_access权限
,用户将只能看到授予他们的切片或探索数据源 - 数据库:授予访问数据库的权限允许用户访问该数据库内的所有 数据源,并将在SQL实验室中启用用户查询该数据库,前提是用户已被授予SQL实验室特定的权限
限制对数据源子集的访问
我们建议为用户分配Gamma角色以及任何其他可以添加 访问特定数据源的角色。我们建议您为每个访问配置文件创建单独的角色。例如,财务团队的成员可能有权访问一组 数据库和数据源;这些权限可以整合到一个角色中。具有此配置文件的用户然后需要被分配Gamma角色作为基础,以访问他们可以访问的模型和视图,以及作为数据对象权限集合的财务角色。
一个用户可以有多个与之关联的角色。例如,财务团队的高管可以被授予Gamma、Finance和Executive角色。Executive角色可以提供访问仅对高管开放的一组数据源和仪表板 的权限。在仪表板视图中,用户只能看到根据分配的角色和权限他们有权访问的仪表板。
行级安全
使用行级安全过滤器(在安全菜单下),您可以创建过滤器
这些过滤器被分配给特定的表以及一组角色。
如果您希望财务团队的成员只能访问
department = "finance"
的行,您可以:
- 使用该子句(
department = "finance"
)创建行级安全过滤器 - 然后将该子句分配给Finance角色和它适用的表
子句字段,可以包含任意文本,然后被添加到生成的
SQL语句的WHERE子句中。因此,您甚至可以做一些事情,比如创建一个过滤器
最近30天的过滤器并将其应用于特定角色,子句
像date_field > DATE_SUB(NOW(), INTERVAL 30 DAY)
。它还可以支持
多个条件:client_id = 6
AND advertiser="foo"
,等等。
所有相关的行级安全过滤器将被组合在一起(在幕后, 不同的SQL子句使用AND语句组合)。这意味着有可能 创建一个两个角色冲突的情况,从而将表子集限制为空。
例如,过滤器client_id=4
和client_id=5
,应用于一个角色,
将导致该角色的用户在查询中添加client_id=4
AND client_id=5
这永远不可能为真。
用户会话
Superset使用Flask 和Flask-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)
# 签署会话 cookie sid
SESSION_USE_SIGNER = True
内容安全策略 (CSP)
Superset 使用 Talisman 扩展来启用 内容安全策略 (CSP),这是一种增加的安全层,有助于检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击。
CSP 使服务器管理员能够通过指定浏览器应视为可执行脚本的有效来源的域名来减少或消除 XSS 发生的途径。兼容 CSP 的浏览器将仅执行从这些允许域加载的源文件中的脚本,忽略所有其他脚本(包括内联脚本和事件处理 HTML 属性)。
策略使用一系列策略指令来描述,每个指令描述了某种资源类型或策略区域的策略。您可以在此处查看可能的指令 这里。
在部署 Superset 时,正确配置内容安全策略极其重要,以防止许多类型的攻击。Superset 在 config.py
中提供了两个变量来部署 CSP:
TALISMAN_ENABLED
默认为True
;将其设置为False
以禁用 CSPTALISMAN_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() }}">
/* 我的脚本 */
</script>
-
某些仪表板使用数据 URI 加载图像,并需要在
img-src
中包含data:
img-src 'self' data:
-
MapBox 图表使用 workers 并需要连接到 MapBox 服务器,除了 Superset 源之外
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 文档 的 Options 下找到。这些通常会提高安全性,但管理员应了解它们的存在。
特别是,force_https = True
(默认值为 False
)选项可能会破坏 Superset 的 Alerts & Reports,如果工作程序配置为通过以 http://
开头的 WEBDRIVER_BASEURL
访问图表。只要 Superset 部署在上游强制执行 https,例如通过负载均衡器或应用程序网关,保持此选项禁用应该是可以接受的。否则,您可能希望启用 force_https
,如下所示:
TALISMAN_CONFIG = {
"force_https": True,
"content_security_policy": { ...
报告安全漏洞
Apache 软件基金会对其软件项目中的安全问题采取了严格的立场。Apache Superset 对其功能和功能相关的安全问题高度敏感且积极响应。
如果您 对 Superset 的安全性有疑虑,或者您发现了漏洞或潜在威胁,请不要犹豫,通过发送邮件至 security@apache.org 联系 Apache 安全团队。在邮件中,请指定项目名称为 Superset,并描述问题或潜在威胁。您还可以建议重现和复制问题的方法。 问题。安全团队和Superset社区将在评估和分析结果后回复您。
请注意,在公开披露之前,务必通过安全邮箱报告安全问题。ASF安全团队维护了一个页面,描述了如何处理漏洞和潜在威胁,请查看他们的网页了解更多详情。