管理角色与权限
管理角色与权限¶
SeaboxMPP数据库授权机制存储访问数据库中数据库对象的角色和权限, 并使用SQL语句或命令行实用程序进行管理。
SeaboxMPP数据库使用roles管理数据库访问权限。角色的概念包含用户和组的概念。
一个角色可以是一个数据库用户、一个数据库组或者两者兼具。角色可以拥有数据库对象(例如表),并可以将这些对象上的权限赋予其他角色,依此来控制对对象的访问。 角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象权限。
每个SeaboxMPP数据库系统都包含一组数据库角色(用户和组)。这些角色与运行服务器的操作系统管理的用户和组相互独立。 但是,为方便起见,可能希望维护操作系统用户名和SeaboxMPP数据库角色名之间的关系,因为许多客户端应用程序使用当前操作系统用户名作为其默认值。
在SeaboxMPP数据库中,用户通过coordinator实例登录并连接, 然后coordinator实例验证其角色和访问权限。 然后,coordinator服务器以当前登录的角色的身份,将命令发布到幕后的executor实例。
角色在系统级别定义,这意味着它们对系统中的所有数据库都有效。
为了引导SeaboxMPP数据库系统,新初始化的系统始终包含一个预定义的超级用户角色(也称为系统用户)。
该角色将与初始化SeaboxMPP数据库系统的操作系统用户具有相同的名称。通常,此角色已命名为seabox
。
为了创建更多角色,您首先必须以此初始角色进行连接。
角色和权限的安全最佳实践¶
-
保护seabox系统用户 SeaboxMPP需要UNIX用户标识来安装和初始化SeaboxMPP数据库系统。在SeaboxMPP文档中,该系统用户称为
seabox
。该
seabox
是SeaboxMPP数据库中的默认数据库超级用户,也是SeaboxMPP安装文件系统及基础数据文件的所有者。 此默认管理员帐户是SeaboxMPP数据库设计的基础。没有该用户,系统无法运行,并且无法限制此用户ID的访问权限。只在系统维护任务时使用seabox
账户,如扩展和升级,因为以此用户ID登录SeaboxMPP主机的任何人都可以读取,更改或删除任何数据,包括系统目录数据和数据库访问权限。因此,保护seabox用户ID并仅提供对基本系统管理员的访问权限非常重要。数据库用户永远不应登录为
seabox
,ETL或生产工作永远不应该以seabox
运行。针对特定目的,应使用角色来管理谁有权访问数据库。 -
为登录的每个用户分配不同的角色
为了记录和审计,允许每个允许登录SeaboxMPP数据库的用户拥有自己的数据库角色。对于应用程序或Web服务,考虑为每个应用程序或服务创建不同的角色。
-
**使用组来管理访问权限。
-
限制具有SUPERUSER角色属性的用户。
只有系统管理员才能获得超级用户权限,其他用户都不应该具备该属性。
创建新角色(用户)¶
用户级角色被视为可以登录数据库并启动数据库会话的数据库角色。 因此,当你使用CREATE ROLE
命令创建新的用户级角色时,必须指定LOGIN
权限。例如:
=# CREATE ROLE jsmith WITH LOGIN;
数据库角色可以具有许多属性,这些属性定义角色可以在数据库中执行的任务类型。 可以在创建角色时设置这些属性,也可以稍后使用ALTER ROLE
命令。 关于可以设置的角色属性的说明,参阅下文。
变更角色属性¶
数据库角色可以具有许多属性,这些属性定义角色可以在数据库中执行的任务类型。
- UPERUSER | 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配置参数决定,该参数默认值为'md5'。
如果提供password字符串已经是哈希格式,无论是否指定ENCRYPTED或UNENCRYPTED都原样存储。有关保护登录密码的其他信息,参阅
保护SeaboxMPP数据库中的密码
。 - VALID UNTIL 'timestamp'
- 设置角色密码失效的日期和时间。如果省略,密码将始终有效。
- DENY
- 限制时间间隔期间的访问,按日期或日期时间指定。更多信息,参阅
基于时间的身份验证
。
可以在创建角色时设置这些属性,也可在使用ALTER ROLE
命令。例如:
=# ALTER ROLE jsmith WITH PASSWORD 'passwd123';
=# ALTER ROLE admin VALID UNTIL 'infinity';
=# ALTER ROLE jsmith LOGIN;
=# ALTER ROLE jsmith DENY DAY 'Sunday';
因服务的特定设置,角色还可以具有特定于角色的默认值。例如,要为角色设置默认方案搜索路径:
=# ALTER ROLE admin SET search_path TO myschema, public;
角色成员¶
将用户组合在一起以便于管理对象权限通常很方便:这样,可以将权限授予整个组或从组中撤销。
在SeaboxMPP数据库中,通过创建表示组的角色,然后将组角色的成员身份授予单个用户角色来完成的。
使用CREATE ROLE
此SQL创建一个新的组角色。例如:
=# 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
不会像数据库对象上的普通权限那样被继承。
用户成员实际上必须SET ROLE
具有这些属性的特定角色,才能使用该属性。
在上面的例子中,我们给出了CREATEDB
和CREATEROLE
到了admin
角色。
如果sally
是admin
角色的成员,它可以发出以下命令来承担父角色的角色属性:
=> SET ROLE admin;
管理对象权限¶
当对象(表、视图、序列、数据库、函数、语言、模式或表空间)时,会为其分配一个所有者。 所有者通常是执行创建语句的角色。 对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对该对象执行任何操作。 要允许其他角色使用它,必须授予权限。 SeaboxMPP 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
注意: 必须单独为每个对象授予权限。例如,授予数据库上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;
模拟行级访问控制¶
SeaboxMPP数据库不支持行级访问或行级标记的安全性。 可以使用视图来限制所选行的行来模拟行级访问。 可以通过向表中添加额外的列来存储敏感度信息, 然后使用视图来控制基于此列的行级访问来模拟行级标签。 然后,可以授予角色访问视图而不是基本表的权限。
加密数据¶
SeaboxMPP数据库安装了一个可选的加密解密函数模块pgcrypto
。该pgcrypto
函数允许数据库管理员以加密形式存储某些数据列。这为敏感数据增加了额外的保护层, 没有加密密钥,任何人都无法读取以加密形式存储在SeaboxMPP数据库中的数据,也无法直接从磁盘读取数据。
注意:
该pgcrypto
数据库服务器内运行,这意味着在pgcrypto
和客户端应用程序之间,所有数据和密码以明文形式移动。为获得最佳安全性,还应考虑在客户端和SeaboxMPP主服务器之间使用SSL连接。
要使用pgcrypto
函数,在每个要使用此函数的数据库中,注册pgcrypto
扩展。例如:
$ ssql -d testdb -c "CREATE EXTENSION pgcrypto"
密码保护策略¶
在其默认配置中,SeaboxMPP 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'
注意:
SQL命令语法和password_encryption
配置变量,包括术语加密。但是密码在技术上并不是加密。它们是被哈希,因此无法解密。
哈希是在通过将明文密码和角色名称串起来,然后计算的。 MD5哈希生成一个前缀为md5
字符的32字节十六进制字符串。哈希密码保存在pg_authid
系统表rolpassword
的列。
尽管不被推荐,但密码可以以明文形式保存在数据库中,通过UNENCRYPTED
命令关键词。注意,更改配置值不会影响现有密码,只会影响新创建或更新的密码。
密码可以使用SHA-256哈希算法而不是默认的MD5哈希算法进行哈希。 该算法生成一个前缀为sha256
字符的64字节十六进制字符串。
注意:
虽然SHA-256使用更强的加密算法并生成更长的哈希字符串,但它不能被用于MD5认证方法。要使用SHA-256密码哈希,必须在sd_hba.conf
配置文件中,将认证方法设置为password
,以便明文密码被发送给SeaboxMPP数据库。 由于明文密码是通过网络发送的,因此在使用SHA-256时使用SSL进行客户端连接非常重要。
另一方面,默认md5
认证方法, 身份验证方法在将密码发送到SeaboxMPP数据库之前对密码进行两次哈希处理。一次是在密码和角色名称上,然后再次在客户端和服务器之间共享盐值,因此明文密码永远不会发送到网络。
要启用SHA-256哈希,更改password_encryption
配置参数的默认值从md5
为sha-256
。该参数可以全局设置或在会话级别设置。要全局地设置password_encryption
,在命令行中使用seabox
用户执行这些命令:
$ seabox config -c password_encryption -v 'scram-sha-256'
$ seabox stop
要全局地设置password_encryption
,SQL的SET
命令。例如:
=# SET password_encryption = 'scram-sha-256';
基于时间的身份验证¶
SeaboxMPP数据库使管理员可以按角色限制对特定时间的访问。 使用CREATE ROLE
或ALTER ROLE
命令,指定基于时间的约束。
有关详细信息,参阅SeaboxMPP数据库安全配置指南.