PostgreSQL 15 讓多年被DISS的PG 安全畫上圓滿的句號

碼農談IT發表於2023-03-10


提起POSTGRESQL 中的安全問題其中最容易被人Diss 的最大BUG 並不是autovacuum 之類的部分,排在首位的被DISS的最大的問題是安全的問題,POSTGRESQL 中由於豐富的資料庫管理層級設定,中的關於schema的設定
PostgreSQL 15  讓多年被DISS的PG 安全畫上圓滿的句號
這點的核心問題,在於安全部分,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 安全畫上圓滿的句號

撤銷所有者的特權
REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;
對於POSTGRES 賬號進行所有基於PUBLIC的許可權的回收
REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;

PostgreSQL 15  讓多年被DISS的PG 安全畫上圓滿的句號

然後使用應用需要的賬號建立相關的許可權和OBJECTS 

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

namPostgreSQL 15  讓多年被DISS的PG 安全畫上圓滿的句號

這裡我們換成PG15

PostgreSQL 15  讓多年被DISS的PG 安全畫上圓滿的句號

從下面的命令可以清晰的看出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 給了我們更好的在安全方面的保證和相關的快速處理問題的方法。這點的確是進步了

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2938994/,如需轉載,請註明出處,否則將追究法律責任。

相關文章