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

ab8bb796cdd0d9f70a6cbddd0a63004c.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群。

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

cafcf5edcbf6f37171e511439bd556cb.png

这点的核心问题,在于安全部分,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;

10e45ae901b00e953ea89c06a3bbb5e8.png

撤销所有者的特权

REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;

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

REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;

01a35f4d2068c10bd9ef487d5cf0c91c.png

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

create database test;

create user test;

create schema test authorization test;

nam5b651559386803b5c364a2c525c8204c.png

这里我们换成PG15

1057d9c0cdf720bbd887b20976db00d1.png

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

5534a5eb6e98851595a198565abbe0a1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值