数据库用户、角色和权限
我们建议创建一个名为 metabase 的数据库用户,并赋予以下数据库角色:
- 为任何用于分析的 schema 或表提供
analytics角色以进行读取访问。 - 可选:为用于 Metabase 操作的表提供
metabase_actions角色以进行写入访问。 - 可选:为用于 Metabase 模型持久化的 schema 提供
metabase_model_persistence角色以进行写入访问。
将特权捆绑到基于用例的角色中,可以更轻松地管理将来的特权(尤其是在 多租户情况下)。例如,您可以
- 为需要对数据库中的分析表进行只读访问的其他 BI 工具使用相同的
analytics角色,这些工具位于您的 数据栈 中。 - 撤销对
metabase_model_persistence的写入访问权限,而不会影响对metabase_actions的写入访问权限。
最低数据库特权
为了在 Metabase 中查看和查询您的表,您必须授予 Metabase 的数据库用户
- 对您的数据库的
CONNECT权限。 - 对您想在 Metabase 中使用的任何 schema 或表的
SELECT权限。
为了组织这些特权(并简化日后维护)
- 创建一个名为
analytics的数据库角色。 - 创建一个名为
metabase的数据库用户。 - 将
metabase用户添加到analytics角色。 - 将特权添加到
analytics角色。
例如,如果您使用的是 Postgres 数据库,您将以管理员身份登录并运行 SQL 语句
-- Create a role named "analytics".
CREATE ROLE analytics WITH LOGIN;
-- Add the CONNECT privilege to the role.
GRANT CONNECT ON DATABASE "your_database" TO analytics;
-- Create a database user named "metabase".
CREATE USER metabase WITH PASSWORD "your_password";
-- Give the role to the metabase user.
GRANT analytics TO metabase;
-- Add query privileges to the role (options 1-4):
-- Option 1: Uncomment the line below to let users with the analytics role query ALL DATA (In Postgres 14 or higher. See [Predefined Roles](https://postgresql.ac.cn/docs/current/predefined-roles.html#PREDEFINED-ROLES)).
-- GRANT pg_read_all_data TO analytics;
-- Option 2: Uncomment the line below to let users with the analytics role query anything in the DATABASE.
-- GRANT USAGE ON DATABASE "your_schema" TO analytics;
-- GRANT SELECT ON DATABASE "your_schema" TO analytics;
-- Option 3: Uncomment the line below to let users with the analytics role query anything in a specific SCHEMA.
-- GRANT USAGE ON SCHEMA "your_schema" TO analytics;
-- GRANT SELECT ON ALL TABLES IN SCHEMA "your_schema" TO analytics;
-- Option 4: Uncomment the line below to let users with the analytics role query anything in a specific TABLE.
-- GRANT USAGE ON SCHEMA "your_schema" TO analytics;
-- GRANT SELECT ON "your_table" IN SCHEMA "your_schema" TO analytics;
根据您使用 Metabase 的方式,您还可以额外授予
- 用于创建临时表的
TEMPORARY权限。 - 用于使用存储过程或用户定义函数的
EXECUTE权限。
请记住,当您将特权授予某个角色时,拥有该角色的所有用户都将获得这些特权。
授予所有数据库特权
如果您暂时不想组织您的数据库特权
- 创建一个
metabase数据库用户。 - 为
metabase用户授予对数据库的所有特权。
-- Create a database user named "metabase".
CREATE USER metabase WITH PASSWORD "your_password";
-- Give the user read and write privileges to anything in the database.
GRANT ALL PRIVILEGES ON "database" TO metabase;
如果您连接到本地数据库进行开发或测试,这是一个不错的选择。
启用操作和可编辑表数据的特权
操作和可编辑表数据都允许 Metabase 写回您的数据库中的特定表。
除了最低数据库特权外,您还需要授予对您希望能够写入的任何表的写入访问权限。
- 创建一个名为
metabase_writer的新角色。 - 授予该角色对相关表的
INSERT、UPDATE和DELETE权限。 - 将
metabase_writer角色授予metabase用户。
-- Create a role to bundle database privileges for Metabase writing to your database.
CREATE ROLE metabase_writer WITH LOGIN;
-- Grant write privileges to the TABLE
GRANT INSERT, UPDATE, DELETE ON "your_table" IN SCHEMA "your_schema" TO metabase_writer;
-- Grant role to the metabase user.
GRANT metabase_writer TO metabase;
启用模型持久化的特权
模型持久化允许 Metabase 将查询结果保存到您数据库中的特定 schema。Metabase 的数据库用户将需要 CREATE 权限来设置用于模型持久化的专用 schema,以及对该 schema 的写入访问权限(INSERT、UPDATE、DELETE)。
除了最低数据库特权外
- 创建一个名为
metabase_model_persistence的新角色。 - 授予该角色对数据库的
CREATE访问权限。 - 授予该角色对用于模型持久化的 schema 的
INSERT、UPDATE和DELETE权限。 - 将
metabase_model_persistence角色授予metabase用户。
-- Create a role to bundle database privileges for Metabase model persistence.
CREATE ROLE metabase_model_persistence WITH LOGIN;
-- If you don't want to give CREATE access to your database,
-- add the schema manually before enabling modeling persistence.
GRANT CREATE ON "database" TO metabase_model_persistence;
-- Grant write privileges to the SCHEMA used for model persistence.
GRANT USAGE ON "your_schema" TO metabase_model_persistence;
GRANT INSERT, UPDATE, DELETE ON "your_model's_table" IN SCHEMA "your_schema" TO metabase_model_persistence;
-- Grant role to the metabase user.
GRANT metabase_model_persistence TO metabase;
启用上传的特权
您可以将CSV 文件上传到支持的数据库。Metabase 的数据库用户应具有对您希望存储上传文件的 schema 的写入访问权限(INSERT、UPDATE、DELETE)。
您需要首先创建一个 schema 来存储上传文件(或使用现有的 schema),并告知 Metabase 您希望使用该 schema 来存储上传文件。
除了最低数据库特权外
- 创建一个名为
metabase_uploads的新角色。 - 授予该角色对您希望存储上传文件的 schema 的
INSERT、UPDATE和DELETE权限。 - 将
metabase_uploads角色授予metabase用户。
-- Create a role to bundle database privileges for uploads.
CREATE ROLE metabase_uploads WITH LOGIN;
-- Grant write privileges to the SCHEMA used for uploads.
GRANT USAGE ON "your_schema" TO metabase_uploads;
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA "your_schema" TO metabase_uploads;
-- Grant role to the metabase user.
GRANT metabase_uploads TO metabase;
多租户权限
如果您正在为需要 SQL 访问的客户设置多租户权限,您可以为每个客户创建一个数据库连接。这意味着每个客户将使用自己的数据库用户连接到数据库。
假设您有 Tangerine 和 Lemon 两位客户
- 创建新的数据库用户
metabase_tangerine和metabase_lemon。 - 创建一个具有
CONNECT权限的customer_facing_analytics角色。 - 创建角色以捆绑每个客户特定的用例特权。例如:
tangerine_queries用于捆绑 Tangerine schema 的读取特权,以便人们可以查询和创建存储过程。lemon_queries用于捆绑 Lemon schema 中表的读取特权。lemon_actions用于捆绑在 Lemon schema 的 Lemonade 表上创建操作所需的写入特权。
- 将每个用户添加到他们各自的角色。
-- Create one database user per customer.
CREATE USER metabase_tangerine WITH PASSWORD "orange";
CREATE USER metabase_lemon WITH PASSWORD "yellow";
-- Create a role to bundle privileges for all customers.
CREATE ROLE customer_facing_analytics;
GRANT CONNECT ON DATABASE "citrus" TO customer_facing_analytics;
GRANT customer_facing_analytics TO metabase_tangerine, metabase_lemon;
-- Create a role to bundle analytics read access for customer Tangerine.
CREATE ROLE tangerine_queries;
GRANT USAGE ON SCHEMA "tangerine" TO tangerine_queries;
GRANT SELECT, EXECUTE ON ALL TABLES IN SCHEMA "tangerine" TO tangerine_queries;
GRANT tangerine_queries TO metabase_tangerine;
-- Create a role to bundle analytics read access for customer Lemon.
CREATE ROLE lemon_queries;
GRANT USAGE ON SCHEMA "lemon" TO lemon_queries;
GRANT SELECT ON ALL TABLES IN SCHEMA "lemon" TO lemon_queries;
GRANT lemon_queries TO metabase_lemon;
-- Create a role to bundle privileges to Metabase actions for customer Lemon.
CREATE ROLE lemon_actions;
GRANT INSERT, UPDATE, DELETE ON TABLE "lemonade" IN SCHEMA "lemon" TO lemon_actions;
GRANT lemon_actions TO metabase_lemon;
我们建议根据每个客户的用例将特权捆绑到角色中。这样,您可以跨客户重用通用特权,同时仍然能够授予或撤销每个客户的精细特权。例如:
- 如果客户 Tangerine 需要从另一个分析工具查询 Tangerine schema,您可以在设置该工具时使用
tangerine_queries角色。 - 如果客户 Lemon 决定他们不再想使用 Metabase 操作(但他们仍然想提问),您可以简单地撤销或删除
lemon_actions角色。
延伸阅读
阅读其他版本的 Metabase 的文档。