redshift 架构的只读权限

Posted

技术标签:

【中文标题】redshift 架构的只读权限【英文标题】:Readonly permissions for redshift schema 【发布时间】:2018-06-14 07:32:49 【问题描述】:

我想授予只读权限以在 redshift 中分组。 我用了这个命令

GRANT USAGE ON SCHEMA myschema TO GROUP my_group; 
GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO GROUP my_group; 
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO GROUP my_group; REVOKE CREATE ON SCHEMA myschema FROM GROUP my_group;"

这可行,但看起来如果创建了新表,则用户没有这些表的权限

根据 AWS

IN SCHEMA 架构名称

可选。如果出现 IN SCHEMA 子句,则指定的 默认权限应用于在 指定的 架构名称。在这种情况下,作为目标的用户或用户组 的 ALTER DEFAULT PRIVILEGES 必须具有 CREATE 权限 指定的架构。特定于模式的默认权限是 添加到现有的全局默认权限。默认情况下,默认 权限全局应用于整个数据库。

这是否意味着我必须向该组授予 CREATE 权限?

【问题讨论】:

【参考方案1】:

假设您使用 user_x 创建表,然后您想授予组 my_group 的 READ 权限,这是我通常用来实现此目的的命令:

ALTER DEFAULT PRIVILEGES FOR USER user_x IN SCHEMA myschema GRANT SELECT ON TABLES TO GROUP my_group;

【讨论】:

我希望如果任何用户创建表,那么它应该可以被组读取 不幸的是,我从未设法让它适用于所有用户。在我们的系统中,我们知道特定模式中的表是由 etl_user 创建的,因此我们明确知道谁在模式中创建表。【参考方案2】:

这是一个添加只读用户组的存储过程。每当创建新架构或用户时,都必须运行此 SP(仅一次)

 CREATE OR REPLACE PROCEDURE 
 public.grant_read_only_access_to_group(group_name varchar)
 LANGUAGE plpgsql
      AS $$
 declare
 s_name RECORD;
 u_s RECORD;
 begin
    
    for s_name in select schema_name from SVV_REDSHIFT_SCHEMAS where schema_name not in ('information_schema','pg_catalog')
    loop    
        execute 'REVOKE CREATE ON SCHEMA ' || quote_ident(s_name.schema_name)|| ' FROM GROUP '|| group_name;
        execute 'GRANT USAGE ON SCHEMA  '|| quote_ident(s_name.schema_name)||' TO GROUP ' || group_name;
        execute 'GRANT SELECT ON ALL TABLES IN SCHEMA '|| quote_ident(s_name.schema_name)||' TO GROUP '|| group_name;
        execute 'ALTER DEFAULT PRIVILEGES IN SCHEMA ' || quote_ident(s_name.schema_name)||' GRANT SELECT ON TABLES TO GROUP ' || group_name; 
    end loop;

        for u_s in select u.usename n , s.schema_name s ,has_schema_privilege(u.usename,s.schema_name, 'create') c 
                    from pg_user u cross join SVV_REDSHIFT_SCHEMAS s 
                    where schema_name not in ('information_schema','pg_catalog') 
                    and usesysid > 1
        loop
        if u_s.c = true then 
            execute 'ALTER DEFAULT PRIVILEGES FOR USER '||u_s.n||' IN SCHEMA ' || quote_ident(u_s.s)||' GRANT SELECT ON TABLES TO GROUP ' || group_name;
        end if;
        end loop;
end;
$$;

如何使用 SP 的示例: 只读创建组;

call grant_read_only_access_to_group('readonly');

CREATE USER readonly_user WITH PASSWORD 'pwd';

ALTER GROUP readonly ADD USER readonly_user;

【讨论】:

以上是关于redshift 架构的只读权限的主要内容,如果未能解决你的问题,请参考以下文章

如何授予 Redshift 中所有模式的使用权限?

ALTER SCHEMA NAME 是不是会影响对 Redshift 中架构的权限授予

删除 Redshift 架构中的所有表 - 不删除权限

访问 Redshift External 表所需的最低权限

如何授予 Amazon Redshift 用户读取系统表、视图、日志等的访问权限?

对新创建的模式具有默认访问权限的 Redshift 用户