暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

AustinDatabases 2023-03-13
263

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群。
提起POSTGRESQL 中的安全问题其中最容易被人Diss 的最大BUG 并不是autovacuum 之类的部分,排在首位的被DISS的最大的问题是安全的问题,POSTGRESQL 中由于丰富的数据库管理层级设定,中的关于schema的设定
这点的核心问题,在于安全部分,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;

撤销所有者的特权
REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;
对于POSTGRES 账号进行所有基于PUBLIC的权限的回收
REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;

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

create database test;
create user test;
create schema test authorization test;

nam

这里我们换成PG15

从下面的命令可以清晰的看出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 给了我们更好的在安全方面的保证和相关的快速处理问题的方法。这点的确是进步了。

文章转载自AustinDatabases,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论