开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。
提起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 给了我们更好的在安全方面的保证和相关的快速处理问题的方法。这点的确是进步了。
标签:DISS,15,postgres,create,public,PG,test,PUBLIC,schema From: https://blog.51cto.com/u_14150796/6534568