PostgreSQL -public schema

2024-06-16 09:04
文章标签 postgresql schema public

本文主要是介绍PostgreSQL -public schema,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Overview
  • 查询Schema权限
  • public schema的历史背景
  • 撤销权限
  • Granting Privileges
  • 结论

Overview

在上一篇文章中,介绍了理解 PostgreSQL schema的基础知识、创建和删除机制,并回顾了几个用例。本文将扩展这些基础知识并探讨与schema相关的权限管理。
但有一个需要澄清的初步事项。在上一篇文章中,讨论了一个可能的混淆点,涉及到“schema”一词的多重使用。在PostgreSQL数据库上下文中,该术语的专门含义与其在关系数据库管理系统中通常的使用方式不同。对于当前主题,有另一个类似的术语混乱,涉及“public”一词。

在初始创建数据库时,新创建的PostgreSQL数据库包括一个预定义的名为“public”的schema。它是一个和其他schema一样的schema,但同一个词也用作一个关键字,在本应使用实际role name的上下文中表示“all users”,例如schema权限管理。下面的例子将澄清这一术语的重要性及其两种不同用法。

查询Schema权限

在使用示例代码来授予和撤销schema权限之前,需要回顾一下如何检查schema的权限。使用 psql 命令行界面,我们使用 dn+ 命令列出schema和相关权限。对于新创建的 sampledb 数据库,我们会看到public schema的以下內容:

sampledb=# dn+ List of schemasName  |  Owner   |  Access privileges   |      Description      
--------+----------+----------------------+------------------------public | postgres | postgres=UC/postgres+| standard public schema|          | =UC/postgres         |
(1 row)

前两列和第四列非常简单:如前所述,显示默认创建的schema名为“public”,描述为“standard public schema”,由角色“postgres”拥有。(除非另有指定,否则schema所有权设置为创建schema的角色。)第三列列出了访问权限,这是这里感兴趣的内容。权限信息的格式提供了三个项目:privlileges grantee(权限被授予者)、privilege(权限)和privilege grantor(权限授予者),格式为“grantee=privileges/grantor”,即等号左侧是接收权限的角色,等号右侧是一组指定特定权限的字母,最后在斜线后面是授予权限的角色。可能会有多个此类权限信息规范,以"+"号分隔列出,因为权限是累加的。
对于schema,有两种可能的权限可以分别授予:U 代表“USAGE”(使用)和 C 代表“CREATE”(创建)。前者是一个角色查找schema中包含的数据库对象(如表和视图)所必需的权限;后者允许一个角色在schema中创建数据库对象。其他类型的数据库对象还有其他权限字母,但对于schema,只适用于 U 和 C。
因此,为了解释上面的权限列表,第一个规范告诉我们,postgres 用户被授予在public schema上update和create的权限。

请注意,对于上面的第二个规范,等号左侧会出现一个空字符串。这就是通过前面提到的 PUBLIC 关键字授予all users的权限的表示方式。

后一种在public schema上授予"all users" usage和create权限的规范,被一些人视为可能违背了通用安全原则的最佳实践,因为最佳实践通常倾向于从默认限制访问开始,要求数据库管理员明确授予适当且最低必要的访问权限。这些在public schema上的宽松权限是有意在系统中配置的,目的是为了方便和兼容旧系统。
还要注意,除了宽松的权限设置外,public schema唯一特别之处在于它也列在了search_path中,正如我们在上一篇文章中讨论的那样。这同样是为了方便:search_path配置和宽松的权限设置共同使新数据库的使用变得像是没有schema这个概念一样。

public schema的历史背景

这种兼容性问题起源于大约十五年前(在 PostgreSQL 7.3 版之前,参见 7.3 版发布说明),当时 PostgreSQL 还没有schema 特征。在 7.3 版引入schema功能时,通过配置public schema的宽松权限和 search_path,使得旧版应用程序(这些应用程序不支持schema)能够在升级后的数据库功能中无需修改地运行,从而确保了兼容性。
除此之外,public schema没有什么特别之处:如果用例不需要它,一些 DBA 会删除它;其他人则通过撤销默认权限来锁定它。

撤销权限

schema权限通过 GRANT 和 REVOKE 命令进行管理,分别用于添加和撤销权限。我们将尝试一些限制public schema的权限具体示例,但一般语法是:

REVOKE [ GRANT OPTION FOR ]{ { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }ON SCHEMA schema_name [, ...]FROM { [ GROUP ] role_name | PUBLIC } [, ...][ CASCADE | RESTRICT ]

因此,作为初始的示例,我们从public schema中移除create权限。请注意,在这些示例中,小写单词“public”指的是schema,可以替换为数据库中存在的任何其他有效schema名称。大写的“PUBLIC”是一个特殊关键字,表示“所有用户”,可以用特定角色名称或逗号分隔的角色名称列表替换,以实现更精细的访问控制。

sampledb=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# dn+List of schemasName  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------public | postgres | postgres=UC/postgres+| standard public schema|          | =U/postgres          | 
(1 row)

在这个schema权限列表中,与第一个列表唯一的区别是第二个权限规范中缺少了“C”,这证实了我们的命令已经生效:除了postgres用户之外的用户不再能在public schema中创建表、视图或其他对象。

请注意,上述从public schema中撤销create权限的命令是针对之前公布的漏洞CVE-2018-1058的建议缓解措施,该漏洞源于public schema上的默认权限设置。

进一步的限制可能需要通过删除使用权限来完全拒绝对此schema的查找访问:

sampledb=# REVOKE USAGE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# dn+List of schemasName  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------public | postgres | postgres=UC/postgres | standard public schema
(1 row)

由于非所有者用户的所有可用的schema权限均已被撤销,因此整个第二个权限规范在上面的列表中消失。

我们使用两个单独的命令执行的操作可以通过一个指定所有权限的命令简洁地完成,如下所示:

sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;
REVOKE

此外,还可以撤销schema所有者的权限:

sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;
REVOKE
sampledb=# dn+List of schemasName  |  Owner   | Access privileges |      Description       
--------+----------+-------------------+------------------------public | postgres |                   | standard public schema
(1 row)

但这实际上并没有实现任何实际效果,因为schema所有者仅凭所有权就保留了对其所拥有schema的全部权限,而不管明确分配与否。
public schema的宽松权限分配是与初始数据库创建相关的特殊产物。后续在现有数据库中创建的schema遵循了最佳实践,即开始时不分配任何权限。。例如,在创建名为“private”的新schema后检查schema权限,显示新schema没有权限:

sampledb=# create schema private;
CREATE SCHEMA
sampledb=# dn+List of schemasName   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------private | postgres |                      | public  | postgres |                      | standard public schema
(2 rows)

Granting Privileges

添加权限的命令的一般形式为:

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }ON SCHEMA schema_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ]
where role_specification can be:[ GROUP ] role_name| PUBLIC| CURRENT_USER| SESSION_USER

例如,使用此命令,我们可以允许所有角色通过添加usage权限来查找private schema的数据库对象

sampledb=# GRANT USAGE ON SCHEMA private TO PUBLIC;
GRANT
sampledb=# dn+List of schemasName   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------private | postgres | postgres=UC/postgres+| |          | =U/postgres          | public  | postgres |                      | standard public schema
(2 rows)

请注意,现在我们已经为schema分配了非默认权限,UC权限以postgres所有者作为第一规范出现。第二个规范,=U/postgres,对应于我们刚刚作为postgres用户调用的GRANT命令,授予所"all users"使用权限(回想一下,等号左侧的空字符串表示“all users”)。

例如,可以为名为“user1”的特定角色授予private schema的create和usage权限:

sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1;
GRANT
sampledb=# dn+List of schemasName   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------private | postgres | postgres=UC/postgres+| |          | =U/postgres         +| |          | user1=UC/postgres    | public  | postgres |                      | standard public schema
(2 rows)

我们还未提及一般命令形式中的“WITH GRANT OPTION”子句。正如其字面意思,此子句允许授予的角色将指定的权限授予其他用户,它在权限列表中以附加到特定权限的星号表示。

sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1 WITH GRANT OPTION;
GRANT
sampledb=# dn+List of schemasName   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------private | postgres | postgres=UC/postgres+| |          | =U/postgres         +| |          | user1=U*C*/postgres  | public  | postgres |                      | standard public schema
(2 rows)

结论

最后,请记住,我们只讨论了schema访问权限。虽然 USAGE 权限允许查找schema中的数据库对象,但要实际访问对象以执行特定操作(例如读取、写入、执行等),角色还必须具有对这些特定数据库对象执行这些操作的适当权限。

这篇关于PostgreSQL -public schema的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066022

相关文章

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed 文章目录 DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed问题解决办法 问题 使用 DBeaver 连接 MySQL 数据库的时候, 一直报错下面的错误 Public Key Retrieval is

PostgreSQL入门介绍

一、PostgreSQL 背景及主要功能介绍 1、背景 PG数据库,全称为PostgreSQL数据库,是一款开源的关系型数据库管理系统(RDBMS)。其起源可以追溯到20世纪80年代末和90年代初,由加拿大的计算机科学家Michael Stonebraker及其团队在加州大学伯克利分校启动。该项目旨在创建一个强大的、开源的关系型数据库管理系统,作为早期关系型数据库系统Ingres的继承者。Mi

PostgreSQL索引介绍

梦中彩虹   博客园首页新随笔联系管理 随笔 - 131  文章 - 1  评论 - 14 PostgreSQL索引介绍 INDEX 索引是增强数据库性能的常用方法。索引使得数据库在查找和检索数据库的特定行的时候比没有索引快的多。但索引也增加了整个数据库系统的开销,所以应该合理使用。 介绍 假设我们有一个类似这样的表: CREATE TABLE test1 (id integ

PostgreSQL分区表(partitioning)应用实例详解

https://www.jb51.net/article/97937.htm   PostgreSQL分区表(partitioning)应用实例详解  更新时间:2016年11月22日 10:25:58   作者:小灯光环    我要评论   这篇文章主要为大家详细介绍了PostgreSQL分区表(partitioning)应用实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

PostgreSql中WITH语句的使用

https://blog.csdn.net/chuan_day/article/details/44809125 PostgreSql中WITH语句的使用 With语句是为庞大的查询语句提供了辅助的功能。这些语句通常是引用了表表达式或者CTEs(一种临时数据的存储方式),可以看做是一个查询语句的临时表。在With语句中可以使用select,insert,update,delete语句。当然wit

PostgreSQL 17即将发布,新功能Top 3

按照计划,PostgreSQL 17 即将在 2024 年 9 月 26 日发布,目前已经发布了第一个 RC 版本,新版本的功能增强可以参考 Release Notes。 本文给大家分享其中 3 个重大的新增功能。 MERGE 语句增强 MERGE 语句是 PostgreSQL 15 增加的一个新功能,它可以在单个语句中实现 INSERT、UPDATE 以及 DELETE 操作,非常适合数据

c++ public、protected 、 private访问修饰符详解

在 C++ 中,访问修饰符用于控制类的成员(数据成员和成员函数)的访问权限。主要的访问修饰符有三个:public、protected 和 private。每种修饰符的访问规则如下: 1. public 定义:public 修饰符表示该成员对所有代码都是可见的,任何对象都可以访问和修改。作用:允许类外部的代码访问这些成员。 class Example {public:int publicVa

访问修饰符public、protected、private,基于C++

一、基本概念 公有(public)成员   公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值, 私有(private)成员  私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。 默认情况下,类的所有成员都是私有的。例如在下面的类中,width 是一个私有成员,这意味着,如果您没有使用任何访问修饰符,类的成