作为一枚搬砖多年的码农,每当接触一个新的产品或系统时,总是不由自主地考虑它的安全性问题;了解一种新兴技术时,也会考量它在安全方面所做的努力。究其原因,可能要归功于之前经历的两家信息安全公司,防火墙、审计、入侵检测等信息安全方面的烙印种子早已埋藏于心底,发芽、生根。
近期一直在研究 PostgreSQL 数据库与客户端的通信协议,时不时地篡改一下协议规约以满足项目需求,一不小心客户端就报错了、假死了,数据库进程 hang 住了,除了常规的 gdb、加日志修正问题,也开始了抓包看通信过程去分析原因。WireShark 这熟悉的界面,让我想起了搞防火墙的岁月,彷佛那台 2U 设备浮现在面前,开机时风扇满速的呼啸声又在耳畔响起来了,紧接着是对面同事那怨恨的眼神……
对于数据库的安全来说,私以为主要工作在于与之链接的网络安全,以及链接内容的安全,即是否允许某用户在某地使用某 IP 某客户端链接某数据库执行某种 SQL 操作,并且需要诊断数据库回复的内容是否安全(带有敏感信息,比如未加密的身份证号码,比如数据库的版本号等系统敏感信息)。
下面着重从几个方面来简单聊聊我所设想的 PGuard 的设计思路,首先要明确的是,这将是 PostgreSQL 数据库专用的防火墙,因为我只了解 PostgreSQL,当然从理论角度来说其他数据库应该也适用。
PGuard 部署方式
PGuard 是非侵入式的系统,即不会修改 PostgreSQL 数据库的内核代码。理论上只支持原生 PostgreSQL 数据库;但基于 PostgreSQL 二次开发的数据库,如果与客户端的通信协议未做改动,SQL 语法未做改动,亦可支持。
PGuard 可串联部署,即 PGuard 代理 PostgreSQL 数据库所有流量,实时分析审计双向流量,依据规则或阻断或放行或记录日志。同时,也可支持旁路部署,可使用端口镜像将流量导入 PGuard,做实时流量审计报警。
PGuard 软硬件规格
初期实现 PGuard 的软件版本,实现过程中留意各个功能的模块化,注意预留硬件介入接口,比如压缩解压缩、SSL 加解密比较耗性能,可以考虑使用专用硬件。
如果实时过滤流量很大,流量解析压力倍增,规则匹配繁忙,就需要定制专用硬件,运行裁剪后的操作系统,释放 PGuard 压力。硬件系统出错后应降级为直通模式并报警,或切换主备,现在搞个东西没有集群没有分布式都不好意思吹牛。
可以考虑使用专有神经网络硬件加速卡,尝试模型化特定用户的 SQL 语句执行行为,当下次 SQL 语句执行行为超出模型阈值范围时可以执行阻断。感觉可以防范程序员删库跑路,或者内鬼盗取数据库。
PGuard 主要功能特点
作为一款防火墙,流量过滤解析是必不可少的,规则配置也是不可或缺的,日志告警功能更是不能没有的,当然有一个既整洁大方又不落俗套的 Web 配置管理界面也是极好的;虽然使用命令行下发配置文本文件的方式更安全高效,但用户喜欢五颜六色的界面。
简单数了数,大概需要下面这些功能就可以实现初期的 PGuard 了。
- 灵活的部署方式
- 非侵入式系统
- Web 界面,配置、实时预览流量、报表导出
- 支持 PostgreSQL 前后端通信协议解析
- 支持 SQL 语法词法解析
- 支持 SQL 过滤,精确到表级、字段级,比如禁止 postgres 用户访问 ADMIN 数据库的 T1 表的 name 字段
- 支持 IP 段过滤,比如禁止 1.1.1.1/24 的网段接入数据库
- 数据库用户管理,配置每个数据库用户的访问权限
- 敏感操作记录,比如导出整个数据库的操作
- 通信加解密功能卸载,减轻 PostgreSQL 数据库压力
- 通信压缩解压缩功能卸载,减轻 PostgreSQL 数据库压力
- 其他功能
PGuard 协议解析器
MAC 层、IP 层、TCP 层的协议解析还好说,比较固定;主要是应用层——PostgreSQL 前后端通信协议的解析,尤其是其扩展协议的解析最为复杂,需要实现 Parse 命名 SQL 语句的动态跟踪;同时也需要解析数据库返回的信息。
PGuard SQL 解析器
当协议解析器拿到具体的 SQL 语句后,需要解析该 SQL 是否非法了,是否可以查询 T2 表,是否可以修改 T3 表;这就需要 SQL 解析器了。
如果遇到函数、视图、触发器就需要特殊处理了,可能需要提前导入这些内容让 PGuard 学习到,或者设定函数、视图的黑名名单过滤。
PGuard 规则判定器
这里要做的是配置命令的解析与生效,遇到非法访问,阻断当前链接,报警写日志,常规的那些做法。报警的方式一般有写日志记录,发 syslog,邮件报警,如果有条件可以发短信给紧急联系人,来一个短信网关模块也是不错的;如果是硬件防火墙的话,那就上一个跑马灯吧。
PGuard 释压功能
PostgreSQL 支持数据的压缩传输,压缩损耗 CPU,那就让 PGuard 来做,PostgreSQL 只管传输明文数据就好, PGuard 来做压缩,之后发送给客户端。PostgreSQL 支持 SSL 传输,SSL 的加解密也是吃性能大户,同样也可以交给 PGuard 来做。
PGuard 神经网络
当今社会,无论什么产品如果不和物联网、大数据、神经网络等等挂上点边,那真是要无人问津来。那么 PGuard 可以沾沾神经网络的光,把 SQL 解析结果扔给它,看看能不能学习出个模型来,帮助实现启发式的过滤功能。
PGuard 简易 Demo 演示
说了这么多,都是纸上谈兵,所以写了几行代码,演示给大家看看。
理想很丰满,现实很骨感,毕竟只写了三百行。功能很简单,PGuard 代理了本机的 PostgreSQL 数据库服务,当 psql 链接到 PGuard 对外服务的 IP 和端口后,可以审计到 Startup 包内的所有信息,比如用户名、数据库名,当执行 SQL 操作时,也可以审计到具体的 SQL 语句。