合 Greenplum的角色(用户)与权限管理(grant、revoke)
Tags: GreenPlum用户权限用户权限grantrole角色权限revoke
- 管理角色与权限
- 角色和权限的安全最佳实践
- 创建新角色(用户)
- 变更角色属性
- 角色成员
- 管理对象权限
- 模拟行级访问控制
- 加密数据
- 保护Greenplum数据库中的密码
- 基于时间的身份验证
- 配置数据库授权
- 访问权限和角色
- 管理对象特权
- 使用SHA-256加密
- 在系统范围设置加密方法
- 为单个会话设置加密方法
- 用时间限制访问
- 例 1 – 创建带有基于时间约束的新角色
- 例 2 – 修改角色以增加基于时间的约束
- 例 3 – 修改角色以增加基于时间的约束
- 删除基于时间的约束
- CREATE ROLE
- 概要
- 描述
- 参数
- 注解
- 示例
- 兼容性
- ALTER ROLE
- 概要
- 描述
- 参数
- 注意
- 示例
- 兼容性
- GRANT
- 概要
- 描述
- 参数
- 注解
- 示例
- 兼容性
- REVOKE
- 概要
- 描述
- 参数
- 注解
- 示例
- 兼容性
- 相关SQL
- 参考
管理角色与权限
Greenplum数据库授权机制存储访问数据库中数据库对象的角色和权限, 并使用SQL语句或命令行实用程序进行管理。
Greenplum数据库使用roles管理数据库访问权限。角色的概念包含用户和组的概念。 一个角色可以是一个数据库用户、一个数据库组或者两者间距。角色可以拥有数据库对象(例如表),并可以将这些对象上的 权限赋予其他角色,依此来控制对对象的访问。 角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象权限。
每个Greenplum数据库系统都包含一组数据库角色(用户和组)。这些角色与运行服务器的操作系统管理的用户和组相互独立。 但是,为方便起见,可能希望维护操作系统用户名和Greenplum数据库角色名之间的关系, 因为许多客户端应用程序使用当前操作系统用户名作为其默认值。
在Greenplum数据库中,用户通过master实例登录并连接, 然后master实例验证其角色和访问权限。 然后,master服务器以当前登录的角色的身份,将命令发布到幕后的segment实例。
角色在系统级别定义,这意味着它们对系统中的所有数据库都有效。
为了引导Greenplum数据库系统,新初始化的系统始终包含一个预定义的超级用户角色(也称为系统用户)。 该角色将与初始化Greenplum数据库系统的操作系统用户具有相同的名称。通常,此角色已命名为gpadmin。 为了创建更多角色,您首先必须以此初始角色进行连接。
角色和权限的安全最佳实践
- 保护gpadmin系统用户 Greenplum需要UNIX用户标识来安装和初始化Greenplum数据库系统。 在Greenplum文档中,该系统用户称为gpadmin。 该gpadmin是Greenplum数据库中的默认数据库超级用户, 也是Greenplum安装文件系统及基础数据文件的所有者。 此默认管理员帐户是Greenplum数据库设计的基础。 没有它,系统无法运行,并且无法限制此gpadmin用户ID的访问权限。 针对特定目的,使用角色来管理谁有权访问数据库。 应该只在系统维护任务时使用gpadmin账户,如扩展和升级。 以此用户ID登录Greenplum主机的任何人都可以读取,更改或删除任何数据,包括系统目录数据和数据库访问权限。 因此,保护gpadmin用户ID并仅提供对基本系统管理员的访问权限非常重要。 管理员只应执行某些系统维护任务(如升级或扩展)时以gpadmin账户登录Greenplum。 数据库用户永远不应登录为gpadmin,ETL或生产工作永远不应该以gpadmin运行。
- 为登录的每个用户分配不同的角色。为了记录和审计,允许每个允许登录Greenplum数据库的用户拥有自己的数据库角色。 对于应用程序或Web服务,考虑为每个应用程序或服务创建不同的角色。参阅创建新角色(用户)。
- 使用组来管理访问权限。参阅角色成员。
- 限制具有SUPERUSER角色属性的用户。 只有系统管理员才能获得超级用户权限。参阅变更角色属性。
创建新角色(用户)
用户级角色被视为可以登录数据库并启动数据库会话的数据库角色。 因此,当你使用CREATE ROLE命令创建新的用户级角色时,必须指定LOGIN权限。例如:
1 | CREATE ROLE jsmith WITH LOGIN; |
数据库角色可以具有许多属性,这些属性定义角色可以在数据库中执行的任务类型。 可以在创建角色时设置这些属性,也可以稍后使用ALTER ROLE命令。 关于可以设置的角色属性的说明,参阅Table 1。
变更角色属性
数据库角色可以具有许多属性,这些属性定义角色可以在数据库中执行的任务类型。
属性 | 描述 |
---|---|
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属性的角色,默认外部表类型是可读的, 注意使用文件或执行的外部表只能由超级用户创建。 |
PASSWORD ‘password‘ | 设置角色的密码。 如果您不打算使用密码身份验证,则可以省略此选项。 如果未指定密码,则密码将设置为空,并且该用户的密码验证将始终失败。 可以选择将空密码明确写为PASSWORD NULL。 |
ENCRYPTED | UNENCRYPTED | 控制是否将新密码在pg_authid系统目录中存储为哈希字符串。 如果没有指定ENCRYPTED,或者指定UNENCRYPTED, 则默认行为由password_encryption配置参数决定,该参数默认值为on。如果提供password字符串已经是哈希格式,无论是否指定ENCRYPTED或UNENCRYPTED都原样存储。有关保护登录密码的其他信息,参阅保护Greenplum数据库中的密码。 |
VALID UNTIL ‘timestamp‘ | 设置角色密码失效的日期和时间。如果省略,密码将始终有效。 |
RESOURCE QUEUE queue_name | 将角色分配给指定的资源队列以进行工作负载管理。 任何角色问题的声明都受资源队列限制的约束。 注意RESOURCE QUEUE属性不可继承; 必须为每个用户级别(LOGIN)角色分别设置。 |
DENY {deny_interval | deny_point} | 限制时间间隔期间的访问,按日期或日期时间指定。更多信息,参阅基于时间的身份验证。 |
可以在创建角色时设置这些属性,也可在使用ALTER ROLE命令。例如:
1 2 3 4 5 | ALTER ROLE jsmith WITH PASSWORD 'passwd123'; ALTER ROLE admin VALID UNTIL 'infinity'; ALTER ROLE jsmith LOGIN; ALTER ROLE jsmith RESOURCE QUEUE adhoc; ALTER ROLE jsmith DENY DAY 'Sunday'; |
因服务的特定设置,角色还可以具有特定于角色的默认值。例如,要为角色设置默认方案搜索路径:
1 | ALTER ROLE admin SET search_path TO myschema, public; |
角色成员
将用户组合在一起以便于管理对象权限通常很方便:这样,可以将权限授予整个组或从组中撤销。 在Greenplum数据库中,通过创建表示组的角色,然后将组角色的成员身份授予单个用户角色来完成的。
使用CREATE ROLE此SQL创建一个新的组角色。例如:
1 | CREATE ROLE admin CREATEROLE CREATEDB; |
一旦组角色存在后, 可以使用GRANT和REVOKE命令,来添加和删除成员(用户角色)。例如:
1 | GRANT admin TO john, sally;REVOKE admin FROM bob; |
为了管理对象权限,您只能为组级角色授予适当的权限(参阅Table 2)。 然后,成员用户角色将继承组角色的对象权限。例如:
1 2 3 | 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角色的成员,她可以发出以下命令来承担父角色的角色属性:
1 | => SET ROLE admin; |
管理对象权限
当对象(表、视图、序列、数据库、函数、语言、模式或表空间)时,会为其分配一个所有者。 所有者通常是执行创建语句的角色。 对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对该对象执行任何操作。 要允许其他角色使用它,必须授予权限。 Greenplum Database支持每种对象类型的以下权限:
对象类型 | 权限 |
---|---|
表、视图、序列 | 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 |
Note: 您必须单独为每个对象授予权限。 例如,授予数据库上ALL权限,并不授予对该数据库中的对象的完全访问权限。 它只授予数据库级别的(CONNECT、CREATE、TEMPORARY)到数据库本身的权限。
使用GRANT此SQL命令为对象赋予指定的角色权限。 例如,要授予名为jsmith的角色在名为mytable的表上插入权限:
1 | GRANT INSERT ON mytable TO jsmith; |
同样,授予jsmith仅为名为table2表中的名为col1的查询权限,表2:
1 | GRANT SELECT (col1) on TABLE table2 TO jsmith; |
要撤消权限,使用REVOKE命令。例如:
1 | REVOKE ALL 权限 ON mytable FROM jsmith; |
也可以使用DROP OWNED和REASSIGN OWNED命令 用于管理已弃用角色所拥有的对象(注意:只有对象的所有者或超级用户才能删除对象或重新分配所有权)。例如:
1 2 | REASSIGN OWNED BY sally TO bob; DROP OWNED BY visitor; |
模拟行级访问控制
Greenplum数据库不支持行级访问或行级标记的安全性。 可以使用视图来限制所选行的行来模拟行级访问。 可以通过向表中添加额外的列来存储敏感度信息, 然后使用视图来控制基于此列的行级访问来模拟行级标签。 然后,可以授予角色访问视图而不是基本表的权限。
加密数据
Greenplum数据库安装了一个可选的加密解密函数模块pgcrypto。 该pgcrypto函数允许数据库管理员以加密形式存储某些数据列。 这为敏感数据增加了额外的保护层, 没有加密密钥,任何人都无法读取以加密形式存储在Greenplum数据库中的数据,也无法直接从磁盘读取数据。
Note: 该pgcrypto数据库服务器内运行,这意味着在pgcrypto和客户端应用程序之间, 所有数据和密码以明文形式移动。为获得最佳安全性,还应考虑在客户端和Greenplum主服务器之间使用SSL连接。
要使用pgcrypto函数,在每个要使用此函数的数据库中,注册pgcrypto扩展。例如:
1 | $ psql -d testdb -c "CREATE EXTENSION pgcrypto" |
有关各个函数的更多信息,参阅PostgreSQL文档中的pgcrypto。
保护Greenplum数据库中的密码
在其默认配置中,Greenplum Database以MD5哈希值形式, 将登录用户密码保存在pg_authid系统目录, 而不是保存明文密码。 任何能够查看此pg_authid表的人都可以看到哈希字符串,但没有密码。 这还可确保在将数据库转储到备份文件时隐藏密码。
使用以下任何命令设置密码时执行哈希函数
- CREATE USER name WITH ENCRYPTED PASSWORD ‘password’
- CREATE ROLE name WITH LOGIN ENCRYPTED PASSWORD ‘password’
- ALTER USER name WITH ENCRYPTED PASSWORD ‘password’
- ALTER ROLE name WITH ENCRYPTED PASSWORD ‘password’
当password_encryption系统配置参数为on(这是默认值)时, ENCRYPTED关键字可以被省略。 当命令未指定ENCRYPTED或UNENCRYPTED时, password_encryption配置参数决定是存储明文密码还是哈希密码。
Note: SQL命令语法和password_encryption配置变量,包括术语加密。 但是密码在技术上并不是加密。它们是被哈希,因此无法解密。
哈希是在通过将明文密码和角色名称串起来,然后计算的。 MD5哈希生成一个前缀为md5字符的32字节十六进制字符串。 哈希密码保存在pg_authid系统表rolpassword的列。
尽管不被推荐,但密码可以以明文形式保存在数据库中,通过UNENCRYPTED命令关键词, 或者将password_encryption配置变量参数设置为off。 注意,更改配置值不会影响现有密码,只会影响新创建或更新的密码。
要全局地设置password_encryption,在命令行中使用gpadmin用户执行这些命令:
1 2 | $ gpconfig -c password_encryption -v 'off' $ gpstop -u |
要在会话中设置password_encryption,使用SQL的SET命令。例如:
1 | SET password_encryption = 'on'; |
密码可以使用SHA-256哈希算法而不是默认的MD5哈希算法进行哈希。 该算法生成一个前缀为sha256字符的64字节十六进制字符串。
Note:
虽然SHA-256使用更强的加密算法并生成更长的哈希字符串,但它不能被用于MD5认证方法。 要使用SHA-256密码哈希,必须在pg_hba.conf配置文件中,将认证方法设置为password, 以便明文密码被发送给Greenplum数据库。 由于明文密码是通过网络发送的,因此在使用SHA-256时使用SSL进行客户端连接非常重要。 另一方面,默认md5认证方法, 身份验证方法在将密码发送到Greenplum数据库之前对密码进行两次哈希处理。 一次是在密码和角色名称上,然后再次在客户端和服务器之间共享盐值,因此明文密码永远不会发送到网络。
要启用SHA-256哈希,更改password_hash_algorithm配置参数的默认值从md5为sha-256。 该参数可以全局设置或在会话级别设置。要全局地设置password_hash_algorithm,在命令行中使用gpadmin用户执行这些命令:
1 2 | $ gpconfig -c password_hash_algorithm -v 'sha-256' $ gpstop -u |
要全局地设置password_hash_algorithm,SQL的SET命令。例如:
1 | SET password_hash_algorithm = 'sha-256'; |
基于时间的身份验证
Greenplum数据库使管理员可以按角色限制对特定时间的访问。 使用CREATE ROLE或ALTER ROLE命令,指定基于时间的约束。
有关详细信息,参阅Greenplum数据库安全配置指南.
配置数据库授权
描述如何通过使用角色和权限在用户级别限制对数据库数据的授权访问。
访问权限和角色
Greenplum数据库使用角色管理数据库访问权限。角色的概念包括了用户和组的概念。一个角色可以是一个数据库用户、组或者两者皆有。角色可以拥有数据库对象(例如表)并且可以把那些对象上的特权指派给其他角色以控制对那些对象的访问。角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象特权。
每一个Greenplum数据库系统都包含一组数据库角色(用户和组)。那些角色独立于服务器所运行的操作系统管理的用户和组。不过,为了方便用户可能想要维护操作系统用户名和Greenplum数据库角色名之间的关系,因为很多客户端应用使用当前的操作系统用户名作为默认的数据库用户名。
在Greenplum数据库中,用户通过Master实例登入和连接,Master实例会验证它们的角色和访问特权。然后Master将在幕后用当前登入的角色向Segment实例发出命令。
角色被定义在系统层面上,因此它们对系统中的所有数据库都有效。
要让Greenplum数据库系统自举,刚刚初始化好的系统总是包含一个预定义的超级用户角色(也被称作系统该用户)。这个角色将和初始化Greenplum数据库系统的操作系统用户具有相同的名称。习惯上,这个角色被命名为gpadmin。要创建更多角色,用户首先必须作为这个初始角色连接。
管理对象特权
当一个对象(表、视图、序列、数据库、函数、语言、方案或表空间)被创建时,它会被指派一个拥有者。拥有者通常就是执行创建语句的角色。对于大部分种类的对象,初始状态只有拥有者(或者超级用户)可以对该对象做任何事情。要允许其他角色使用对象,必须授予特权。对每一类对象,Greenplum数据库支持下面的特权:
对象类型 | 特权 |
---|---|
表、视图、序列 | SELECT、INSERT、UPDATE、DELETE、RULE、ALL |
外部表 | SELECT、RULE、ALL |
数据库 | CONNECT、CREATE、TEMPORARY | TEMP、ALL |
函数 | EXECUTE |
Procedural Languages | USAGE |
方案 | CREATE、USAGE、ALL |
特权必须为每个对象单独授予。例如,在一个数据库上授予ALL并不会为该数据库中的对象授予完全的访问。它只授予所有的数据库级别特权(CONNECT, CREATE, TEMPORARY)给数据库本身。
使用SQL命令GRANT把对象上的特权给一个特定角色。例如:
1 | GRANT INSERT ON mytable TO jsmith; |
T要收回特权,可使用REVOKE命令。例如:
1 | REVOKE ALL PRIVILEGES ON mytable FROM jsmith; |
用户还可以使用DROP OWNED以及REASSIGN OWNED命令来管理弃用角色所拥有的对象(注意:只有对象的拥有者或者超级用户可以删除一个对象或者重新指派拥有关系)。例如:
1 2 | REASSIGN OWNED BY sally TO bob; DROP OWNED BY visitor; |
使用SHA-256加密
Greenplum数据库的访问控制大概能对应桔皮书的“C2”级安全性,而不是“B1”级。Greenplum数据库当前支持对象级别的访问特权。行级或者列级访问不被支持,标记安全性也不被支持。
行级和列级访问可以使用限制被选择的行列的视图来模拟。行级标签可以通过为表增加存储敏感度信息的额外列模拟,然后使用视图来控制基于该列的行级访问。然后可以为角色授予对视图的访问而不是对基表的访问。虽然这些变通方案不能提供和“B1”级安全性相同的安全性,但对于很多组织来说它们仍然是一种可行的替代方案。
要使用SHA-256加密,用户必须在系统或者会话级别上设置一个参数。这一节介绍如何使用一个服务器参数来实现SHA-256加密的口令存储。注意为了使用SHA-256加密进行存储,客户端认证方法必须被设置为password而不是默认的MD5(详见 配置SSL客户端连接)。这意味着口令在网络上以明文方式传输,因此我们高度推荐用户设置SSL来加密客户端和服务器之间的通信信道。
用户可以在系统范围或者以会话为基础设置选择的加密方法。可用的加密方法是SHA-256以及MD5(为了向后兼容性)。
在系统范围设置加密方法
要在整个Greenplum系统(Master及其Segment)上设置password_hash_algorithm服务器参数:
作为超级用户登入Greenplum数据库实例。
执行gpconfig把password_hash_algorithm设置为SHA-256:
1$ gpconfig -c password_hash_algorithm -v 'SHA-256'验证设置:
1$ gpconfig -s将看到:
1Master value: SHA-256Segment value: SHA-256
为单个会话设置加密方法
要为单个会话设置password_hash_algorithm服务器参数:
作为超级用户登入Greenplum数据库实例。
设置password_hash_algorithm为SHA-256:
1## set password_hash_algorithm = 'SHA-256'验证设置:
1## show password_hash_algorithm;将会看到:
1SHA-256
下面是展示新设置效果的例子:
作为超级用户登入并且验证口令哈希算法设置:
123## show password_hash_algorithm password_hash_algorithm-------------------------------SHA-256创建一个带有口令且有登录特权的新角色。
1create role testdb with password 'testdb12345#' LOGIN;更改客户端认证方法以允许SHA-256加密口令的存储:
在Master上打开pg_hba.conf文件并且加入下面的行:
1host all testdb 0.0.0.0/0 password重启集群。
作为刚创建好的用户testdb登入数据库。
1psql -U testdb在提示下输入正确的口令。
验证口令被存储为SHA-256哈希。
口令的哈希被存储在pg_authid.rolpasswod中。
作为超级用户登入。
执行下列查询:
12345## SELECT rolpassword FROM pg_authid WHERE rolname = 'testdb';Rolpassword-----------sha256<64hexadecimal characters>
用时间限制访问
Greenplum数据库让管理员能够限制角色在特定时间的访问。可使用CREATE ROLE或者ALTER ROLE命令指定基于时间的约束。
可以用日期或者日期和时间限制访问。无需删除和重建角色就可以移除这些约束。
基于时间的约束只适用于它们指派给的角色。如果角色是另一个有时间约束的角色的成员,时间约束不会被继承。
基于时间的约束仅在登录时被实施。SET ROLE以及SET SESSION AUTHORIZATION命令不受任何基于时间的约束的影响。
要为角色设置基于时间的约束,要求超级用户或者CREATEROLE特权。没有人可以为超级用户增加基于时间的约束。
有两种方法增加基于时间的约束。在CREATE ROLE或者ALTER ROLE命令中使用关键词DENY,后面接上下面的一种形式:。
- 访问被限制的一个日子,以及可选的时间。例如,在周三不能访问。
- 一个区间——也就是一个开始日期和结束日期以及可选的时间——在其间访问被限制。例如,从周三下午10点到周四上午8点期间不能访问。
用户可以指定多个限制,例如,周三的任何时间都不能访问并且在周五的下午3点到5点之间不能访问。
有两种方法指定一个日子。使用后面跟着带单引号的英语中平日术语的DAY或者0到6之间的一个数字,如下表所示。