PostgreSQL 中如何控制行级安全和列级安全

彭占元

2018年8月加入去哪儿网,现负责公司 PostgreSQL/GreenPlum 运维工作,对数据库日常运维和日常调优有大量优化实践经验。

1. 需求提出

最近有业务线的同学向 DBA 提出这样的需求:“我的表里有很多敏感数据,怎么给使用者(从 DBA 角度来看就是 DB User)指定查看某些特定行或某些列的权限?”

这是我们经常用到的业务场景,比如最典型全公司的短信数据和用户管理平台场景,如何限制各部门仅可查看属于本部门的某些非敏感数据?

PostgreSQL 为了符合各种场景的安全需求,它的权限控制非常完善,它在各个级别上都具有广泛的安全功能。接下来我们来看一下在 PostgreSQL 中利用行级安全和列级安全来解决上述问题。

2. 行级安全

行级安全(Row Level Security),这一特性首次出现在 PostgreSQL 9.6中。

顾名思义,就是管理员控制普通用户对于表的查看和操作,我们可以把他理解为一个过滤器,通过指定的策略实现对表中展示数据进行筛选。

通过行级安全控制,我们可以数据避免受到其他用户的破坏,也可以确保该行的数据只有指定的用户可以查看。

2.1 实验示例

CREATE TABLE passwd (
  id                    bigserial primary key,
  user_name             varchar(32) UNIQUE NOT NULL,
  pwhash                varchar(32),
  real_name             varchar(32) NOT NULL,
  home_phone            varchar(12),
  home_dir              text NOT NULL,
  shell                 text NOT NULL
);
 
-- 填充表
INSERT INTO passwd (user_name,pwhash,real_name,home_phone,home_dir,shell) VALUES
    ('appuser','xxxx','appuser','111-222-3333','/root','/bin/dash');
INSERT INTO passwd(user_name,pwhash,real_name,home_phone,home_dir,shell) VALUES
    ('appuser1','xxxx','appuser1','123-456-7890','/home/appuser1','/bin/zsh');
INSERT INTO passwd(user_name,pwhash,real_name,home_phone,home_dir,shell) VALUES
    ('appuser2','xxxx','appuser2','098-765-4321','/home/appuser2','/bin/zsh');

根据表 passwd 记录的信息,现在我们有这样的需求:用户只能看到包含自己信息的行,而超级用户可以查看所有信息

首先我们创建对应用户并对用户进行授权操作。


my_t
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值