创建数据库从最近从 s3 存储桶复制的数据覆盖了我的数据

Create database overwrote my data from recently copied data from s3 bucket

CREATE OR REPLACE DATABASE "Orders";

我没有对此数据库设置任何权限。我公司的另一个人 运行 上面的 SQL 替换了数据。如何使用 Snowflake 中的权限防止这种情况在未来发生?

TL;DR:Snowflake 中的全局权限 CREATE DATABASE 允许 user/role 到 运行 这样的语句。删除它需要设计一个基于角色的访问系统并撤销现有用户的管理级别权限。

至少,严格限制允许 运行 声明为 ACCOUNTADMIN, SECURITYADMIN or SYSADMIN roles 的用户。从您要阻止执行 DATABASE 级操作的一组用户中撤消这些权限:

REVOKE accountadmin FROM USER other_user1;
REVOKE securityadmin FROM USER other_user1;
REVOKE sysadmin FROM USER other_user1;

REVOKE accountadmin FROM USER other_user2;
REVOKE securityadmin FROM USER other_user2;
REVOKE sysadmin FROM USER other_user2;

(… repeat for all users that need to be limited …)

接下来,design custom roles 并定义所需的访问级别。还要根据每个角色在您组织中的职能决定哪些用户名将属于每个角色。

以下是一个非常通用和基本的示例,仅用于说明目的,它将所有 "Orders" 数据库用户分为两个访问级别。具体需求将根据您组织的独特情况而有所不同。

CREATE ROLE orders_read_and_write;
CREATE ROLE orders_read_only;

-- Snowflake recommends you create a hierarchy of roles so you can allow any
-- SYSADMIN-allowed users to manage these newly created roles instead of
-- requiring an ACCOUNTADMIN level user to do so in future
GRANT ROLE orders_read_and_write TO ROLE sysadmin;
GRANT ROLE orders_read_only TO ROLE sysadmin;

上面创建的两个角色 orders_read_and_writeorders_read_only 然后可以适当地授予权限,以控制它们对 "Orders" 数据库下的模式和表的访问级别。继续这个例子:

-- Allow both these roles to access schema and tables under "Orders" DB
-- This does not allow them to perform any DB-level operations
-- such as replacing/overwriting it

GRANT USAGE ON DATABASE "Orders" TO ROLE orders_read_and_write;
GRANT USAGE ON DATABASE "Orders" TO ROLE orders_read_only;

-- Allow read and write access appropriately to schema under the DB
-- Note the difference on using ALL vs. USAGE in the privilege granted
-- to each role here:

GRANT ALL ON SCHEMA "Orders"."SCHEMA-NAME" TO ROLE orders_read_and_write;

GRANT USAGE ON SCHEMA "Orders"."SCHEMA-NAME" TO ROLE orders_read_only;
GRANT SELECT
  ON ALL TABLES IN SCHEMA "Orders"."SCHEMA-NAME"
  TO ROLE orders_read_only;

最后,将角色授予他们各自的用户名。

GRANT ROLE orders_read_and_write TO USER other_user_1;

GRANT ROLE orders_read_only TO USER other_user_2;

(…)

任何缺少 CREATE DATABASE level privilege 的角色将无法再执行 CREATE OR REPLACE DATABASE "Orders";.

等语句

在上面的示例中,两个角色仅获得 Orders 数据库的 USAGE 级别访问权限,这不允许他们再 运行 此类语句。

如果您需要向某个角色授予这样的特权,您可以GRANT将其显式地授予其下受信任用户的选择角色:

GRANT CREATE DATABASE TO ROLE role_name;

我强烈建议您多看几次 Snowflake 的 Access Controls feature 部分以熟悉术语。这样可以更轻松地在您的组织中实施和管理有效的访问控制。

注意:引入访问控制是一个影响广泛的变化,需要您组织内部的沟通和协调才能真正有效。删除自由总是很困难,因为这可能根植于已经使用的脚本和程序中。