分享到

简介

控制每个用户在您的数据库中可以执行的操作是管理数据库集群的重要部分。 PostgreSQL 提供了一套工具来控制 身份验证授权.

在身份验证方面,pg_hba.conf 文件控制人们如何连接到数据库。这包括允许访问服务器的精确用户、数据库、连接方法和身份验证方法组合。授权组件从 PostgreSQL 的 角色和角色属性 概念开始,该概念定义了系统中的用户实体并控制其全局权限。

除了角色属性提供的授权之外,还存在更深一层的授权。管理特定数据库对象的拥有权和授权是控制哪些角色可以管理、修改和查看数据库、表、序列等的主要方法。本指南将介绍如何使用 PostgreSQL 的授予和撤销机制来准确地确定哪些角色可以访问每个数据库对象。

什么是 PostgreSQL 对象权限?

在关于 角色和角色属性 的文章中,介绍了为角色定义系统范围权限的概念。使用角色属性,管理员可以定义角色是否可以创建或修改数据库、管理角色,甚至登录系统本身。这些类型的权限在整个数据库集群中都适用,因此在控制对数据库中单个对象的访问时,它们没有提供任何粒度。

相反,PostgreSQL 使用对特定数据库实体的单个授权或权利的补充系统。这允许数据库对象的拥有者确定哪些角色可以执行哪些类型的操作。这种额外的灵活性和平度使多用户和多租户部署成为可能,也使其具有实际意义。

数据库授权权限定义了各种经过身份验证的角色可用的特定操作集或访问级别。PostgreSQL 的授权系统遵循“允许列表”模型,这意味着除显式授予的权限外,角色无法访问数据库对象。

对象所有权和角色成员身份如何影响对象权限?

这个系统最基础的是对象所有权和角色成员身份的概念。在 PostgreSQL 中,每个数据库对象都只有一个拥有者,只有他以及 超级用户角色才能唯一地修改、删除和管理对象本身。对象拥有者通过授予权限来管理其他角色对对象的权限。对数据库对象授予的每个权限最终都可以由对象拥有者控制。

角色成员身份是一个系统,它赋予角色其成员角色的权限。具有 INHERIT 属性的角色是其他角色的成员,会自动获得其权限,而无需 使用 SET ROLE 更改当前角色.

例如,想象一下一个具有修改 sales 数据库中数据的权限的 salesadmin 角色。如果 sally 角色的 INHERIT 角色属性已设置,则将 sally 添加到 salesadmin 角色会自动使 sally 能够修改 sales 数据库中的数据。通过“功能”角色对属性和访问进行分组,然后根据需要将实际“用户”角色添加到这些功能角色中,继承特性的能力使灵活的访问管理风格成为可能。

系统中的每个角色默认都是 PUBLIC 角色的成员。这在定义权限时使其与“所有人”同义。

可用对象权限概述

PostgreSQL 具有许多可以授予角色以启用特定功能的权限。

权限仅适用于有意义的数据库对象的子集。例如,对数据库“执行”操作毫无意义。有关哪些权限对哪些数据库对象有效的指导,请参阅 ACL 权限缩写表访问权限摘要表 来自 PostgreSQL 文档。

以下列出了每个权限名称及其功能。您可以找到 PostgreSQL 文档中每个权限的完整说明.

  • SELECT: SELECT 权限允许角色从数据库对象中选择(读取)数据。此权限对于引用现有列值的任何 UPDATEDELETE 操作也是必需的。
  • INSERT: 提供将新数据行添加到表、视图 或列的能力。
  • UPDATE: 允许更新数据库对象中存储的列值。大多数 UPDATE 操作还需要 SELECT 权限。
  • DELETE: 允许角色从表或视图中删除行。与 UPDATE 类似,大多数 DELETE 操作也需要 SELECT 权限才能定位正确的行。
  • TRUNCATE: TRUNCATE 权限允许角色清空表或视图中的所有数据。
  • REFERENCES: 允许角色创建引用表或表列的 外键
  • TRIGGER: 允许角色在表或视图上定义触发器。
  • CREATE: 允许角色创建数据库、模式或表空间的子实体。例如,在数据库上,CREATE 权限允许角色创建新的模式,而在模式上,它允许角色创建新的数据库。
  • CONNECT: 允许角色连接到数据库。此权限在连接时进行检查。
  • TEMPORARY: 允许角色在数据库中创建临时表。
  • EXECUTE: 允许角色调用函数或 过程
  • USAGE: 允许角色对对象进行基本操作。例如,对模式的 USAGE 允许角色查找其中的对象,而对序列的 USAGE 允许角色调用 currvalnextval 函数。
  • ALL PRIVILEGES: 简写形式,赋予指定对象上的所有权限给该角色。

使用 GRANT 命令

GRANT 命令用于角色管理中的两个独立但相关的目的。

  • 授予角色对数据库对象的特定权限。
  • 将角色添加为其他角色的成员。

这两个功能反映在命令语法中的两种结构中。

要将特定数据库对象的权限授予给定角色,请使用以下形式。

GRANT <privilege> ON <database_object> TO <role> [WITH GRANT OPTION];

可选的 WITH GRANT OPTION 子句还赋予接收角色将此功能传递给其他角色的能力。例如,如果 adam 被授予 DELETE customers 数据的权限,并附带 WITH GRANT OPTION,那么他就可以选择将此功能授予 delores。实际上,这使您能够让角色管理特定对象上的某些功能。

用于将角色添加到另一个角色的另一种语法如下所示。在此上下文中,<role_member> 被赋予了 <provider_role> 的权限。

GRANT <provider_role> TO <role_member> [WITH ADMIN OPTION];

如果 <role_member> 设置了 INHERIT 属性,它将立即拥有 <provider_role> 的权限。如果此属性不存在,<role_member> 可以通过使用 SET ROLE 更改当前角色来访问 <provider_role> 的权限。

类似于另一种语法中的 WITH GRANT OPTION 子句,在授予角色成员资格时,可以选择添加 WITH ADMIN OPTION 子句。此子句还赋予角色成员添加新成员的能力。

示例

授予 sambooks 数据库的 CRUD 权限

GRANT SELECT,INSERT,UPDATE,DELETE ON "books" TO "sam";

允许 sam 将 CRUD 行为委派给 books 数据库

GRANT SELECT,INSERT,UPDATE,DELETE ON "books" TO "sam" WITH GRANT OPTION;

jasminecustomers 表拥有所有权限

GRANT ALL PRIVILEGES ON "customers" TO "jasmine";

允许 keisha 执行 order_count 函数

GRANT EXECUTE ON FUNCTION order_count(int) TO "keisha";

calin 添加到 admin 角色

GRANT "admin" TO "calin";

sofie 添加到 salesperson 角色,并允许她管理成员资格

GRANT "salesperson" TO "sofie" WITH ADMIN OPTION;

使用 REVOKE 命令

REVOKE 命令撤销角色对数据库对象的权限。在大多数情况下,它镜像了 GRANT 命令的语法,使用两种格式来涵盖这两种用例。

要从给定角色撤销对数据库对象的特定权限,请使用以下格式。

REVOKE [GRANT OPTION FOR] <privilege> ON <database_object> FROM <role> [CASCADE | RESTRICT];

在这种情况下,可以添加可选的 GRANT OPTION FOR 子句来删除指定角色传递给定权限的能力。当试图从已将权限传递给另一个角色的角色中撤销 GRANT OPTION 时,可能会发生冲突。在这种情况下,从第一个角色中删除 GRANT OPTION 将破坏赋予第二个角色其权限的授予链。

例如,如果 ada 已使用 WITH GRANT OPTION 授予 pete 更新 records 数据库内容的权限,那么 pete 就可以将更新内容的权限授予 simone。如果 adapete 撤销 GRANT OPTION,则不清楚应该对传递给 simone 的更新权限进行什么操作。

可选的 CASCADERESTRICT 子句通过明确指定在这种情况下 REVOKE 应该做什么来解决此冲突。默认行为是 RESTRICT,如果权限已被传递给另一个角色,则会导致 REVOKE GRANT OPTION FOR 命令失败。 CASCADE 选项会改变这种行为,除了指定的角色之外,还会从任何“下游”角色撤销权限,通过删除损坏的链来解决冲突。

用于撤销角色成员资格的另一种语法如下所示。

REVOKE <provider_role> FROM <member_role>;

在这种情况下,<member_role> 将不再拥有授予 <provider_role> 的权限,除非通过其他途径授予。

示例

撤销 eddylogs 表中删除行的能力

REVOKE DELETE ON "logs" FROM "eddy";

jerry 中删除所有对 finances 的访问权限

REVOKE ALL PRIVILEGES ON "finances" FROM "jerry";

删除 alicesnacks 表授予其他角色 DELETE 权限的能力。请记住,在此命令之后,alice 仍然拥有 DELETE 权限,但不再能够将此权限传递给其他角色。

REVOKE GRANT OPTION FOR DELETE ON "snacks" FROM "alice";

moderators 角色中删除 natasha

REVOKE "moderators" FROM "natasha";

撤销 tony 管理 hr 角色的成员资格的能力。请记住,tony 仍然是 hr 的成员。

REVOKE ADMIN OPTION FOR "hr" FROM "tony";

结论

PostgreSQL 的授权和权限系统允许您定义对特定数据库对象的单个角色的细粒度权限。授权系统将 PostgreSQL 的授权控制扩展到可以由其所有者管理的单个对象。

此安排允许单个用户控制自己的数据库对象。他们可以授予和撤销访问权限,以及将某些管理功能委托给其他角色。此外,相同的安排用于实现角色成员资格,以简化权限管理。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直在撰写有关数据库、Linux、基础设施和开发人员工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。