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中的数据库对象,但要实际访问对象以执行特定操作(例如读取、写入、执行等),角色还必须具有对这些特定数据库对象执行这些操作的适当权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis入门与实践

Redis是一种开源的、基于内存的高性能键值存储系统,常用于缓存、会话管理、实时数据分析等场景。以下是Redis的入门指南和一些基本的实践示例,帮助你开始使用Redis。 1. 安装和基本配置 安装Redis Redis可以在多种操作系统上安装。以Ubuntu为例&#…

搭建Python虚拟环境(四):Pipenv

使用Pipenv搭建虚拟环境的详细指南 Pipenv 是一个Python包管理工具,它结合了pip和virtualenv的优点,用于创建和管理Python项目的虚拟环境。本文将详细介绍如何使用Pipenv搭建虚拟环境,包括安装Pipenv、创建虚拟环境、激活虚拟环境、退出虚拟…

前端学习CSS之神奇的块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…

[Kubernetes] etcd 单机和集群部署

文章目录 1.etcd基本概念2.etcd的基本知识3.etcd优势4.etcd单机部署4.1 linux部署4.2 windows部署4.3 docker安装etcd 5.etcd集群部署 1.etcd基本概念 etcd是一个高可用的分布式键值存储系统,是CoreOS(现在隶属于Red Hat)公司开发的一个开源…

0614,表达式,语句

题目一: 许多简单的交互式程序都是基于菜单的:它们向用户显示可供选择的命令列表;一旦用户选择了某条命令,程序就执行相应的操作,然后提示用户输入下一条命令;这个过程一直会持续到用户选择 "退出&qu…

关于如何使用不到 ¥800 实现电动升降桌自由(双电机)

前言 在房子装修之前,就想着拥有一个书房。但是如果书房里面没有书桌,那不扯淡么?之后想着天天坐这么久,腰部颈部经常不适,所以又开始纠结买哪款人体工学椅子比较合适。 说时迟那时快。当天偶然刷小红书的时候&#x…

微信小游戏插件申请,微信小程序插件管理

微信小游戏的插件申请与小程序不一样,官方没有提供一个统一的管理入口进行申请插件,以及查看插件,没有小程序方便的; 小程序申请查看插件入口如下图所示: 小游戏的插件可以通过以下的方式进行申请: 如下…

RAG PAPTOR 示例代码理解笔记

RAG PAPTOR 示例代码理解笔记 0. 源代码文件1. 部分代码理解笔记故事背景导入工具固定种子(随机种子)全局降维函数局部降维函数获取最佳聚类数函数GMM聚类函数执行聚类函数嵌入函数嵌入并聚类文本函数格式化文本函数嵌入、聚类并总结文本函数递归嵌入、聚…

建筑八大员证报名一寸彩色照片要求及手机自拍方法解读

在建筑行业,八大员证的持有者是广受尊重的专业人士。然而,要成为一名合格的八大员,首先必须通过资格审核和报名流程。其中重要的一步就是提交一寸彩色照片,以确保个人信息准确无误。那么,你是否清楚报名时照片的要求以…

Linux笔记--权限与属性命令、查找指令、压缩命令、网络指令

权限 使用ls指令查看详细信息时 rwx分别代表读写执行三种权限,book代表book用户,对于权限来说三种权限分别代表二进制一位,即同时拥有rwx就是111,此时这个文件权限为775 改变权限为rw-rwxr-w指令 book100ask:~/Desktop$ chmod …

Vue I18n国际化插件

Vue I18n国际化插件 安装目录结构及文件内容./locales/lang/zh.js./locales/lang/en.js./locales/index.js main.js引入页面具体使用及语言切换(Vue3)刷新保存原语言,App.vue添加路由守卫注意点 中文文档: https://kazupon.githu…

sprintboot容器功能

容器 容器功能Spring注入组件的注解Component,Controller,Service,Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实例 配置绑定…

代码随想录算法训练营第六天| 242.有效的字母异位词 | 349. 两个数组的交集 | 202. 快乐数 |1. 两数之和

242.有效的字母异位词 文档讲解:代码随想录 视频讲解:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili 1. 对每一个字符串用一个字典统计每个字母出现的次数,最后比较两个字典…

【微信小程序开发实战项目】——如何去申请腾讯地图账号和在微信公众平台,配置request路径和添加地图插件

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【算法-力扣】73.矩阵置零,一文彻底搞懂!

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间&#x…

【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索

文章目录 引言机器学习与物流科技的基本概念机器学习概述监督学习无监督学习强化学习 物流科技概述路径优化车辆调度需求预测 机器学习与物流科技的融合应用实时物流数据分析数据预处理特征工程 路径优化与优化模型训练模型评估 车辆调度与优化深度学习应用 需求预测与优化强化…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种,以下是每种方式的详细说明及其优缺点: 使用Web浏览器登录 方法:通过配置路由器的远程管理功能,允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

Flutter系列:关于ensureInitialized()

Flutter系列 关于ensureInitialized() - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28…

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog,点击关注哦💕 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点,使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一,是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …