PostgreSQL数据库模拟备库创建只读用户存在的权限安全隐患
- default_transaction_read_only
- 权限授权
- 版本变更说明
看腻了就来听听视频演示吧:https://www.bilibili.com/video/BV1ZJ4m1578H/
default_transaction_read_only
创建只读用户,参照备库只读模式。有个简单的方式就是直接set参数:default_transaction_read_only,但这里有个安全隐患问题:在开启事务的场景下可以调整事务的读写权限。
- 硬锁定,直接将数据库切换到恢复模式(备库),绝对不会有写操作出现。
- 软锁定,设置default_transaction_read_only为on,默认开启的事务为只读事务。用户如果使用begin transaction read write可破解。
drop owned by u_readonly;
drop user IF EXISTS u_readonly;
-- 创建只读用户:授予所有权限(管理员)再将其设置为只读用户(整个实例的只读用户)
create user u_readonly Superuser password 'Test@123';
alter user u_readonly set default_transaction_read_only = on;
-- 单个数据库的只读用户(推荐使用),将库的所有者的权限给予只读用户即可
create user u_readonly password 'Test@123';
grant db_user to u_readonly;
alter user u_readonly set default_transaction_read_only = on;
\c - u_readonly
-- 漏洞:开启事务 set 或begin transaction read write;后有写权限
begin;
set TRANSACTION READ WRITE;
create table public.t_hhh(id int);
权限授权
drop owned by u2_readonly;
drop user IF EXISTS u2_readonly;
-- 默认所有用户都有在public模式下create权限,需先回收,PG15已回收该权限
revoke create on schema public from public;
-- 若其他用户需要使用public模式会受到影响,需要重新授权
grant create on schema public to user_name;
-- 创建普通用户
CREATE user u2_readonly password 'Test@123';
-- 针对所有数据可读,PG14新增读写角色:pg_read_all_data(读权限) / pg_write_all_data(写权限)
grant pg_read_all_data to u2_readonly;
-- 部分数据可读:先授予模式的使用权限
grant USAGE on SCHEMA 模式名 to u2_readonly;
-- 再授予模式下现有表的查询权限
grant SELECT on all tables in schema 模式名 to u2_readonly;
-- 后面新创建的表得追加动态授权,不同用户创建的表需要不同用户来追加授权
alter default privileges in schema 模式名 grant select on tables to u2_readonly;
版本变更说明
PG 14 版本新增的全局读写权限的用户操作:
- pg_database_owner:提供数据库宿主的通用权限,常见于模板库的定制化工作。
- pg_read_all_data:提供全局读取的访问权限,实例级全局只读用户。
- pg_write_all_data:提供全局写入的访问权限,实例级全局insert、update及delete。
PG 15 版本对public模式的 create 权限从public角色回收,普通用户将不能在public模式下创建表。