0
点赞
收藏
分享

微信扫一扫

PostgreSQL 15 让多年被DISS的PG 安全画上圆满的句号


PostgreSQL 15  让多年被DISS的PG 安全画上圆满的句号_数据库

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。

提起POSTGRESQL 中的安全问题其中最容易被人Diss 的最大BUG 并不是autovacuum 之类的部分,排在首位的被DISS的最大的问题是安全的问题,POSTGRESQL 中由于丰富的数据库管理层级设定,中的关于schema的设定

PostgreSQL 15  让多年被DISS的PG 安全画上圆满的句号_sql_02

这点的核心问题,在于安全部分,POSTGRESQL  在POSTGRESQL 15 之前是不安全的,不安全的因素来自于未有任何的权限的账号,可以在POSTGRESQL 的任何的数据库中的public schema中肆意妄为,我们来看看如果一个什么都没有权限的账号,什么都没有的,可以在PG中做什么

1   建立任何的OBJECTS ,表,VIEW ,Trigger,  procedure , 等等

2   可以对自己建立的OBJECTS 进行任何的数据的插入,删除,UPDATE 等操作,并且没有任何的限制

此时此刻我是否可以这样,来操作一番

通过未有任何权限的账号,登陆到数据库中,然后在数据库中建立存储过程,并通过存储过程,批量建表,并其批量的开始进行数据的插入,然后无限制的操作,那么你的数据库很可能很快的沦陷了。会出现各种各样的问题,如

CPU 莫名的升高,IOPS 打满,磁盘空间打满,WAL 日志快速产生,反正只要你想,那么这个没有任何权限的账号就可以将你的POSTGRESQL ,彻底的沦为一个 “殖民地”。

此时你还认为你的POSTGRESQL 是安全的,反正我是不这么认为,很多同学认为这是一个BUG 一个严重的POSTGRESQL 的BUG ,但我个人理解,或者是一种文化,一种开发的文化,因为PUBLIC 的意思就是公共的,但对于没有任何权限的账号可以在PUBLIC 操作这么多事情,想想也是后怕。

所以网上就推出了各种PG15版本之前的PUBLIC 的解决方案,汇总的方案如下

1 建立新的schema 不允许使用PUBLIC ,建立OBJECT 都需要指明对应的SCHEMA 部分

2 回收 public 的权限

3 将search_path 进行调整,不将public作为一个可选项

但这些问题都有一个结果,就是你首先必须有一个懂的这些问题的人,否则你会陷入一个怪圈,就是开发系统的人开发中,都是以public schema 开发的,并且如果你在这个基础上,在此进行管理的情况下,你无法在进行有序的管理。

所以这个问题的核心是,数据库在建立之初就必须将PUBLIC 的这个问题进行解决。

解决问题的方法有以下几个部分:

1  撤销所有人在PUBLIC 创建的权利

revoke create on schema public from PUBLIC;

2  撤销所有人可以在PUBLIC 访问自己创建的对象

revoke usage on schema public from PUBLIC;

PostgreSQL 15  让多年被DISS的PG 安全画上圆满的句号_sql_03

撤销所有者的特权

REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;

对于POSTGRES 账号进行所有基于PUBLIC的权限的回收

REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;

PostgreSQL 15  让多年被DISS的PG 安全画上圆满的句号_postgresql_04

然后使用应用需要的账号建立相关的权限和OBJECTS 

create database test;

create user test;

create schema test authorization test;

nam

PostgreSQL 15  让多年被DISS的PG 安全画上圆满的句号_postgresql_05

这里我们换成PG15

PostgreSQL 15  让多年被DISS的PG 安全画上圆满的句号_postgresql_06

从下面的命令可以清晰的看出PG 15 与PG14 的不同,在没有权限的用户中是不可以在PUBLIC 中创建任何的OBJECTS ,但是在我们使用了 create schema test authorization test; 后我们的test 账号就可以在指定的schema中创建OBJECTS 了,而不会像之前的版本是报错的。

[postgres@postgresql15 ~]$ 
[postgres@postgresql15 ~]$ 
[postgres@postgresql15 ~]$ psql -Utest -p5432 -h 192.168.198.100
Password for user test: 
psql (15.0)
Type "help" for help.
postgres=> 
postgres=> \c test
You are now connected to database "test" as user "test".
test=> create table idd (id int);
ERROR:  permission denied for schema public
LINE 1: create table idd (id int);
                     ^
test=> create schema test authorization test;
ERROR:  permission denied for database test
test=> 
test=> exit 
[postgres@postgresql15 ~]$ psql
psql (15.0)
Type "help" for help.
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create schema test authorization test;
CREATE SCHEMA
test=# exit 
[postgres@postgresql15 ~]$ psql -Utest -p5432 -h 192.168.198.100
Password for user test: 
psql (15.0)
Type "help" for help.
postgres=> \c test
You are now connected to database "test" as user "test".
test=> create table idd (id int);
CREATE TABLE
test=> \d
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 test   | idd  | table | test

所以基于PG 15 的postgresql 给了我们更好的在安全方面的保证和相关的快速处理问题的方法。这点的确是进步了。

PostgreSQL 15  让多年被DISS的PG 安全画上圆满的句号_sql_07

举报

相关推荐

0 条评论