第34期吐槽:PG做SaaS/DBaaS?隔墙有耳。(本期彩蛋PG岗位招聘)
文中参考文档点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
第34期吐槽:PG 全局catalog全局可见
1、产品的问题点
PG catalog全局可见
2、问题点背后涉及的技术原理
任何用户都可以查看目前PG实例中有哪些用户名、它们的权限、有哪些数据库、有哪些表空间、有哪些权限设置等.
postgres=> \du 暴露用户
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+---------------------
abc | Cannot login | {}
d | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
ro | | {pg_read_all_data}
rw | | {pg_write_all_data} postgres=> \db 暴露表空间和路径
List of tablespaces
Name | Owner | Location
------------+----------+----------
pg_default | postgres |
pg_global | postgres |
(2 rows)
postgres=> \l 暴露数据库
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
postgres | postgres | UTF8 | C | en_US |
template0 | postgres | UTF8 | C | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
postgres=> \dp+ 暴露用户权限
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+----------------+-------+---------------------------+-------------------+----------
public | a | table | | |
public | b | table | | |
public | c | table | | |
public | comments | table | | |
public | pg_buffercache | view | postgres=arwdDxt/postgres+| |
| | | pg_monitor=r/postgres | |
public | posts | table | | |
public | t | table | | |
(7 rows)
postgres=> \dx
List of installed extensions
Name | Version | Schema | Description
----------------+---------+------------+---------------------------------
pg_buffercache | 1.3 | public | examine the shared buffer cache
pgcrypto | 1.3 | public | cryptographic functions
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
roaringbitmap | 0.5 | public | support for Roaring Bitmaps
(4 rows)
3、这个问题将影响哪些行业以及业务场景
SaaS类业务
DBaaS类业务
4、会导致什么问题?
SaaS类业务, 一个数据库实例可能给多个客户使用, 每个客户分配1个数据库账号, 给予1个私有数据库. 但是它可以看到这个实例中还有哪些用户、哪些数据库, 虽然可以从pg_hba.conf以及数据库内部权限上隔离user-DB mapping的互相访问, 但是依旧可能在名字上泄露商业机密.
即使配置了pg_hba.conf配置user-db的访问控制限制, 那么用户可以尝试破解其他user pwd连接各数据库.
DBaaS类业务, 与之类似.
5、业务上应该如何避免这个坑
每个用户使用一个实例, 而不是通过实例中的 不同用户 和 不同数据库 来进行区分.
6、业务上避免这个坑牺牲了什么, 会引入什么新的问题
实例过多, 需要为每个实例分配独立的内存, 比较浪费资源.
一个大实例中创建多个DB和USER可以更好的实现资源的共享, 充分利用资源, 同时能支持更好的弹性伸缩.
如果是多个实例, 为每个实例分配的资源是静态的, 不易于伸缩(例如shared buffer启动时设定, 变更需要重启实例). 如果是一个大实例, 通过内部控制各个db的资源, 更加灵活, 只少不需要重启数据库实例.
7、数据库未来产品迭代如何修复这个坑
希望内核支持, 对普通用户隐藏敏感的全局数据. 例如设计实例级全局用户专门用来管理集群, 其他的是普通超级用户, 普通用户.
33 有奖谜题:PG里100%会爆的定时炸弹是什么?
本期彩蛋-招聘信息发布
数据库厂商招聘交付架构师职位,PG方向,8年以上PG侧经验,有一定的乙方经验,工作地点:广州、深圳
联系微信号:TomXiao888888
另一个好消息,PG中文社区年度峰会在杭州举办,欢迎报名
文章中的参考文档请点击阅读原文获得.
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号: