【问题标题】:Create secure views on snowflake在雪花上创建安全视图
【发布时间】:2019-11-21 06:32:51
【问题描述】:

我有一个表 AAA 并且我在它上面创建了一个安全视图 BBB 并定义: create or replace secure view BBB as select * from AAA

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

当我使用 RRR 执行 select * from BBB 时,它会抛出 SQL compilation error: Failure during expansion of view 'BBB': SQL compilation error: Object 'AAA' does not exist or not authorized.

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

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

我在这里错过了什么???

【问题讨论】:

    标签: view snowflake-cloud-data-platform


    【解决方案1】:

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

    grant usage on database <yourdb> to role RRR;
    grant usage on schema <yourschema> to role RRR;
    

    正如您所指出的,如果您仍然必须授予对基础表的访问权限,那么安全视图将毫无意义。

    【讨论】:

    • 感谢您添加缺少的授权声明。但我认为现有的缺陷雪花安全视图并不完全安全。我以为我遗漏了一些东西并提供了不必要的特权。会引发雪花问题来解决此问题。
    • 对不起,你为什么认为这是一个缺陷?
    • 假设我的用户当前正在使用表 'AAA' 访问数据,然后我按照上述过程引入安全视图 BBB,从表中过滤掉许多列。现在,用户总是会查询视图以获取数据,并且只会获取有限的数据集,但是,如果他们尝试从表中进行选择,他们将能够做到这一点,并且通过视图的限制变得无效。这正是我今天面临的问题,因此我称之为缺陷。
    • 您确实不需要需要授予对 AAA 的访问权限。除了视图上的 SELECT 之外,您只需要在数据库和架构上授予 USAGE 权限。
    • @KrishnaKumar 你的观察是正确的。如果您想查看该主题,我过去曾对此进行过讨论。 community.snowflake.net/s/question/0D50Z00009UuyDgSAJ/…
    【解决方案2】:
    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
    

    我的用例非常接近这个sn-p

    如果我删除

    GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO ADMIN_ROLE;
    

    我无法创建视图 如果我删除

    GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO USER_ROLE;
    

    然后

    SELECT * FROM NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW
    

    异常失败

    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.
    

    如果该方法存在一些基本缺陷,请告诉我..

    【讨论】:

    • @d.hoeffer 请看看这个
    • 不需要执行这些查询: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;
    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2023-03-16
    • 2022-11-22
    • 2021-08-27
    • 2023-03-26
    相关资源
    最近更新 更多