核心系统用PG了,抠脑壳的权限,搞晕了!

作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、
高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理

微信:jem_db
QQ交流群:587159446
公众号:IT邦德

前言

分享一些技能给大家,别让PG的权限再把大家绕进去了!

大家好,最近也是由于系统上线,PG的权限确实绕啊!对于我这个DBA老兵,花了2周的时间对权限进行了梳理,利用这次机会,分享一些技能给大家,别让PG的权限再把大家绕进去了!

1.PG权限架构

1.1 层层通关

1.允许多个用户使用同一数据库而不相互干扰,数据库严格分开的,不允许跨库访问

2.schema可以将数据库对象组织成易于管理的逻辑组,用户根据其对schema的权限,可以访问所连接数据库的schema中的对象

3.表空间是一个目录,仅是起到了物理隔离的作用,可以跨数据库,其管理功能依赖于文件系统。

4.ALL代表所有访问权限,PUBLIC代表所有用户

5.数据库在创建后,会自动创建名为public的schema,这个schema的all权限已经赋予给public角色

6.拥有者(Owner)对相应的数据库对象拥有完全的控制权

如果你想访问一个表,你就锝按照下面的流程层层通关才可以

1.2 行级访问

行级访问控制特性将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。
不同用户执行相同的SQL查询操作,读取到的结果是不同的。
用户可以在数据表创建行访问控制(Row Level Security)策略

--创建表test,包含不同用户数据信息
postgres=# CREATE TABLE test
(id int, role varchar(100), data varchar(100));

--打开行访问控制策略开关
postgres=# ALTER TABLE test ENABLE ROW LEVEL; 

--创建行访问控制策略,当前用户只能查看用户自身的数据
postgres=# CREATE ROW LEVEL SECURITY POLICY test_rls 
ON test USING(role = CURRENT_USER);

1.3 列级访问

在一些业务场景中,某些列存储敏感信息,需要对用户不可见,但其他列的数据又需要用户能够查看或操作,此时就需要针对数据表的特定列做访问控制,实现针对用户的列级别的访问控制。

例:授予用户jack对customer_t1表的
c_customer_sk和c_first_name列的查询权限
GRANT SELECT (customer_sk, first_name) ON customer TO jack;
postgres=# \c - jack
postgres=# select customer_sk, first_name from customer;
 customer_sk | first_name
-------------+--------------
         2345| Grace
(1 row)
postgres=# select * from customer ;
ERROR:  permission denied for table customer

1.4 各类型对象的权限列表

2.PG权限管理

2.1 数据库权限

1. CREATE ON DATABASE:  
允许在数据库里创建新的模式
2. CONNECT ON DATABASE:   
允许用户连接到指定的数据库。
3. ALTER ON DATABASE:  
允许用户修改数据库中指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。
4. DROP ON DATABASE:  
允许用户删除数据库中指定的对象
5. ALL [ PRIVILEGES ] ON DATABASE: 
一次性给指定用户/角色赋予所有可赋予的权限
只有系统管理员有权执行GRANT ALL PRIVILEGES。

2.2 schema权限

1. 用户如果要创建模式需要有CREATE ON DATABASE权限
postgres=# grant create on database db_name to jack;
2. 模式属主表示模式的拥有者,拥有模式的所有权限
postgres=# alter schema myschema owner to jack
3. 用户只能访问属于自己的schema中的数据库对象,即使用的权限
postgres=# GRANT USAGE ON schema myschema TO jack;

2.3 表的权限

1. 创建表需要有CREATE ON SCHEMA的权限
postgres=# GRANT USAGE,CREATE ON schema myschema TO jack;
2. 修改表、查看表首先需要有USAGE的权限
postgres=# GRANT USAGE ON schema myschema TO jack;
postgres=# GRANT SELECT,INSERT,UPDATE,DELETE 
ON ALL TABLES IN SCHEMA myschema TO jack;
3. 需要针对数据表的特定列做访问控制,实现针对用户的列级别的访问控制。

2.4 表空间的权限

表空间是一个目录,可以存在多个,里面存储的是它所包含的数据库的各种物理文件。由于表空间是一个目 录,仅是起到了物理隔离的作用,其管理功能依赖于文件系统。

PG自带了两个表空间,即默认表空间pg_default共享表空间pg_global

1. 表空间属主,表示表空间的拥有者
postgres=# CREATE TABLESPACE mytbs 
RELATIVE LOCATION 'tablespace/mytbs';
postgres=# alter tablespace mytbs owner to jack;
2. 在表空间中创建对象,需要以下权限
postgres=# GRANT CREATE ON TABLESPACE mytbs TO jack;

3.PG的三权分立

默认情况下拥有Superuser属性的系统管理员,具备系统最高权限。但在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立。

三权分立的基本思想是将系统中关键操作的权限分配给不同的角色,
来避免单个用户或角色能够完全控制整个系统,
这通常包括以下三个角色:

1.数据库管理员(DBA):
负责数据库运维管理任务、如创建用户、
表空间、schema管理等。
2.安全管理员(SA):
负责数据库安全策略的制定和实施,
包括用户权限分配和审计等。
3.应用管理员(AA):
负责数据库应用的开发和维护,
包括表结构设计、查询优化和数据加载等。

4.总结

PG的权限对于初学者确实很绕,但也是由于PG的权限的规范管理,使得PG的安全级别控制的非常的规范,后期详细的PG权限分享请大家多看我的直播!

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT邦德

客户部署资料,步骤超详细

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值