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”代表基于主机的身份验证,指的是确定是否接受对 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 的身份验证和授权系统最初可能看起来很复杂。但是,系统的各个组件都定义明确,并且大多与单个关注点相关联。了解这些系统如何协同工作以实现强大而灵活的访问管理对于确保数据库及其所持数据的安全至关重要。
