GreenPlum角色与权限控制

  • 2020-04-15
  • 浏览 (1575)

Greenplum数据库使用角色(role)管理数据库访问权限。Greenplum数据库的授权机制在数据库中存储角色以及访问数据库对象的权限,并且使用SQL语句或者命令行工具来管理它们

角色

角色的概念把用户(user)和组(group)的概念包括在内。一个角色可能是一个数据库用户、一个组或者两者兼具。角色可以拥有数据库对象(例如表)并且可以那些对象上的特权分配给其他角色来控制对对象的访问。角色可以是其他角色的成员,因此一个成员角色能够继承其父角色的对象特权。

每一个Greenplum数据库系统都包含一组数据库角色(用户和组)。这些角色与服务器所属的操作系统管理的用户和组相互独立。不过,为了便于维护操作系统用户名和Greenplum数据库角色名之间的关系,有很多客户端应用使用当前的操作系统用户名作为默认。

在Greenplum数据库中,用户通过Master实例登入并且连接,Master实例接着会验证它们的角色以及访问特权。然后Master在幕后以当前登入的角色发送命令给Segment实例。

角色被定义在系统层面上,这意味着它们对系统中所有的数据库都有效。

为了让Greenplum数据库系统自举,一个刚初始化好的系统总是有一个预定义的超级用户角色(也被称为系统用户)。这个角色的名称和初始化Greenplum数据库系统的操作系统用户相同。习惯上,这个角色被命名为gpadmin。为了创建更多角色,用户首先必须作为这个初始角色连接。

角色和权限的安全性最佳实践
  1. 保护gpadmin系统用户。出于安全考虑,要保护gpadmin系统用户。
  2. 对每个登入的用户分配一个独特的角色。
  3. 使用组来管理访问特。
  4. 限制拥有SUPERUSER角色属性的用户。 是超级用户的角色可以绕过Greenplum数据库中的所有访问特权检查以及资源队列。只有系统管理员才应该被给予超级用户权利。
创建新角色(用户)

一个用户级的角色被认为是能够登入数据库并且发起数据库会话的数据库角色。因此,在使用CREATE ROLE命令创建一个新的用户级角色时,必须指定LOGIN特权。例如:

# CREATE ROLE jsmith WITH LOGIN;

数据库角色可以有若干属性,它们定义角色可以在数据库中执行哪些任务。可以在创建角色时设置这些属性,或者在以后用ALTER ROLE命令来设置。

修改角色属性

数据库角色可以有若干属性定义角色可以在数据库中执行哪些任务。
使用alter role rolename with 命令来修改属性。角色具有的属性有(可通过\h create role查看):

属性 描述
SUPERUSER NOSUPERUSER 决定角色是否为一个超级用户。要创建一个新的超级用户,用户本身必须是超级用户。NOSUPERUSER是默认值。
CREATEDB NOCREATEDB 决定该角色是否被允许创建数据库。NOCREATEDB是默认值。
CREATEROLE NOCREATEROLE 决定该角色是否被允许创建和管理其他角色。NOCREATEROLE是默认值。
INHERIT NOINHERIT 决定一个角色是否从它的父角色继承特权。一个带有INHERIT属性的角色可以自动地使用授予给其所有直接父角色以及间接父角色的任何数据库特权。INHERIT是默认值。
LOGIN NOLOGIN 决定一个角色是否被允许登入。一个带有LOGIN属性的角色可以被认为是一个用户。没有这个属性的角色对于管理数据库特权有用(组)。NOLOGIN是默认值。
CONNECTION LIMIT connlimit 如果角色能够登入,这指定该角色能建立多少并发连接。-1(默认)表示没有限制。
CREATEEXTTABLE 及NOCREATEEXTTABLE 决定一个角色是否被允许创建外部表。NOCREATEEXTTABLE是默认值。对于一个带有CREATEEXTTABLE属性的角色,默认的外部表类型是readable,而默认的协议是gpfdist。注意使用file或execute协议的外部表只能由超级用户创建
PASSWORD ‘password’ 设置角色的口令。如果没有计划使用口令认证则可以省略这个选项。如果没有指定口令,口令将被设置为空并且该用户的口令认证总是会失败。也可以有选择地使用PASSWORD NULL显式地写入一个空口令。
ENCRYPTED 及 UNENCRYPTED 控制新口令是否在pg_authid系统目录中存储为一个哈希字符串。如果既没有指定ENCRYPTED也没有指定UNENCRYPTED,默认行为由password_encryption配置参数决定,这个参数默认是on。
VALID UNTIL ‘timestamp’ 设置一个日期和时间,在此之后该角色的口令不再有效。如果省略,则口令将会永久有效。
RESOURCE QUEUE queue_name 为负载管理的目的将角色分配到提及的资源队列。然后该角色发出的任何语句都服从于该资源队列的限制。注意RESOURCE QUEUE属性不会被继承,必须在每个用户级(LOGIN)角色上设置它。
DENY{deny_interval 或 deny_point} 在一个间隔期间限制访问,用日或者日和时间指定。

另有最新的角色属性:resource group,可以查看5.0版本后的官方文档。

角色的成员关系

将用户组织在一起以简化对象特权的管理常常会很方便:那样,特权可以被授予给一个组整体或者从一个组整体收回。在Greenplum数据库中通过创建一个表示组的角色,然后然后把这个组角色的成员关系授予给个别用户角色来实现这一点。

使用SQL命令CREATE ROLE来创建一个新的组角色。例如:

# CREATE ROLE admin CREATEROLE CREATEDB;

一旦组角色存在,用户就可以使用GRANT和REVOKE命令增加和移除成员(用户角色)。例如:

# GRANT admin TO john, sally;
# REVOKE admin FROM bob;

为了管理对象特权,用户接着会把适当的权限只授予给组级别的角色。然后成员用户角色会继承这个组角色的对象特权。例如:

# GRANT ALL ON TABLE mytable TO admin;
# GRANT ALL ON SCHEMA myschema TO admin;
# GRANT ALL ON DATABASE mydb TO admin;

角色属性LOGIN、SUPERUSER、CREATEDB、CREATEROLE、CREATEEXTTABLE以及RESOURCE QUEUE绝不会像数据库对象上的普通特权那样被继承。为了使用这些属性之一,用户成员必须实际地SET ROLE到一个具有该属性的特定角色。在上面的例子中,我们把CREATEDB和CREATEROLE给了admin角色。如果sally是admin的成员,她能够发出下列命令来夺取其父角色的角色属性:

> SET ROLE admin;

这样用户sally将拥有admin用户的所有权限。在执行一段时间之后,如果仍然希望将该会话恢复为原有权限,可以使用下列恢复方式之一:

SET ROLE sally;
SET ROLE NONE;
RESET ROLE;

要删除一个组角色,执行DROP ROLE group_role命令即可。然而在删除该组角色之后,它与其成员角色之间的关系将被立即撤销(成员角色本身不会受影响)。不过需要注意的是,在删除之前,任何属于该组角色的对象都必须先被删除或者将对象的所有者赋予其它角色,与此同时,任何赋予该组角色的权限也都必须被撤消。

管理对象特权

当一个对象(表、视图、序列、数据库、函数、语言、方案或者表空间)被创建时,它会被分配一个拥有者。拥有者通常是执行创建语句的角色。对于大部分类型的对象,初始状态是只有拥有者(或者超级用户)可以对该对象做任何事情。要允许其他角色使用它,必须授予特权。Greenplum数据库对每种对象类型支持下列特权(可通过\h grant或\h revoke查看):

对象类型 特权
表、视图、序列 SELECT、INSERT、UPDATE、DELETE、RULE、ALL
外部表 SELECT、RULE、ALL
数据库 CONNECT、CREATE、TEMPORARY 或TEMP、ALL
函数 EXECUTE
过程语言 USAGE
方案 CREATE、USAGE、ALL
自定义协议 SELECT、INSERT、UPDATE、DELETE、RULE、ALL

注意特权必须被个别地授予给每个对象。例如,在一个数据库上授予ALL并不会授予对该数据库中对象的完全访问。它只授予所有数据库级别的特权(CONNECT、CREATE、TEMPORARY)给数据库本身。

使用SQL命令GRANT在一个对象上给予一个指定的角色特权。例如:

# GRANT INSERT ON mytable TO jsmith;

要收回特权,使用REVOKE命令。例如:

# REVOKE ALL PRIVILEGES ON mytable FROM jsmith;

还可以使用DROP OWNED和REASSIGN OWNED命令来管理弃用角色拥有的对象(注意:只有对象的拥有者或者超级用户才能删除对象或者重新分配所有权)。例如:

# REASSIGN OWNED BY sally TO bob;
# DROP OWNED BY visitor;
模拟行和列级访问控制

不支持行级或者列级访问控制,也不支持标记安全性。可以使用视图来限制被选择的列或行来模拟行级和列级访问。可以对表增加一个额外的列来存储敏感度信息以模拟行级标签,然后使用视图基于这一列来控制行级访问。然后可以为角色授予这些视图的访问而不是基表的访问。

加密数据

Greenplum数据库包括一个可选的加密/解密函数包,名为pgcrypto。pgcrypto函数允许数据库管理员以加密的形式存储特定列的数据。这增加了一个额外的层来保护敏感数据,因为以加密形式存储在Greenplum数据库中的数据不能被任何没有加密密钥的人读取,也不能被直接从磁盘读取。

注意: pgcrypto函数在数据库服务器内部运行,这意味着所有的数据和口令会以明文在pgcrypto和客户端应用之前移动。为了最好的安全性,也可考虑在客户端和Greenplum的Master服务器之间使用SSL连接。
要使用pgcrypto函数,在想要使用这种能力来查询其他数据库的每个数据库中安装脚本$GPHOME/share/postgresql/contrib/pgcrypto.sql

$ psql -d testdb -f $GPHOME/share/postgresql/contrib/pgcrypto.sql
基于时间的认证

Greenplum数据库允许管理员限制角色在特定时间的访问。使用CREATE ROLE或者ALTER ROLE命令来指定基于时间的约束。

参考:
1.https://gp-docs-cn.github.io/docs/admin_guide/roles_privs.html
2.http://www.cnblogs.com/stephen-liu74/archive/2011/12/26/2302639.html

0  赞