分析型数据库 PostgreSQL的默认安全性配置:
- 系统用户(gpadmin)不对客户开放。
- 其他用户连接默认开启密码认证。
系统用户(gpadmin)
分析型数据库 PostgreSQL要求一个 UNIX 用户 ID 来安装和初始化系统。这个系统用户在分析型数据库 PostgreSQL文档中被称作 gpadmin。gpadmin 用户是分析型数据库 PostgreSQL中的默认数据库超级管理员,也是安装及其底层数据文件的文件系统拥有者。默认的管理员账户是分析型数据库 PostgreSQL设计的根本,没有它系统无法运行,并且也没有办法限制 gpadmin 用户 ID 的访问。
这个 gpadmin 用户可以绕过所有的安全性特性。只有在执行特定系统维护任务(例如升级或扩展)时才会使用 gpadmin 登入到分析型数据库 PostgreSQL。分析型数据库 PostgreSQL不对订购的客户开放gpadmin登陆权限。
超级管理员
被授予 SUPERUSER 属性的角色是超级管理员。超级管理员会绕过所有访问特权检查和资源队列。只有系统管理员应该被给予超级管理员权利。
登录用户
为每个登入系统的用户指派一个不同的角色并且设置 LOGIN 属性。
为了登录和审计的目的,每个被允许登入分析型数据库 PostgreSQL的用户应该被给予他们自己的数据库角色。对于应用或者 Web 服务,考虑为每一种应用或服务创建一个不同的角色。
每一个登录角色应该被指派给一个单一的、非默认的资源队列。
组
使用组管理访问特权。
为每个对象/访问权限的逻辑分组创建一个组。
每个登录用户应该属于一个或者更多角色。使用 GRANT 语句给角色增加组访问。使用 REVOKE 语句从角色移除组访问。
不应该为组角色设置 LOGIN 属性。
管理数据库授权
分析型数据库 PostgreSQL使用基于角色的授权机制:权限必须被授予给其他角色(用户或组)以允许它们访问对象;每种类型的数据库对象都有不同的可以被授予的特权;同时,还支持使用时间对授权进行约束。
访问权限和角色
角色的概念包括了用户和组的概念。一个角色可以是一个数据库用户、组或者两者皆有。角色可以拥有数据库对象(例如表)并且可以把那些对象上的特权指派给其他角色以控制对那些对象的访问。角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象特权。
每一个分析型数据库 PostgreSQL系统都包含一组数据库角色(用户和组)。那些角色独立于服务器所运行的操作系统管理的用户和组。不过,为了方便用户可能想要维护操作系统用户名和分析型数据库 PostgreSQL角色名之间的关系,因为很多客户端应用使用当前的操作系统用户名作为默认的数据库用户名。
在分析型数据库 PostgreSQL中,用户通过 Master 实例登入和连接,Master 实例会验证它们的角色和访问特权。然后 Master 将在幕后用当前登入的角色向 Segment 实例发出命令。
角色被定义在系统层面上,因此它们对系统中的所有数据库都有效。
管理对象特权
当一个对象(表、视图、序列、数据库、函数、语言、方案或表空间)被创建时,它会被指派一个拥有者。拥有者通常就是执行创建语句的角色。对于大部分种类的对象,初始状态只有拥有者(或者超级用户)可以对该对象做任何事情。要允许其他角色使用对象,必须授予特权。对每一类对象,分析型数据库 PostgreSQL支持下面的特权:
对象类型 | 特权 |
---|---|
表、视图、序列 | * SELECT* INSERT* UPDATE* DELETE* RULE* ALL |
外部表 | * SELECT* RULE* ALL |
数据库 | * CONNECT* CREATE* TEMPORARY |
函数 | EXECUTE |
存储过程 | USAGE |
方案 | * CREATE* USAGE* 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;
分析型数据库 PostgreSQL当前支持对象级别的访问特权。行级或者列级访问不被支持,标记安全性也不被支持。
行级和列级访问可以使用限制被选择的行列的视图来模拟。行级标签可以通过为表增加存储敏感度信息的额外列模拟,然后使用视图来控制基于该列的行级访问。然后可以为角色授予对视图的访问而不是对基表的访问。
用时间限制访问
分析型数据库 PostgreSQL让管理员能够限制角色在特定时间的访问。可使用 CREATE ROLE 或者 ALTER ROLE 命令指定基于时间的约束。
可以用日期或者日期和时间限制访问。无需删除和重建角色就可以移除这些约束。
基于时间的约束只适用于它们指派给的角色。如果角色是另一个有时间约束的角色的成员,时间约束不会被继承。
基于时间的约束仅在登录时被实施。SET ROLE 以及 SET SESSION AUTHORIZATION 命令不受任何基于时间的约束的影响。
要为角色设置基于时间的约束,要求超级用户或者 CREATEROLE 特权。没有人可以为超级用户增加基于时间的约束。
有两种方法增加基于时间的约束。在 CREATE ROLE 或者 ALTER ROLE 命令中使用关键词 DENY,后面接上下面的一种形式:
- 访问被限制的一个日子,以及可选的时间。例如,在周三不能访问。
- 一个区间——也就是一个开始日期和结束日期以及可选的时间——在其间访问被限制。例如,从周三下午 10 点到周四上午 8 点期间不能访问。
用户可以指定多个限制,例如,周三的任何时间都不能访问并且在周五的下午 3 点到 5 点之间不能访问。
有两种方法指定一个日子。使用后面跟着带单引号的英语中平日术语的 DAY 或者 0 到 6 之间的一个数字,如下表所示。
英语术语 | 数字 |
---|---|
DAY 'Sunday' | DAY 0 |
DAY 'Monday' | DAY 1 |
DAY 'Tuesday' | DAY 2 |
DAY 'Wednesday' | DAY 3 |
DAY 'Thursday' | DAY 4 |
DAY 'Friday' | DAY 5 |
DAY 'Saturday' | DAY 6 |
日子中的时间可以以 12 小时制或者 24 小时制指定。在词 TIME 后面接上带单引号的说明。只能指定小时和分钟并且用分号分隔(:)。如果使用 12 小时制,在最后加上 AM 或者 PM。下面的例子展示了多种时间说明。
TIME '14:00' # 24小时制
TIME '02:00 PM' # 12小时制
TIME '02:00' # 24小时制。与'02:00 AM'相同
提示:基于时间的约束根据服务器时间实施。不考虑时区。
要指定一个时间区间,在其间访问被禁止,可以用词 BETWEEN 和 AND 指定两个日子/时间说明。如下所示。DAY 总是需要的。
BETWEEN DAY 'Monday' AND DAY 'Tuesday'
BETWEEN DAY 'Monday' TIME '00:00' AND
DAY 'Monday' TIME '01:00'
BETWEEN DAY 'Monday' TIME '12:00 AM' AND
DAY 'Tuesday' TIME '02:00 AM'
BETWEEN DAY 'Monday' TIME '00:00' AND
DAY 'Tuesday' TIME '02:00'
DAY 2 TIME '02:00'
最后三个语句等效。
提示 :区间不能在周六之后回卷。
下面的语法不正确:
DENY BETWEEN DAY 'Saturday' AND DAY 'Sunday'
正确的说明是使用两个 DENY 子句,如下所示:
DENY DAY 'Saturday'
DENY DAY 'Sunday'
下面的例子展示了创建带有基于时间约束的角色并且修改角色以增加基于时间的约束。只有基于时间约束所需的语句被显示。
例 1 – 创建带有基于时间约束的新角色
在周末不允许访问。
CREATE ROLE generaluser
DENY DAY 'Saturday'
DENY DAY 'Sunday'
...
例 2 – 修改角色以增加基于时间的约束
每晚的凌晨 2 点到 4 点之间不允许访问。
ALTER ROLE generaluser
DENY BETWEEN DAY 'Monday' TIME '02:00' AND DAY 'Monday' TIME '04:00'
DENY BETWEEN DAY 'Tuesday' TIME '02:00' AND DAY 'Tuesday' TIME '04:00'
DENY BETWEEN DAY 'Wednesday' TIME '02:00' AND DAY 'Wednesday' TIME '04:00'
DENY BETWEEN DAY 'Thursday' TIME '02:00' AND DAY 'Thursday' TIME '04:00'
DENY BETWEEN DAY 'Friday' TIME '02:00' AND DAY 'Friday' TIME '04:00'
DENY BETWEEN DAY 'Saturday' TIME '02:00' AND DAY 'Saturday' TIME '04:00'
DENY BETWEEN DAY 'Sunday' TIME '02:00' AND DAY 'Sunday' TIME '04:00'
...
例 3 – 修改角色以增加基于时间的约束
在周三或者周五下午的 3 点到 5 点间不允许访问。
ALTER ROLE generaluser
DENY DAY 'Wednesday'
DENY BETWEEN DAY 'Friday' TIME '15:00' AND DAY 'Friday' TIME '17:00'
删除基于时间的约束
要移除基于时间的约束,请使用 ALTER ROLE 命令。输入后面跟着要删除的日子/时间说明的关键词 DROP DENY FOR。
DROP DENY FOR DAY 'Sunday'
任何含有 DROP 子句中全部或者部分条件的约束都会被移除。例如,如果一条现有的约束否定周一和周二的访问,并且 DROP 子句移除周一的约束,则这一条现有的约束会被完全删除。DROP 子句会完全移除所有与 DROP 子句中约束交叠的约束。即便发生交叠的约束包含有比 DROP 子句更多的限制,它们也会被完全删除。
例 4 - 从一个角色移除一条基于时间的限制
ALTER ROLE generaluser
DROP DENY FOR DAY 'Monday'
...
这个语句将为例 2 中的 generaluser 角色移除所有与周一约束交叠的约束,即便其中有额外的约束。