【DB吐槽大会】第52期 - PG 函数内容不支持加密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 大家好,这里是DB吐槽大会,第52期 - PG 函数内容不支持加密

背景


1、产品的问题点

  • PG 函数内容不支持加密

2、问题点背后涉及的技术原理

  • PG 可以写函数支持较为复杂的业务逻辑, 或者讲逻辑写入函数从而减少客户端与数据库的交互.
  • 但是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=# 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          |   

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、数据库未来产品迭代如何修复这个坑

  • 内核层支持: 普通用户只能查询自己定义的函数或存储过程内容.
  • 内核层支持: 函数内容加密功能, 用户只能查看加密后的内容, 提高安全性. 加密密钥由启动数据库的操作系统用户或者通过文件形式读取输入, 权限可以与数据库用户区别开来.
相关文章
|
4月前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
6月前
|
PHP 数据安全/隐私保护
|
6月前
|
SQL 存储 关系型数据库
MySQL 时间日期函数,流程控制函数,加密解密函数以及聚合查询函数
MySQL 时间日期函数,流程控制函数,加密解密函数以及聚合查询函数
69 0
|
6月前
|
存储 数据库连接 Nacos
在Nacos中,db怎么加密?
在Nacos中,db怎么加密?
293 1
|
11月前
|
关系型数据库 MySQL 数据安全/隐私保护
零基础带你学习MySQL—加密函数和系统函数(十六)
零基础带你学习MySQL—加密函数和系统函数(十六)
|
存储 算法 前端开发
php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)
php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)
249 0
php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)
|
SQL 运维 安全
[MySQL]流程控制函数&加密与解密函数&MySQL信息函数&其他函数
[MySQL]流程控制函数&加密与解密函数&MySQL信息函数&其他函数
|
SQL 运维 安全
加密解密,MySQL单行函数,数学函数字符串日期时间,流程控制,完整详细可收藏查询SQL
加密解密,MySQL单行函数,数学函数字符串日期时间,流程控制,完整详细可收藏查询SQL
151 1
加密解密,MySQL单行函数,数学函数字符串日期时间,流程控制,完整详细可收藏查询SQL
|
SQL 数据安全/隐私保护
Sql Server内置函数实现MD5加密
Sql Server内置函数实现MD5加密
430 0
|
存储 算法 关系型数据库
【笔记】开发指南—函数—加密和压缩函数
本文主要介绍PolarDB-X支持的加密和压缩函数。
169 0