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



创建或替换数据库"订单";

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

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

至少,严格限制允许以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_writeorders_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";之类的语句。

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

如果需要允许某个角色具有此类权限,则可以将其显式GRANT到在其下具有受信任用户的选择角色:

GRANT CREATE DATABASE TO ROLE role_name;

我强烈建议您多次浏览 Snowflake 的访问控制功能部分,以适应该术语。这样可以更轻松地在组织中实施和管理有效的访问控制。

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

相关内容

最新更新