PostgreSQL / 认证与授权
PostgreSQL 中的授权和认证简介
引言
控制对系统和数据的访问对于维护数据的安全性和完整性至关重要。PostgreSQL 提供了许多功能来帮助您管理这些问题,了解它们的工作原理是管理数据库的重要组成部分。
控制对资源的访问并定义谁可以对哪些实体做什么,这一领域被称为认证和授权。本指南探讨了 PostgreSQL 提供的用于控制系统访问和内部访问的工具,旨在概述每个组件及其支持的整体功能。
什么是认证和授权?
在深入了解 PostgreSQL 提供的具体工具之前,回顾认证和授权究竟是什么以及它们为何重要,将会有所帮助。
什么是认证?
认证是验证身份的过程。在计算机领域,这通常意味着验证用户或实体是否如其所言。
认证通常涉及要求用户提供他们知道的秘密信息(如密码)、他们拥有的独特物品(如手机认证应用程序中的代码),或他们独有身份特征(如指纹认证)。
证明用户身份的常见方式包括
- 密码
- 密钥
- 安全证书
- 软件或硬件令牌
- 指纹识别
认证是几乎所有多用户系统的重要要求。不同的人或实体(如自动化工具)需要不同的能力和数据访问权限,而建立身份是为客户提供个性化体验的第一步。认证是一种确认系统中账户只能由其所代表的真实世界人员或实体使用的途径。
什么是授权?
认证关注于验证身份,而授权则侧重于控制与这些身份或账户关联的能力。一旦您知道某人是谁,授权功能就决定了他们可以做什么。
授权策略中的定义通常包含三个组成部分
- 主体:执行操作的用户、账户或身份
- 操作:要执行的具体功能或活动
- 对象:操作所针对的资源、实体或范围
授权策略可以定义广泛的通用规则,也可以根据系统提供的控制级别定义具体的细粒度例外。有些策略将能力映射到用户“类”或“角色”而不是单个用户,以建立设定的授权级别。
授权是系统根据您的身份锁定能力和资源访问权限的机制。因此,它与用户管理、资源管理和安全性有着重要的关系。
PostgreSQL 如何配置认证和授权?
PostgreSQL 有几个相互关联的概念,它们共同满足其认证和授权用户访问的管理要求。这些概念协同工作,以确定客户端代表谁以及他们可以在 PostgreSQL 中做什么。
简而言之,PostgreSQL 使用以下框架来认证和授权用户访问数据库集群
- 用户和用户类别在系统中被定义为角色。
- 认证到角色的方法定义在
pg_hba.conf
文件(基于主机的认证文件)中。 - 角色的能力和访问级别由直接授予它们、通过角色成员资格或通过对象所有权授予的权限来定义。
更深入地探索这三个相互关联的领域可以帮助您了解它们各自如何促进 PostgreSQL 的访问管理功能。
角色
PostgreSQL 没有独立的实体来表示用户和组。相反,用户账户和用户组都作为单一的统一概念——角色来实现。角色是一种灵活的身份,用于表示单个用户以及用户组。
角色是 PostgreSQL 中的锚点,决定了认证和授权策略适用于谁。任何不普遍适用的策略都需要身份概念来定义谁受到限制和谁被允许。对 PostgreSQL 数据库的每次连接都与一个特定的角色相关联,该角色决定了其初始访问级别。
授权策略决定了每个角色在数据库集群中拥有哪些权限,包括它可以执行哪些命令、可以访问哪些资源以及可以使用哪些功能。用户通过认证角色来获得这些权限。
管理员可以将角色设为其他角色的成员,从而使成员获得“容器”角色的权限。这种灵活性允许您将某些角色视为用户账户的对应物,而将其他角色视为用户组、类别或职责的对应物。
单个角色可以同时作为容器和成员来实施更复杂的策略。通常,旨在用作用户代理的角色具有定义的认证策略,其授权级别由其自身的权限、其所属角色的权限以及其拥有的对象决定。相反,旨在用作组的角色通常没有相关的授权。
关于角色的专门文章涵盖了如何在 PostgreSQL 中定义和配置角色。
pg_hba.conf
文件
pg_hba.conf
文件是 PostgreSQL 中定义认证策略的主要组成部分。在此语境中,“HBA”代表基于主机的认证(host-based authentication),指的是决定是否接受连接到 PostgreSQL 主机的策略。
pg_hba.conf
文件允许管理员定义细粒度的认证要求,包括通过匹配系统来实现。连接会根据匹配条件进行测试,以确定是否应使用某个认证策略。
策略逐行定义,字段之间用空格分隔。每个策略定义匹配条件和认证要求。
匹配条件可以检查以下标准,例如
- 客户端连接方式
- 他们试图认证到的角色
- 他们试图访问的数据库
- 客户端的 IP 地址和网络属性
第一个匹配连接的认证策略用于认证。PostgreSQL 提供了各种复杂程度不同的认证方法,从密码和证书到与 LDAP 和 RADIUS 服务器等外部系统协调。
由于每个连接只咨询一个策略(第一个匹配的策略),因此控制策略的特异性和顺序非常重要。不当的顺序可能导致客户端连接匹配到错误的策略,这可能会阻止用户访问系统,或者无意中允许连接访问。
遵循我们关于在 PostgreSQL 中配置认证的指南,了解如何配置有效的 pg_hba.conf
策略。
PostgreSQL 权限和角色属性系统
PostgreSQL 授权故事的最后一部分是定义每个角色可以做什么的功能。有许多机制可以改变各种角色的访问或控制级别。
角色属性
PostgreSQL 允许您更改角色能力的第一种方式是使用角色属性。角色属性定义了角色在整个数据库集群中拥有的权限。这些权限主要是特殊的管理员级别能力,或者是对账户限制程度的表达。
最强大的属性是 superuser
属性,它赋予角色绕过 PostgreSQL 内任何授权检查的能力,实际上,允许其完全控制系统。其他属性允许更狭义的权限,例如分别使用 createrole
和 createdb
属性创建角色和数据库的能力。
属性还可以影响角色被允许访问系统的方式。例如,初始连接中需要 login
属性才能进行认证。同样,可以设置 connection limit
来控制角色可以进行的并发连接数。
角色属性是定义角色全局能力的主要手段。
PostgreSQL 使用另一个系统来确定角色对特定数据库对象(如数据库、表和列)的权限。角色与数据库对象的关系是其所有权状态和授予其权限的函数。
对象所有权
对象所有权是第一个决定因素。默认情况下,角色拥有其自己创建的任何对象。所有权赋予您对对象的完全访问权限,包括删除或修改对象本身的特殊权限。只有 superuser
角色才能删除或修改它们不拥有的对象。
每个数据库对象只有一个所有者。如果您希望多个角色拥有数据库对象的所有者权限,则需要将它们都设为单个角色的成员,并赋予该角色所有权。
授予的对象权限
非对象所有者角色可以使用 PostgreSQL 的权限授予系统获得不同级别的访问权限。
数据库对象上的权限使用 GRANT
和 REVOKE
命令管理。GRANT
命令在此上下文中用于向特定数据库对象上的角色添加权限。相反,REVOKE
命令则从角色中移除相同的权限。
如前所述,只有对象所有者和 superuser
角色才能删除或修改对象本身。但是,可以为对象内的数据或其他对象分配细粒度权限。例如,对于表,SELECT
、INSERT
、UPDATE
和 DELETE
权限分别控制角色是否可以查看、添加、修改和删除数据。
可用权限的类型取决于所讨论的数据库对象。例如,REFERENCES
权限允许角色创建与对象相关的外键约束,仅限于在表或表列对象上使用。这是因为,例如,在序列上定义外键约束权限没有意义。有关哪些权限和数据库对象可以一起使用的摘要,请查阅 PostgreSQL 权限文档中的表 5.1 和表 5.2。
请查看我们关于在 PostgreSQL 中管理权限的指南,了解有关如何使用 PostgreSQL 授权系统的更多信息。
结论
PostgreSQL 的认证和授权系统如果整体来看,最初可能会显得复杂。然而,系统中的各个组件都定义明确,并且大多只与一个关注点相关。了解这些系统如何协同工作以实现强大而灵活的访问管理,对于确保您的数据库及其数据安全至关重要。