创建或替换数据库"订单";
我没有在此数据库上设置任何权限。我公司的另一个人运行了上面的 SQL 并替换了数据。如何使用雪花中的权限防止将来发生这种情况?
TL;DR:Snowflake 中的全局权限CREATE DATABASE
允许用户/角色运行此类语句。删除它需要设计基于角色的访问系统,并撤销现有用户的管理级别权限。
至少,严格限制允许以ACCOUNTADMIN
、SECURITYADMIN
或SYSADMIN
角色运行语句的用户。从要阻止其执行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";
之类的语句。
在上面的示例中,这两个角色仅接收对Orders
数据库USAGE
级别的访问权限,这不允许它们再运行此类语句。
如果需要允许某个角色具有此类权限,则可以将其显式GRANT
到在其下具有受信任用户的选择角色:
GRANT CREATE DATABASE TO ROLE role_name;
我强烈建议您多次浏览 Snowflake 的访问控制功能部分,以适应该术语。这样可以更轻松地在组织中实施和管理有效的访问控制。
注意:引入访问控制是一项影响广泛的更改,需要组织内部的沟通和协调才能真正有效。删除自由总是很困难的,因为这可能根深蒂固地存在于已经在使用的脚本和程序中。