Metabase 权限体系入门指南基于组的细粒度数据访问控制与多租户方案选型【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabaseMetabase 内置了一套以**用户组Groups**为核心的权限体系用于控制不同成员在数据、集合Collections、应用管理与 SQL 代码片段等层面的可见性与操作能力。本文以 docs/permissions/introduction.md 为主线系统梳理权限模型的关键规则、各权限类型的含义与配置入口并结合仓库源码如 src/metabase/permissions/说明其底层实现帮助你在自托管或嵌入式场景下搭建符合团队需求的数据安全边界。权限体系的核心要点在动手配置之前需要先理解 Metabase 权限模型的几条根本规则对应 docs/permissions/introduction.md 的 Key points权限授予对象是组Groups而不是个人。所有成员都至少属于默认的All users组。虽然权限按组配置但你也可以通过给成员设置用户属性User attributes实现人到人的差异化控制例如行级安全中的Plan属性。一个人可以同时属于多个组。多组取并集最宽松原则当成员同时属于多个组时Metabase 会取所有组中**最宽松most permissive**的权限作为该成员的最终权限。例如某成员属于三个组只要其中任意一个组对某集合拥有 Curate策展权限该成员就对该集合拥有 Curate 权限。这一点在 docs/permissions/collections.md 中也有明确说明集合权限是加性additive的。务必先封锁 All users 组由于全员默认都在 All users 组中在向其他组授予权限之前应先封锁 All users 组的数据访问否则默认可见会与你的精细化授权冲突。Metabase 在检测到 All users 组的权限比你要收紧的组更宽松时会弹出警告框提示你详见 data.md 中的 Revoke access even though All Users has greater access。从源码结构看权限的核心逻辑集中在 src/metabase/permissions/db.clj约 79 个函数定义包含权限图的读写与校验实现此外还有 src/metabase/permissions/metric.clj、src/metabase/permissions/models/collection/graph.clj 等分别处理指标、集合权限图等子领域印证了权限以组为对象、以权限图为载体的设计。可以设置权限的对象Metabase 的权限设置分布在AdminPermissions下主要分为四类权限对象控制内容说明文档数据权限Data数据库、Schema、表的访问、查询、下载与管理docs/permissions/data.md集合权限Collections问题Questions、仪表板、模型、指标、事件与时间线的访问docs/permissions/collections.md应用权限Application管理后台的设置、监控与订阅告警等功能Pro/Enterprise 计划docs/permissions/application.md代码片段文件夹权限Snippet foldersSQL 代码片段文件夹的可见性与可编辑性docs/permissions/snippets.md数据权限从库到行的五层控制数据权限是权限体系的基础针对数据库、Schema 或表可设置以下类型详见 docs/permissions/data.mdView data查看数据决定成员查看问题、仪表板、模型和指标时能看到哪些数据。其可选的权限级别包括Can view可查看数据源的全部数据前提是拥有对应集合权限。Granular允许在 Schema 或表级别分别设置注意Granular 本身不是一种权限而是在更细粒度层级已设置权限的标记。Row and column security行与列安全仅可在表级别配置基于用户属性过滤行、用自定义视图裁剪列。Impersonated连接模拟仅可在数据库级别配置将数据可见性委托给数据库中定义的角色。Blocked彻底封锁成员即使有集合权限也无法查看该数据源的问题。Create queries创建查询是否允许基于该数据源新建问题包含 Query builder and native、Query builder only 与 Granular 三个级别。Download results下载结果是否允许下载查询结果以及可下载的行数上限10 千行 / 1 百万行 / Granular。Manage table metadata管理表元数据是否允许编辑表元数据对应 docs/data-modeling/metadata-editing.md。Manage database管理数据库是否允许访问某数据库的设置页AdminDatabases 该数据库可编辑连接选项、手动同步表与扫描字段值。Transform转换控制谁能管理并运行数据库上的 transforms仅能在数据库级别设置。需要注意两个由Metabase 无法解析 SQL导致的天然限制在 data.md 中有详细说明只要组对数据库中任意一张表设置了 Blocked 或行与列安全该组对该数据库内所有表的原生 SQL 查询都会被禁用——因为 Metabase 无法判断 SQL 到底查了哪些表。原生查询结果的下载只有在组对整个数据库都有下载权限时才允许仅对部分表有下载权限Granular的组无法下载原生查询结果。集合权限控制内容资产的可见与可管理集合用于组织问题、仪表板、模型、时间线等权限分为三个级别详见 docs/permissions/collections.md操作Curate策展View查看No access无访问查看条目✅✅❌编辑标题与描述✅❌❌移动条目✅❌❌删除条目✅❌❌置顶条目✅❌❌查看事件与时间线✅✅❌编辑事件与时间线✅❌❌需要区分集合权限与数据权限集合权限只决定成员能否查看/策展已存在的问题、模型和仪表板而要修改现有查询或新建问题还需要对底层数据拥有对应的数据权限。唯一的重要例外是 Blocked即使成员对存放问题的集合拥有 Curate 权限只要其对该问题所查询的数据源被 Blocked依然无法查看该问题。应用权限管理后台功能的按需开放应用权限Pro/Enterprise 计划用于把管理后台的部分能力按组开放分为三类详见 docs/permissions/application.mdSettings access允许查看和编辑AdminSettings下的各项设置邮件、Slack、Webhooks、地图、本地化、外观、公共分享、嵌入、缓存等。Monitoring access允许查看 Monitor 监控页面出错问题、后台任务、定时任务、只读的应用日志、模型持久化日志、Admin 中的 Help 标签页以及故障排查文档。注意Dependency diagnostics仅对管理员与 Data Analysts 组开放Alerts management仅对管理员开放。Subscriptions and alerts决定哪些组可以创建仪表板订阅与问题告警将其设为 No 可完全禁止创建。代码片段文件夹权限组织而非安全边界SQL 代码片段Snippets可以放进文件夹并设置三种权限Edit access默认可查看/编辑/归档、View access只读可见、Revoke access侧边栏与输入提示中不可见。官方明确建议不要把它当作安全特性而是作为组织与标准化代码的工具——数据权限优先于代码权限且成员只要知道片段名称仍可在 SQL 中通过{{snippet: ...}}引用它详见 docs/permissions/snippets.md。多租户场景的三种权限工具当需要服务多个客户多租户时按数据的隔离方式选择对应工具对应 introduction.md 的 Tools for managing multi-tenant setups数据组织方式推荐工具核心机制所有客户共用一张表数据混存行与列安全基于用户属性在表级别过滤行、用 SQL 问题裁剪列每个客户拥有独立数据库数据库路由同一问题根据用户属性路由到不同数据库执行希望在数据库层管理权限连接模拟将用户属性映射为数据库角色执行前SET ROLE行与列安全Row and column security适用于所有客户共享一张表的混存场景可在表级别为不同组展示不同的表版本每个表 组组合最多定义一条策略。它支持两种形态详见 docs/permissions/row-and-column-security.md行级安全按表中某列与用户属性值的精确匹配过滤行例如Plan Basic。用户属性值必须与过滤值大小写精确匹配否则得到空结果。自定义视图列级安全用保存在管理员专属集合中的 SQL 问题替换原表展示可同时裁剪行与列。SQL 问题中的参数必须为必填且自定义视图的列数与数据类型必须与原表一致。值得注意的限制行与列安全只作用于查询构建器query builder问题不作用于 SQL 问题结果因此需要把涉及受限数据的 SQL 问题放入管理员专属集合并将其他组的集合权限设为 No access防止绕过。数据库路由Database routing适用于每个客户独立数据库的场景管理员用一个与所有客户库同构的router database构建问题运行时根据查看者的用户属性值与目标库的slug匹配把查询路由到对应destination database。对 Guest 嵌入而言查询始终路由到 router database访客没有 Metabase 账户无从匹配属性公共链接也不支持数据库路由。数据库路由不支持 ClickHouse、Oracle、Spark SQL、Vertica也不能用于开启了可写连接、可编辑表、Actions、CSV 上传或模型持久化的数据库。除 UI 配置外还可以通过 API 以POST /api/ee/database-routing/mirror-database?check_connection_detailstrue的方式批量添加目标库详见 docs/permissions/database-routing.md。连接模拟Impersonation适用于希望在数据库层用角色管理权限的场景管理员为数据库连接保留一个拥有完整权限的默认账号用于同步/扫描同时为各组映射用户属性到数据库角色查询执行前 Metabase 将属性值以字符串形式传入SET ROLE/USE ROLE从而让数据库自身的安全策略如表级/行级安全生效。它同时覆盖 SQL 编辑器与查询构建器是让受限组也能用原生 SQL的主要手段。当前支持 ClickHouse、MySQL、PostgreSQL注意PostgreSQL 视图中应用行级安全策略需要 15 及以上版本、Redshift、Snowflake、SQL Server、Starburst/Trino。受限组使用 SQL 编辑器时仅允许单个 SELECT 语句WITH、UNION等集合操作仍视为单个 SELECT管理员组的更宽松权限会覆盖模拟效果因此验证时需使用测试用户详见 docs/permissions/impersonation.md。嵌入场景的权限选型在嵌入式分析中可参考 docs/permissions/embedding.md 按数据组织方式选型混存数据用行与列安全或连接模拟一客户一库用数据库路由要求各库 Schema 完全一致一客户一 Schema 则通过细粒度的表级数据权限配合集合权限实现行与列安全不支持 Schema 级别。权限的底层实现与运维建议从仓库源码看权限体系在 Clojure 后端有完整的模块化实现src/metabase/permissions/db.clj权限数据读写与查询的核心包含约 79 个函数覆盖权限图的加载、校验与持久化。src/metabase/permissions/models/collection/graph.clj集合权限图的建模对应集合权限的加性合并语义。src/metabase/permissions/metric.clj指标metrics相关权限逻辑。权限相关的 HTTP API 位于 src/metabase/api/如api/common.clj中的权限校验基础设施前端管理界面则由 frontend/src/metabase/admin/permissions 下的模块驱动。结合权限模型的特点落地时建议遵循以下实践先封 All users再逐组授权这是避免默认越权的第一道防线Metabase 也会在配置冲突时给出明确警告。把敏感 SQL 问题隔离进管理员专属集合由于行与列安全、数据下载限制都不覆盖 SQL 查询结果集合权限是防止受限数据被 SQL 问题泄露的关键补充。用测试用户验证管理员组因最宽松原则看不到模拟Impersonation与行与列安全的效果务必创建带用户属性的测试账号逐一验证。理解最宽松取并集的边界行与列安全是个例外——同一成员同时命中同一张表的多条策略会产生权限冲突错误提示需要将其移出多余组或把其余组的数据访问设为 Blocked 来消除。若在配置过程中遇到成员看不到数据、无法编辑等问题可参考 docs/troubleshooting-guide/permissions.md 的排查清单关于组与用户属性的完整管理方式见 docs/people-and-groups/managing.md。总结Metabase 的权限体系以组为授权单元、以多组取最宽松为合并规则、以数据权限 集合权限 应用权限 代码片段权限为四个控制平面配合行与列安全、数据库路由与连接模拟三种多租户工具可以覆盖从单库混存到一客户一库的绝大多数数据隔离需求。理解Metabase 不解析 SQL这一底层约束是正确设计权限边界、避免数据经由 SQL 问题或公共链接泄露的关键。【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考