数据库内核月报 - 2015 / 11-PgSQL · 答疑解惑 · PostgreSQL 用户组权限管理

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

背景

RDS上的PG没有开放超级用户,这给很多云上的客户使用PG带来了困难。因此有必要给大家讲讲PG的用户权限管理的一些小知识,它可以很好的帮助用户顺利的从之前的 DB 管理方式过度到云上。

  1. PG 的 superuser 拥有几乎全部的数据库权限,甚至可以直接修改系统表,潜在风险相当大;
  2. RDS PG 使用 superuser 运维 DB,例如管理用、管理流复制、备份等,这些操作用户是不需要关心的,换句话说它应该完全的交给云服务来处理;
  3. 对于用户而言,PG 的普通用户权限是完全够用的。使用普通用户,可以管理自己在云上的数据(对表进行DDL、DML、创建修改和管理其他数据库对象)。

之前的 PG 用户习惯使用 superuser 进行日常运维,一方面 superuser 完全不用做任何的授权,使用方便;另一方面这样的操作带来了潜在的风险,容易误操作。

最近碰到了较多的用户反馈,没有了超级用户,无法使用 RDS 的普通用户,管理其他普通用户创建的对象,经常出现操作对象无权限的问题,尤其存在多用户的情况下。通常情况下:

  1. 一个普通用户只能在自己 owner 的DB下创建 schema;
  2. DB 下的对象有一个所属的 schema,普通用户可以在 public 下创建对象(如 table),在其他 schema 下创建对象需要 schema 的 owner 是当前用户或特别的授权;
  3. 管理一个数据库对象,需要是超级用户、或对象的 owner 是当前用户(在用户组权限之外)。

很多用户,使用了很多个 user 在 public 模式下创建了多张表,但是单个用户却没有权限同时管理他们, 更没有权限切换他们的 owner 到一个统一的用户下做统一处理,十分恼火。

解决方法

在这里,我们提供一种通用的方法,可以使用 PG 的用户组和继承特性,做到使用一个普通用户管理多个其他用户。

  1. 使用 RDS 的根账号创建一个用于管理数据库和用户的管理员账号,他具有创建用户和创建 DB 的权限

     postgres=# create user admin createdb createrole login password 'pgsql';
     CREATE ROLE
     postgres=# \du
                                   List of roles
       Role name  |                   Attributes                   | Member of 
     -------------+------------------------------------------------+-----------
      admin       | Create role, Create DB                         | {}
      test        | Superuser                                      | {}
    
  2. 使用这个 admin 登陆 postgres,创建用于存放数据的DB

     postgres=> create database dbadmin;
     CREATE DATABASE
    
  3. 创建子账户subuser1 subuser2,并把他们的权限给admin

     dbadmin=> create user subuser1 ;
     CREATE ROLE
     dbadmin=> create user subuser2 ;
     CREATE ROLE
     dbadmin=> grant subuser1 to admin;
     GRANT ROLE
     dbadmin=> grant subuser2 to admin;
     GRANT ROLE
    
  4. 我们看到 admin 用户组管理了下列2个用户,也就是admin 拥有 subuser1,subuser2 的所有权限

     dbadmin=> \du
                                        List of roles
       Role name  |                   Attributes                   |      Member of
     -------------+------------------------------------------------+---------------------
      admin       | Create role, Create DB                         | {subuser1,subuser2}
      subuser1    |                                                | {}
      subuser2    |                                                | {}
    
  5. 使用 subuser1 或 subuser2 登陆数据库 dbadmin,public schema上创建 owner 是自己的表对象和其他对象。分别用3个用户创建3张表a b c用作测试,另外也可以使用 admin 用户创建分别属于 subuser1 和 subuser2 的 schema ,再创建 table

     dbadmin=> \d
                List of relations
      Schema |    Name    | Type  |  Owner
     --------+------------+-------+----------
      public | t_admin    | table | admin
      public | t_subuser1 | table | subuser1
      public | t_subuser2 | table | subuser2
    
  6. 使用 admin 用户,可以对这3张表做管理,例如:

     dbadmin=> select user;
      current_user
     --------------
      admin
     (1 row)
     dbadmin=> drop table t_admin,t_subuser1,t_subuser2;
     DROP TABLE
    
  7. 但是 subuser1 无法删除 t_admin 和 t_subuser2,同理 subuser2 也无法删除 t_admin 和 t_subuser1

     dbadmin=> select user;
      current_user
     --------------
      subuser1
     (1 row)
     dbadmin=> drop table t_admin;
     ERROR:  must be owner of relation t_admin
     dbadmin=> drop table t_subuser1;
     DROP TABLE
     dbadmin=> drop table t_subuser2;
     ERROR:  must be owner of relation t_subuser2
    
  8. 同理,可以使用 admin 用户,重置这3张表的 owner 到3个用户中的一个,而使用 subuser1 和 subuser2 则没有权限操作,例如:

     dbadmin=> select user;
      current_user
     --------------
      admin
     (1 row)
     dbadmin=> alter table t_admin owner to subuser1;
     ALTER TABLE
     dbadmin=> alter table t_subuser2 owner to subuser1;
     ALTER TABLE
     dbadmin=> alter table t_subuser1 owner to subuser2;
     ALTER TABLE
    
    
     dbadmin=> select user;
      current_user
     --------------
      subuser1
     (1 row)
     dbadmin=> \d
                List of relations
      Schema |    Name    | Type  |  Owner
     --------+------------+-------+----------
      public | t_admin    | table | subuser1
      public | t_subuser1 | table | subuser2
      public | t_subuser2 | table | subuser1
     (3 rows)
     dbadmin=> alter table t_admin owner to admin;
     ERROR:  must be member of role "admin"
     dbadmin=> alter table t_subuser1 owner to subuser1;
     ERROR:  must be owner of relation t_subuser1
    
  9. 最后,提一个完成上述功能的假设,admin 用户默认具有 INHERIT 权限,INHERIT 权限决定一个角色是否“继承”它所在组的角色的权限。一个带有 INHERIT 属性的角色可以自动使用已经赋与它直接或间接所在组的任何权限。没有 INHERIT,其它角色的成员关系只赋与该角色 SET ROLE 成其它角色的能力;其它角色的权限只是在这么做了之后才能获得。如果没有声明,缺省是 INHERIT。通过系统表, pg_roles 可以获得该用户的权限信息

     dbadmin=> select rolname,rolinherit from pg_roles ;
        rolname   | rolinherit
     -------------+------------
      subuser1    | t
      subuser2    | t
      admin       | t
    

总结

使用 PG 用户组可以做到使用一个 PG 用户组管理所在组内的所有其他普通用户和他们的对象。RDS 用户设置一个用户组,既可以管理多个用户的对象,又可以实现一定程度上的权限隔离,同时权限又不会过大,推荐在云上使用该方式管理自己的数据库。

如果要实现更加细粒度的权限控制,则需要使用 grant 和 revoke 语句,请参考官方sql-createrole 和 sql-grant

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
28天前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
1月前
|
缓存 安全 Java
阿里云数据库 SelectDB 内核 Apache Doris 2.0.6 版本正式发布
阿里云数据库 SelectDB 内核 Apache Doris 2.0.6 版本正式发布
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB常见问题之数据库不能自己减少节点如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
缓存 关系型数据库 分布式数据库
PolarDB常见问题之数据库cpu突然飙高如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
3天前
|
关系型数据库 OLAP 分布式数据库
「杭州*康恩贝」4月26日PolarDB开源数据库沙龙,开启报名!
4月26日周五,PolarDB开源社区联合康恩贝将共同举办开源数据库技术沙龙,本次沙龙我们邀请了众多数据库领域的专家,期待大家的参与!
「杭州*康恩贝」4月26日PolarDB开源数据库沙龙,开启报名!
|
13天前
|
运维 关系型数据库 分布式数据库
「合肥 * 讯飞」4 月 19 日 PolarDB 开源数据库沙龙,报名中!
4月19日周五,PolarDB开源社区联合科大讯飞共同举办开源数据库技术沙龙,本次沙龙我们邀请了众多数据库领域的专家,期待大家的参与!
「合肥 * 讯飞」4 月 19 日 PolarDB 开源数据库沙龙,报名中!
|
1月前
|
存储 SQL 数据管理
阿里云数据库 SelectDB 内核 Apache Doris 如何基于自增列满足高效字典编码等典型场景需求|Deep Dive 系列
自增列的实现,使得 Apache Doris 可以在处理大规模时展示出更高的稳定性和可靠性。通过自增列,用户能够高效进行字典编码,显著提升了字符串精确去重以及查询的性能。使用自增列作为主键来存储明细数据,可以完美的解决明细数据更新的问题。同时,基于自增列,用户可以实现高效的分页机制,轻松应对深分页场景,有效过滤掉大量非必需数据,从而减轻数据库的负载压力,为用户带来了更加流畅和高效的数据处理体验。
|
1月前
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
|
1月前
|
存储 关系型数据库 分布式数据库
PolarDB常见问题之PolarDB突然有大量服务连不上数据库如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。

相关产品

  • 云原生数据库 PolarDB