这篇文章将解说 PostgreSQL 权限体系的作业原理以及怎么检查各种目标的当时拜访操控列表(ACL)。
PostgreSQL 是最受欢迎的联系型数据库办理体系之一。当你运用本地运转的 PostgreSQL 时,为了便利起见,你只需运用一个超级用户。但在出产环境中,你需求正确设置用户和权限。
可是,虽然有很多关于怎么在PostgreSQL中刺进和查询数据的文章,但其拜访操控机制并没有得到很好的解说。本文总结了它的作业原理,作为PostgreSQL拜访操控的入门指南。
人物、目标和权限
与其他拜访操控机制相同,PostgreSQL的拜访操控能够解说为“人物X答应在目标Z上履行Y操作”。在这里,人物是用户和组,目标是数据库、表等,权限是像 SELECT
或 INSERT
这样的操作。从概念上讲,PostgreSQL的拜访操控列表(ACL)条目能够解说为一个 (role, object, privilege)
元组。
人物基本上是用户和组。它既能够作为用户,也能够作为组;你能够以人物身份登录,人物也能够属于另一个人物。每个人物都有像 LOGIN
和 INHERIT
这样的属性,表示你是否能够以该人物登录,以及该人物是否从其所属人物承继权限。你能够运用 GRANT ROLE ...
指令将人物添加到另一个人物的成员中。
在PostgreSQL中,目标包含数据库、表等。PostgreSQL目标具有树状结构。一个PostgreSQL实例能够具有多个数据库。一个数据库能够具有多个形式。一个形式能够具有多个表。
特权是在PostgreSQL目标上界说的权限。例如,表上有一个 SELECT
特权,这是在它们上面运转 SELECT
查询的权限。每种目标都有不同的特权集。
经过这些元素,你能够表达类似于“人物 readonly_user
被答应在 accounts
表上运转 SELECT
”的拜访操控装备。你能够在 www.postgresql.org/docs/15/ddl… 中检查目标类型和权限的有用组合。你能够运用 GRANT
和 REVOKE
指令添加或删除 (role, object, privilege)
元组。
承继仅发生在人物之间,而不是目标之间。由于 PostgreSQL 目标具有树状结构,你或许期望在数据库级别颁发 SELECT
权限,期望它将 SELECT
权限颁发数据库中的一切表。可是,PostgreSQL 权限并不是这样作业的。
目标一切者
每个PostgreSQL目标都有一个名为“一切者”的特殊人物。只要一切者才干履行某些操作,如 ALTER TABLE
,而你不能将 GRANT
这样的权限颁发非一切者。
有时候,你或许期望为一个目标分配两个以上的一切者。假定你有两个人物, app_user
和 sre_user
,你期望这两个用户都能运转 ALTER TABLE
,而这只要一切者才干做到。由于每个目标只能有一个一切者,你不能直接让这两个用户都成为一切者。同时, ALTER TABLE
不是你能够将其 GRANT
到人物的内容。
你能够运用人物承继来解决此问题。创立 table_owner
人物和 GRANT table_owner TO app_user, sre_user
,然后像 ALTER TABLE my_table OWNER TO table_owner
那样搬运一切者人物。现在表的一切者是 table_owner
,可是由于 app_user
和 sre_user
是该人物的成员,所以他们也具有承继权限来运转 ALTER TABLE
。
默许权限
当创立一个目标时,初始时只要一切者能够拜访该目标。例如,假如你创立了一个新表,只要你能够拜访该表。你需求单独向其他人物授权。这很费事,由于你每次创立新表时都需求这样做。PostgreSQL具有一个功能,答应你装备新创立的目标的默许权限。
假定你想要为数据库和形式下的一切新表默许分配只读权限给一个只读人物。在 PostgreSQL v14 或更高版别中,有一个预界说的 pg_read_all_data
人物,答应其成员读取一切数据库中的一切数据,但假如你想要将其限制在某个特定数据库,就不能运用这个人物。咱们将经过运用默许权限为 ro_user
人物供给只读拜访权限。
关于现有的表格,咱们能够运转 GRANT SELECT ON ALL TABLES IN SCHEMA public TO ro_user
。这将为现有表格供给 SELECT
权限。可是,咱们期望将此权限颁发将来创立的表格。为了完成这一点, ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO ro_user
。这将改动默许权限。
请注意,这些默许权限仅在授权者创立新表时运用。例如,假定咱们有两个一切者人物 table_owner1
和 table_owner2
。 table_owner1
宣布 ALTER DEFAULT PRIVILEGES ...
,而另一个没有默许权限。在这种情况下,宣布的 ALTER DEFAULT PRIVILEGES
仅与 table_owner1
相关,而且仅在 table_owner1
创立新表时运用。即便 table_owner2
创立了一个新表,它也不会具有由 table_owner1
界说的默许权限。
检查当时的* 拜访操控列表*
经过运用 GRANT
和 REVOKE
指令,你能够修改上述的ACL,可是咱们怎么检查当时的ACL呢?假如你运用 psql
指令行界面,有一些指令行内部指令能够显示它们:
出自 www.postgresql.org/docs/15/ddl…
可是,你或许无法轻松拜访 psql
;你或许能够经过Redash、Retool、Grafana等办法运转一个只读查询,但不能运用 psql
。即便在这种情况下,你也能够在PostgreSQL内部表上运转 SELECT
查询,以检查与 psql
指令相同的信息。 psql
指令在底层也会查询这些PostgreSQL内部表,并以友好的办法显示它们。你能够在github.com/postgres/po… 找到 psql
的 \dt
(显示表格)完成,那里有一个 SELECT
语句。以下是一些权限查询的示例。
目标类型询问数据库挑选数据名,pg_catalog.pg_get_userbyid(datdba),datacl FROM pg_database;形式挑选 nspname, pg_catalog.pg_get_userbyid(nspowner), nspacl FROM pg_namespace;桌子SELECT relname, relacl FROM pg_class WHERE relacl IS NOT NULL AND relname NOT LIKE ‘pg_%’;默许权限从 pg_default_acl 中挑选 pg_catalog.pg_get_userbyid(defaclrole)、defaclobjtype、defaultacl;
每个 ACL 条目都以缩写形式显示,看起来像arwdDxt
. 每个特权都缩短为一个字符。例如r
在arwdDxt
isSELECT
和w
is 中INSERT
。你能够在协助文档中看到映射。
概括
PostgreSQL 拜访操控机制是根据人物、目标和权限构建的。有一种办法能够自动为新目标设置权限。为了检查当时装备,你能够运用psql
CLI 或直接查询 PostgreSQL 内部表。
原文地址:www.aviator.co/blog/postgr…
MemFire:随时随地构建您的云数据库/运用
MemFire Cloud使用PostgreSQL的强大功能作为其数据库体系支撑,并经过为其添加一套REST API、实时数据传输、静态保管服务等系列功能,能够使得开发人员更加容易地完成一个全功能性的数据库后端解决方案。