管理角色与权限
Greenplum数据库授权机制存储访问数据库中数据库对象的角色和权限, 并使用SQL语句或命令行实用程序进行管理。
Greenplum数据库使用roles管理数据库访问权限。角色的概念包含用户和组的概念。 一个角色可以是一个数据库用户、一个数据库组或者两者间距。角色可以拥有数据库对象(例如表),并可以将这些对象上的 权限赋予其他角色,依此来控制对对象的访问。 角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象权限。
每个Greenplum数据库系统都包含一组数据库角色(用户和组)。这些角色与运行服务器的操作系统管理的用户和组相互独立。 但是,为方便起见,可能希望维护操作系统用户名和Greenplum数据库角色名之间的关系, 因为许多客户端应用程序使用当前操作系统用户名作为其默认值。
在Greenplum数据库中,用户通过master实例登录并连接, 然后master实例验证其角色和访问权限。 然后,master服务器以当前登录的角色的身份,将命令发布到幕后的segment实例。
角色在系统级别定义,这意味着它们对系统中的所有数据库都有效。
为了引导Greenplum数据库系统,新初始化的系统始终包含一个预定义的超级用户角色(也称为系统用户)。 该角色将与初始化Greenplum数据库系统的操作系统用户具有相同的名称。通常,此角色已命名为gpadmin。 为了创建更多角色,您首先必须以此初始角色进行连接。
Parent topic: 管理Greenplum数据库访问
角色和权限的安全最佳实践
- 保护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权限。例如:
=# 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命令。例如:
=# 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';
因服务的特定设置,角色还可以具有特定于角色的默认值。例如,要为角色设置默认方案搜索路径:
=# ALTER ROLE admin SET search_path TO myschema, public;
角色成员
将用户组合在一起以便于管理对象权限通常很方便:这样,可以将权限授予整个组或从组中撤销。 在Greenplum数据库中,通过创建表示组的角色,然后将组角色的成员身份授予单个用户角色来完成的。
使用CREATE ROLE此SQL创建一个新的组角色。例如:
=# CREATE ROLE admin CREATEROLE CREATEDB;
一旦组角色存在后, 可以使用GRANT和REVOKE命令,来添加和删除成员(用户角色)。例如:
=# GRANT admin TO john, sally;
=# REVOKE admin FROM bob;
为了管理对象权限,您只能为组级角色授予适当的权限(参阅Table 2)。 然后,成员用户角色将继承组角色的对象权限。例如:
=# 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;
管理对象权限
当对象(表、视图、序列、数据库、函数、语言、模式或表空间)时,会为其分配一个所有者。 所有者通常是执行创建语句的角色。 对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对该对象执行任何操作。 要允许其他角色使用它,必须授予权限。 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的表上插入权限:
=# GRANT INSERT ON mytable TO jsmith;
同样,授予jsmith仅为名为table2表中的名为col1的查询权限,表2:
=# GRANT SELECT (col1) on TABLE table2 TO jsmith;
要撤消权限,使用REVOKE命令。例如:
=# REVOKE ALL 权限 ON mytable FROM jsmith;
也可以使用DROP OWNED和REASSIGN OWNED命令 用于管理已弃用角色所拥有的对象(注意:只有对象的所有者或超级用户才能删除对象或重新分配所有权)。例如:
=# REASSIGN OWNED BY sally TO bob;
=# DROP OWNED BY visitor;
模拟行级访问控制
Greenplum数据库不支持行级访问或行级标记的安全性。 可以使用视图来限制所选行的行来模拟行级访问。 可以通过向表中添加额外的列来存储敏感度信息, 然后使用视图来控制基于此列的行级访问来模拟行级标签。 然后,可以授予角色访问视图而不是基本表的权限。
加密数据
Greenplum数据库安装了一个可选的加密解密函数模块pgcrypto。 该pgcrypto函数允许数据库管理员以加密形式存储某些数据列。 这为敏感数据增加了额外的保护层, 没有加密密钥,任何人都无法读取以加密形式存储在Greenplum数据库中的数据,也无法直接从磁盘读取数据。
Note: 该pgcrypto数据库服务器内运行,这意味着在pgcrypto和客户端应用程序之间, 所有数据和密码以明文形式移动。为获得最佳安全性,还应考虑在客户端和Greenplum主服务器之间使用SSL连接。
要使用pgcrypto函数,在每个要使用此函数的数据库中,注册pgcrypto扩展。例如:
$ 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用户执行这些命令:
$ gpconfig -c password_encryption -v 'off'
$ gpstop -u
要在会话中设置password_encryption,使用SQL的SET命令。例如:
=# 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用户执行这些命令:
$ gpconfig -c password_hash_algorithm -v 'sha-256'
$ gpstop -u
要全局地设置password_hash_algorithm,SQL的SET命令。例如:
=# SET password_hash_algorithm = 'sha-256';
基于时间的身份验证
Greenplum数据库使管理员可以按角色限制对特定时间的访问。 使用CREATE ROLE或ALTER ROLE命令,指定基于时间的约束。
有关详细信息,参阅Greenplum数据库安全配置指南.