代理权限

代理访问仅在 ProEnterprise 套餐(包括自托管和 Metabase Cloud)中可用。

本页涵盖了名为代理的 查看数据 权限级别。

代理访问允许管理员将“查看数据”权限“外包”给您数据库中的角色。管理员可以将用户属性与数据库定义的角色及其特权关联起来。如果某人属于一个组,且其“查看数据”权限设置为“代理”,那么该用户将能够基于其用户属性指定的角色所授予的特权来查看和查询数据。

支持代理的数据库

目前,代理访问仅适用于以下数据库:

  • ClickHouse
  • MySQL
  • PostgreSQL。如果您在 PostgreSQL 中使用视图,视图上的行级安全策略仅在 Postgres 15 及更高版本中有效。
  • Redshift
  • Snowflake
  • SQL Server
  • Starburst/Trino。

如果您想根据登录用户切换数据库连接,请查看 数据库路由

代理与行和列安全

代理设置 SQL 编辑器和查询构建器中编写的问题的权限。

代理在数据库级别运行。在数据库引擎中,在查询运行前设置角色可以改变查询结果,因为角色定义了数据库执行语句时应使用的权限。

行和列安全仅为查询构建器中撰写的问题设置权限。

行和列安全在 Metabase 级别运行。由于 Metabase 无法解析 SQL 查询以找出人们可以查看的数据,因此行和列安全仅适用于在查询构建器中(Metabase 可以解释查询的地方)构建的问题。

代理用例示例

假设我们有一个 People 表,其中包含美国所有 50 个州的账户行。假设您希望您的佛蒙特州销售团队

  • 能够使用查询构建器和原生 SQL 编辑器提出问题。
  • 只能查看 People 表中居住在佛蒙特州的客户账户。

首先,您将在数据库中设置权限,创建一个具有策略的角色。然后在 Metabase 中,您将数据库的数据访问设置为“代理”,这样当人们在该数据库上运行查询时,Metabase 将使用该角色来限制他们可以看到的数据。

设置连接代理

要使代理访问生效,您首先需要在数据库中为 Metabase 设置要代理的角色,然后配置 Metabase 在人们查看或查询数据时代理这些角色。

为 Metabase 连接设置代理

代理使用数据库角色在您的数据库上运行查询,但仍然需要一个默认角色来运行 同步、扫描和指纹识别 等操作。因此,Metabase 用于 连接到您的数据库 的用户账户应具有该数据库中任何 Metabase 组可能需要访问的所有内容的访问权限,因为 Metabase 使用该数据库用户账户来同步表信息。

然后,您可以创建具有更严格数据库访问权限的角色(例如行级或表级安全)。当通过代理将角色传递到数据库时,引擎将返回数据的子集,或完全限制查询。

对于 **Redshift** 数据库,Metabase 用于 连接到您的 Redshift 数据库 的用户账户必须是超级用户,因为 Metabase 需要能够运行 SET SESSION AUTHORIZATION 命令,该命令只能由数据库超级用户运行。

在您的数据库中设置角色

在您的数据库中(而不是在 Metabase 中)

  1. 创建一个新的数据库角色(在 Redshift 中,这将是一个新用户)。
  2. 授予该角色您希望代理用户拥有的权限。

有关如何在数据库中创建新角色并授予该角色权限的详细信息,您需要查阅数据库的文档。我们也有一些关于 用户、角色和权限 的文档可以帮助您入门。

例如,如果您使用的是 PostgreSQL,下面的 SQL 将创建一个名为 vermont_sales_team 的角色,并只允许该角色在 people 表中选择 state 列的值为 VT(佛蒙特州的缩写)的行。

CREATE ROLE vermont_sales_team;

GRANT
SELECT ON ALL TABLES IN SCHEMA PUBLIC TO vermont_sales_team;


CREATE POLICY vermont ON people
FOR
SELECT TO vermont_sales_team USING (state = 'VT');


ALTER TABLE people ENABLE ROW LEVEL SECURITY;

Snowflake 连接在启用代理时应禁用辅助角色

为了使代理功能与 **Snowflake** 数据库正常工作,Metabase 用于 连接到您的 Snowflake 数据库 的用户账户必须禁用 辅助角色。您可以使用以下命令禁用辅助角色:

ALTER USER metabase_user SET DEFAULT_SECONDARY_ROLES = ();

如果您不禁用辅助角色,每个被代理的角色还将获得您授予 Metabase 用户的其他所有角色的权限。

设置 Metabase 组

Metabase 中的权限(包括代理)是通过组管理的,所以您需要

  1. 创建一个新组(或选择一个现有组)。
  2. 将人员添加到组中.

您可能想创建一个测试用户并将其添加到组中,以便稍后验证代理是否正常工作。

为组中的人员分配用户属性

要将组中的人员与您在数据库中创建的角色相关联,您将使用用户属性。

为组中的人员分配 用户属性

  • 属性的可以是任何东西。
  • 属性的必须与每个人的目标数据库角色匹配。

Setting a user attribute for impersonation

例如,如果您在数据库中创建了一个名为 vermont_sales_team 的角色,该角色可以访问与佛蒙特州销售团队相关的数据子集(如 上面的示例),您可以添加一个名为 db_role(或您想称呼该属性的任何名称)的用户属性,并将值 vermont_sales_team 分配给该人员的 db_role 属性。

某些数据库强制区分大小写,所以您可能需要确保属性值和数据库的角色完全匹配。

一个组中的人员可以具有不同的属性值,但必须具有相同的属性键。请参阅 拥有数据代理访问权限的组中的人员不一定共享相同的特权

设置代理

  1. 在 Metabase 中,按 Cmd/Ctrl + K 打开命令面板并搜索 **Permissions**,或者直接转到 **Admin settings** > **Permissions** > **Data**。

  2. 选择您想关联到您创建的数据库角色的组。

  3. 选择要配置访问权限的数据库。

  4. 在“**View data**”(查看数据)设置中,选择 **Impersonation**(代理)。此选项仅在您已 创建用户属性 后可见。

    Select impersonated permissions

    如果您的“所有用户”组对该数据库具有更宽松的访问权限(例如,“Can view”),您将看到一个警告,因为 Metabase 为人们提供了跨所有组的最宽松的数据访问权限。您需要 阻止“所有用户”组访问该数据库,然后才能设置代理。

  5. 从用户属性下拉列表中,选择您添加的、映射到您希望组在查询数据库时使用的角色的用户属性。

  6. 保存您的更改。

请记住,也要为您的组和数据库设置 “Create queries”(创建查询)权限。例如,如果您希望人们在使用代理数据库角色时能够编写 SQL,您需要将“Create queries”权限设置为“Query builder and native”(查询构建器和原生)。

验证代理权限是否生效

管理员无法从自己的账户验证代理是否生效,因此您应该创建一个测试用户,将其添加到组中并设置其用户属性。

要验证代理权限是否生效

  • 如果测试用户“Create queries”权限设置为“Create queries and native”(创建查询和原生),请创建一个 SQL 问题,并验证测试用户只能看到正确的数据。

例如,对于 vermont_sales_team 角色,如 上面的示例,您可以运行

SELECT * FROM people;

来验证测试用户是否只能看到来自佛蒙特州的数据。

  • 如果测试用户“Create queries”权限设置为“Query builder only”(仅查询构建器),请转到左侧边栏中的 **Browse data**(浏览数据),并验证用户只能看到他们有权访问的表,并且只能看到这些表中的数据,这些数据

拥有数据代理访问权限的组中的人员不一定共享相同的特权

Metabase 将使用用户属性中为每个人指定的任何角色。例如,如果您为代理选择 db_role 属性,一个人的 db_role 可能是 sales,另一个人的可能是 engineering,或者是其他映射到您数据库中有效角色的值。

使用代理设置行级 SQL 访问

您可以使用代理功能为人们提供对 SQL 编辑器的访问权限,同时限制他们对数据的访问,具体取决于特定的数据库角色。而且,这不仅仅是表级访问,还包括行级访问——或者您在数据库中为该角色定义的任何访问方式。实际上,您可以使用代理功能设置类似行和列安全的数据访问,同时允许人们使用 SQL 编辑器查询这些数据。区别在于,您不需要在 Metabase 中设置行和列安全,而是需要通过授予数据库中角色的特权来设置行级安全。

如果您想为某个组提供对该数据库中部分(而非全部)模式或表的 SQL 访问权限,您可以在数据库中创建一个额外的角色,该角色只包含这些表的子集——甚至具有特定的行级访问权限,然后使用 Metabase 的代理功能将用户属性与该角色关联起来。 Metabase 实际上会做的是,在 Metabase 执行查询之前,将用户属性作为字符串传递给数据库的 SET ROLEUSE ROLE 命令。

连接代理不适用于 Metabase 管理员组中的人员,因为他们的更宽松的特权具有更高的优先级。

Metabase 为人们提供了跨所有组的最宽松的数据访问权限

因此,如果一个人属于两个对同一数据库具有不同权限的组

  • 红色组具有代理访问权限,限制了他们可以看到的内容。
  • 蓝色组的“查看数据”设置为“Can view”(可查看),“创建查询”设置为“Query builder and native”(查询构建器和原生)。

蓝色组更宽松的访问权限将覆盖代理访问权限。

管理员将看不到代理的效果

管理员将永远看不到代理的效果,因为他们的特权将覆盖他们所属的任何其他组的特权。

Metabase 的默认管理员组对所有数据库都具有“Can view”(可查看)权限,而 Metabase 对属于多个组的任何人都使用最宽松的权限,因此任何管理员都将拥有“Can view”(可查看)权限,而不是“Impersonated”(代理)权限访问数据库。

要测试代理,请创建一个测试用户,为其分配一个具有数据库角色的用户属性,并将其添加到代理组。然后,以测试用户的身份登录并验证数据访问。

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档吗? 提议更改。
© . This site is unofficial and not affiliated with Metabase, Inc.