分享到

简介

控制对系统和数据的访问对于维护数据的安全性和完整性至关重要。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、基础设施和开发人员工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。