分享到

简介

控制对您的系统和数据的访问对于维护数据的安全性和完整性至关重要。PostgreSQL 提供了许多功能来帮助您管理这些问题,了解它们的工作原理是管理数据库的重要组成部分。

控制对资源的访问并定义谁可以对哪些实体执行哪些操作的领域称为身份验证和授权。本指南探讨了 PostgreSQL 提供的用于控制对系统及其内部访问的工具,旨在概述每个组件及其支持的整体功能。

什么是身份验证和授权?

在深入研究 PostgreSQL 提供的具体工具之前,回顾一下身份验证和授权究竟是什么以及它们为什么重要是很有帮助的。

什么是身份验证?

身份验证 是验证身份的过程。在计算中,这通常意味着验证用户或实体是否是他们声称的那个人或实体。

身份验证通常涉及要求用户提供他们知道的秘密信息(如密码)、他们拥有的独特物品(如来自手机身份验证应用程序的代码)或他们独特身份的特征(如指纹身份验证)。

证明用户身份的常用方法包括

  • 密码
  • 密钥
  • 安全证书
  • 软件或硬件令牌
  • 指纹读取

身份验证几乎是所有多用户系统的基本要求。不同的人或实体(如自动化工具)需要不同的功能和数据访问权限,而建立身份是为客户端提供个性化体验的第一步。身份验证是一种确认系统内的帐户只能由他们应该代表的真实世界的人或实体使用的方法。

什么是授权?

虽然身份验证关注验证身份,但 授权 侧重于控制与这些身份或帐户关联的功能。一旦您知道某人是谁,授权功能就会确定他们可以做什么。

授权策略中的定义通常由三个组成部分构成

  • 主体:执行操作的用户、帐户或身份
  • 操作:要执行的特定功能或活动
  • 对象:操作的目标资源、实体或范围

授权策略可以根据系统提供的控制级别定义广泛的、通用的规则以及特定的、细粒度的例外。一些策略将功能映射到用户“类”或“角色”而不是单个用户,以建立设定的授权级别。

授权是系统可以根据您的身份锁定功能和资源访问权限的机制。因此,它与用户管理、资源管理和安全性具有重要的关系。

PostgreSQL 如何配置身份验证和授权?

PostgreSQL 有一些相互关联的概念,它们共同满足其访问管理要求,以对用户操作进行身份验证和授权。这些概念协同工作,以确定客户端代表谁以及他们在 PostgreSQL 中可以做什么。

简而言之,PostgreSQL 使用以下框架对数据库集群的用户进行身份验证和授权

  • 用户和用户类在系统中被定义为角色
  • 角色的身份验证方法在 pg_hba.conf 文件(基于主机的身份验证文件)中定义。
  • 角色的功能和访问级别由直接授予他们的权限、通过角色成员资格或通过对象所有权定义。

更深入地探索这三个相互关联的领域可以帮助您了解它们中的每一个如何为 PostgreSQL 的访问管理功能做出贡献。

角色

PostgreSQL 没有单独的实体来表示用户和组。相反,用户帐户和用户组都作为称为角色的单个统一概念来实现。角色是一种灵活的身份,用于表示个人用户以及用户组。

角色是 PostgreSQL 中确定身份验证和授权策略应用于谁的锚点。任何不普遍适用的策略都需要身份概念来定义要限制谁和允许谁。与 PostgreSQL 数据库的每个连接都与一个特定的角色相关联,该角色决定其初始访问级别。

授权策略确定每个角色在数据库集群中拥有的权限,包括它可以执行哪些命令、它可以访问哪些资源以及它可以使用的哪些功能。用户对角色进行身份验证以获得对这些权限的访问权。

管理员可以将角色设置为其他角色的成员,以使成员能够访问“容器”角色的权限。这种灵活性使您可以将某些角色视为用户帐户的类似物,而将其他角色视为用户组、类或职责的类似物。

单个角色可以同时作为容器和成员来运行,以实现更复杂的策略。通常,旨在用作用户代理的角色具有定义的身份验证策略,其授权级别由其自身的权限、它们所属角色的权限以及它们拥有的对象决定。相比之下,旨在用作组的角色通常没有关联的授权。

专门介绍角色的文章涵盖了 如何在 PostgreSQL 中定义和配置角色

pg_hba.conf 文件

pg_hba.conf 文件是定义 PostgreSQL 中身份验证策略的主要组件。在此上下文中,“HBA”代表基于主机的身份验证,指的是确定是否接受与 PostgreSQL 主机的连接的策略。

pg_hba.conf 文件允许管理员定义细粒度的身份验证要求,包括通过匹配系统。连接会根据匹配条件进行测试,以确定是否应使用身份验证策略。

策略以每行一个的方式定义,字段之间用空格分隔。每个策略定义匹配条件和身份验证要求。

匹配条件可以根据以下条件进行检查

  • 客户端连接的方式
  • 他们尝试进行身份验证的角色
  • 他们尝试访问的数据库
  • 客户端的 IP 地址和网络属性

与连接匹配的第一个身份验证策略用于身份验证。PostgreSQL 提供了各种复杂程度不同的身份验证方法,从密码和证书到与外部系统(如 LDAPRADIUS 服务器)协调。

由于每个连接仅咨询单个策略(第一个匹配的策略),因此控制策略的特异性和顺序非常重要。不正确的排序可能导致客户端连接匹配不正确的策略,这可能会阻止用户访问系统或允许意外连接访问。

请关注我们的 配置 PostgreSQL 中的身份验证 指南,了解如何配置有效的 pg_hba.conf 策略。

PostgreSQL 权限和角色属性系统

PostgreSQL 授权故事的最后一部分是定义每个角色可以做什么的功能。有许多机制可以改变各种角色拥有的访问级别或控制权。

角色属性

PostgreSQL 允许您更改角色功能的第一个方法是使用 角色属性角色属性定义角色在整个数据库集群中拥有的权限。这些主要是特殊的管理员级别功能,或者是对帐户限制程度的表达。

最强大的属性是 superuser 属性,它使角色能够绕过 PostgreSQL 中的任何授权检查,实际上允许它完全控制系统。其他属性允许更狭义定义的权限,例如分别使用 createrolecreatedb 属性创建角色和数据库的能力。

属性还可以影响允许角色访问系统的方式。例如,需要 login 属性才能在初始连接中进行身份验证。同样,可以设置 connection limit 来控制角色可以建立的同时连接数。

角色属性是定义角色全局功能的主要手段。

PostgreSQL 使用另一个系统来确定角色在特定数据库对象(如数据库、表和列)方面的权限。角色与数据库对象的关系取决于其所有权状态和授予它的权限。

对象所有权

对象所有权是第一个决定因素。默认情况下,角色拥有他们自己创建的任何对象。所有权使您可以完全访问该对象,包括删除或修改对象本身等特殊权限。只有 superuser 角色才能删除或修改他们不拥有的对象。

每个数据库对象只有一个所有者。如果您希望多个角色拥有数据库对象的所有者权限,则需要将它们都设为一个角色的成员,并将该角色赋予所有权。

授予的对象权限

不是对象所有者的角色可以使用 PostgreSQL 的权限授予系统获得不同级别的访问权限。

数据库对象上的权限 通过 GRANTREVOKE 命令进行管理。当在此上下文中使用时,GRANT 命令会向特定数据库对象上的角色添加权限。另一方面,REVOKE 命令会从角色中删除相同的权限。

如前所述,只有对象所有者和 superuser 角色才能删除或修改对象本身。但是,可以为对象内的数据或其他对象分配细粒度的权限。例如,对于表,SELECTINSERTUPDATEDELETE 权限分别控制角色是否可以查看、添加、修改和删除数据。

可用权限的类型取决于所讨论的数据库对象。例如,REFERENCES 权限允许角色创建与对象相关的外键约束,仅限于在表或表列对象上使用。这是因为例如,在序列上定义外键约束权限是没有意义的。有关哪些权限和数据库对象可以一起使用的摘要,请查看 PostgreSQL 文档中关于权限的表 5.1 和表 5.2

请查看我们的 管理 PostgreSQL 中的权限 指南,以了解有关如何使用 PostgreSQL 的授权系统的更多信息。

结论

当 PostgreSQL 的身份验证和授权系统整体来看时,最初可能看起来很复杂。但是,系统的各个组件都定义明确,并且主要与单个关注点相关联。了解这些系统如何协同工作以实现强大而灵活的访问管理对于确保数据库及其保存的数据的安全至关重要。

关于作者
Justin Ellingwood

Justin Ellingwood

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