源码泄露|锅甩给谁?
文中参考文档可点击阅读原文打开, 推荐《最好的PostgreSQL学习镜像》。
《往期吐槽回顾》
如果把代码写到数据库存储过程或者函数里,或者把加密字段的解密代码写在索引表达式里方便走索引加速,又或者把远程连接的密码写到视图里的,这种代码泄露,锅算谁的?
第52期吐槽: PG 函数和存储过程内容不支持加密
视频回放
1、产品的问题点
PG 函数内容不支持加密
2、问题点背后涉及的技术原理
PG 可以写函数支持较为复杂的业务逻辑, 或者讲逻辑写入函数从而减少客户端与数据库的交互. 但是PG的函数内容不支持加密功能. 任何用户都可以通过pg_proc或pg_catalog.pg_get_functiondef(oid)查询函数内容.
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=# alter role abc login;
ALTER ROLE
postgres=# create or replace function hello(int) returns void as $$
postgres$# declare
postgres$# begin
postgres$# perform 1 from pg_class;
postgres$# perform $1+$1;
postgres$# end;
postgres$# $$ language plpgsql strict;
CREATE FUNCTION
postgres=# select hello(1);
hello
-------
(1 row)
postgres=# \c postgres abc
You are now connected to database "postgres" as user "abc".
postgres=> select * from pg_proc where proname='hello';
-[ RECORD 1 ]---+---------------------------
oid | 376507
proname | hello
pronamespace | 354435
proowner | 10
prolang | 14228
procost | 100
prorows | 0
provariadic | 0
prosupport | -
prokind | f
prosecdef | f
proleakproof | f
proisstrict | t
proretset | f
provolatile | v
proparallel | u
pronargs | 1
pronargdefaults | 0
prorettype | 2278
proargtypes | 23
proallargtypes |
proargmodes |
proargnames |
proargdefaults |
protrftypes |
prosrc | +
| declare +
| begin +
| perform 1 from pg_class;+
| perform $1+$1; +
| end; +
|
probin |
prosqlbody |
proconfig |
proacl |
注意这里指的是解释型的存储过程和函数语言, 对于编译好的语言内容是看不到的. 例如C函数, 只能知道它属于那个so文件, 用到里面的什么C函数.
3、这个问题将影响哪些行业以及业务场景
通用
4、会导致什么问题?
存在一定的安全风险, 任何用户都可以查询数据库中其他用户定义的函数内容
5、业务上应该如何避免这个坑
回收pg_proc系统表权限. revoke select on pg_proc from public;回收pg_catalog.pg_get_functiondef函数权限. revoke execute on function pg_catalog.pg_get_functiondef from public;
6、业务上避免这个坑牺牲了什么, 会引入什么新的问题
导致所有的函数定义都无法查询, 包括自己定义的.
7、数据库未来产品迭代如何修复这个坑
内核层支持: 普通用户只能查询自己定义的函数或存储过程内容. 内核层支持: 函数内容加密功能, 用户只能查看加密后的内容, 提高安全性. 加密密钥由启动数据库的操作系统用户或者通过文件形式读取输入, 权限可以与数据库用户区别开来.
文末彩蛋:国产数据库周边生态
当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.
1、管控软件
鸣嵩(前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是KubeBlocks. 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.
https://github.com/apecloud/kubeblocks
PG中文社区核心委员唐成老师的公司乘数开源的Clup, 专用管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且Clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 是企业用户推荐之选.
https://www.csudata.com/
若航老司机开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套PG或PolarDB数据库, 且对插件有特别多的需求, 推荐选择.
https://pigsty.cc/zh/
2、审计监控诊断优化
翟总(曾经是我背后的男人)到海信聚好看后研发的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.
https://www.dbdoctor.cn/
天舟老哥的核心产品Bytebase 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。
https://bytebase.cc/docs/introduction/what-is-bytebase/
PawSQL, SQL优化和诊断产品.
D-Smart, Oracle老前辈白老大出品, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.
https://www.modb.pro/db/567140
3、国产数据库IDE
IDE是开发者的必备工具,例如社区有pgAdmin, 国产IDE则可以看看老程序猿达刚老师的DeskUI:
https://www.deskui.com
4、数据同步&迁移&备份恢复
NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.
https://www.ninedata.cloud/home
DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.
https://www.dsgdata.com/
公开课
如果你对PolarDB学习感兴趣可以阅读这个公开课系列:
除了PolarDB还非常值得关注的几款PG栈国产数据库:
HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、 IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、 ProtonBase(云原生分布式数仓. https://protonbase.com/ )、 成都文武数据库(https://ww-it.cn)
参考文档点击阅读原文获得
感谢关注我的github (https://github.com/digoal/blog) 及视频号: