View 在snowflake上创建安全视图

View 在snowflake上创建安全视图,view,snowflake-cloud-data-platform,View,Snowflake Cloud Data Platform,我有一个AAA表,并在其上创建了一个安全视图BBB,定义如下: 将安全视图BBB创建或替换为从AAA中选择* 我已将BBB上的选择权限授予角色RRR 当我使用它抛出的RRR从BBB执行选择*select时 SQL编译错误:扩展视图“BBB”时失败:SQL编译错误:对象“AAA”不存在或未授权。 现在,当我将AAA上的select权限授予角色RRR时 同样的查询工作正常。这就是安全视图的工作原理吗? 因为在这种情况下,表仍然是可访问的,并且视图施加的任何限制都可以通过直接访问表来丢弃。听起来一点也

我有一个AAA表,并在其上创建了一个安全视图BBB,定义如下:
将安全视图BBB创建或替换为从AAA中选择*

我已将BBB上的选择权限授予角色RRR

当我使用它抛出的RRR从BBB执行
选择*select
SQL编译错误:扩展视图“BBB”时失败:SQL编译错误:对象“AAA”不存在或未授权。

现在,当我将AAA上的select权限授予角色RRR时

同样的查询工作正常。这就是安全视图的工作原理吗? 因为在这种情况下,表仍然是可访问的,并且视图施加的任何限制都可以通过直接访问表来丢弃。听起来一点也不安全


我在这里遗漏了什么?

除了视图上的SELECT权限外,还需要在包含视图的数据库和架构上授予使用权限:

grant usage on database <yourdb> to role RRR;
grant usage on schema <yourschema> to role RRR;
将数据库上的使用权授予角色RRR;
将架构上的用法授予角色RRR;
正如您所指出的,如果您仍然必须授予对底层表的访问权,那么安全视图就没有意义了

USE ROLE SECURITYADMIN;
--CREATE ROLE ADMIN_ROLE
CREATE ROLE IF NOT EXISTS ADMIN_ROLE;
GRANT USAGE ON WAREHOUSE ADMIN_WH TO ROLE ADMIN_ROLE;
GRANT ROLE ADMIN_ROLE TO ROLE SYSADMIN;

GRANT USAGE ON DATABASE EXISTING_DB TO ADMIN_ROLE;
GRANT USAGE ON SCHEMA EXISTING_DB.EXISTING_SCHEMA TO ADMIN_ROLE;
GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO ADMIN_ROLE;

--CREATE DATA ROLES
CREATE ROLE IF NOT EXISTS USER_ROLE;
GRANT USAGE ON WAREHOUSE USER_WH TO ROLE USER_ROLE;

--USE NEW_DB DATABASE
USE DATABASE NEW_DB;
USE ROLE ADMIN_ROLE;
CREATE SCHEMA IF NOT EXISTS NEW_SCHEMA
GRANT USAGE ON DATABASE NEW_DB TO USER_ROLE;
GRANT USAGE ON SCHEMA NEW_DB.NEW_SCHEMA TO USER_ROLE;
GRANT SELECT ON FUTURE VIEWS IN SCHEMA NEW_DB.NEW_SCHEMA TO USER_ROLE;

CREATE OR REPLACE SECURE VIEW NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW AS SELECT * FROM EXISTING_DB.EXISTING_SCHEMA.MYTABLE

USE ROLE SECURITYADMIN;
GRANT USAGE ON DATABASE EXISTING_DB TO USER_ROLE;
GRANT USAGE ON SCHEMA EXISTING_DB.EXISTING_SCHEMA TO USER_ROLE;
GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO USER_ROLE;

REVOKE USAGE ON DATABASE EXISTING_DB FROM ADMIN_ROLE;
REVOKE USAGE ON SCHEMA EXISTING_DB.EXISTING_SCHEMA FROM ADMIN_ROLE;
REVOKE SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE FROM ADMIN_ROLE;

CREATE ROLE IF NOT EXISTS TEAM_ROLE;
GRANT ROLE USER_ROLE TO TEAM_ROLE;

USE ROLE TEAM_ROLE;
SELECT * FROM NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW
我的用例非常接近这个片段

如果我删除

GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO ADMIN_ROLE;
GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO USER_ROLE;
我无法创建视图 如果我删除

GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO ADMIN_ROLE;
GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO USER_ROLE;
然后

异常失败

SQL compilation error: Failure during expansion of view 'NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW': SQL compilation error: Object 'EXISTING_DB.EXISTING_SCHEMA.MYTABLE' does not exist or not authorized.

让我知道该方法是否存在一些基本缺陷。

感谢您添加缺失的grant语句。但我认为,有了现有的缺陷,雪花安全视图并不是完全安全的。我觉得我错过了什么,提供了不必要的特权。将引发雪花问题来修复此问题。抱歉,您为什么认为这是一个缺陷?假设我的用户当前正在使用表“AAA”访问数据,然后我按照上述过程引入安全视图BBB,该过程会过滤掉表中的许多列。现在,用户总是查询视图以获取数据,并且只获取有限的数据集,但是,如果他们尝试从表中进行选择,他们将能够做到这一点,并且通过视图的限制将变为null和void。这正是我今天面临的问题,因此我称之为缺陷。您不需要授予AAA访问权限。除了在视图上选择外,您只需在数据库和架构上授予使用权。@KrishnaKumar您的观察是正确的。如果你想看看这条线索,我以前也讨论过这个问题@d、 hoeffer请检查此无需执行这些查询:
将现有数据库的使用权授予用户角色
将现有模式的使用权授予用户角色
将SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE授予USER_角色
从ADMIN\u角色撤销对现有数据库的使用
从ADMIN\u角色中撤销对现有模式\u DB.EXISTING\u模式的使用
REVOKE从管理员角色中选择表EXISTING\u DB.EXISTING\u SCHEMA.MYTABLE