首页 > 解决方案 > 创建数据库从 s3 存储桶中最近复制的数据覆盖了我的数据

问题描述

创建或替换数据库“订单”;

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

标签: snowflake-cloud-data-platform

解决方案


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

至少,严格限制允许以ACCOUNTADMINSECURITYADMINSYSADMIN角色运行语句的用户。从您希望阻止执行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 …)

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

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

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_write权限,以控制他们对“订单”数据库下的模式和表的访问级别。orders_read_only继续示例:

-- 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级别特权的角色将不再能够执行诸如CREATE OR REPLACE DATABASE "Orders";.

在上面的例子中,两个角色都只接受USAGEOrders数据库的级别访问,这不允许他们再运行这样的语句。

如果您需要允许一个角色拥有这样的特权,您可以GRANT明确地将其授予在其下具有受信任用户的选择角色:

GRANT CREATE DATABASE TO ROLE role_name;

我强烈建议您多次阅读 Snowflake 的访问控制功能部分以适应术语。这使得在您的组织中实施和管理有效的访问控制变得更加容易。

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


推荐阅读