SQL防火墙共有三种模式,学习模式、预警模式与防火墙模式。 • 学习模式,防火墙会记录用户的SQL查询,作为用户常用查询的预期白名单,此时防火墙打开不做校验。 • 预警模式,此模式下,防火墙会对用户的SQL进行判断,如果用户的SQL不在白名单中,仍然会执行该SQL,但是会给用户一个报警,告知用户这条SQL不符合白名单记录的业务规则。 • 防火墙模式,此模式下,防火墙会对用户的SQL进行判断。如果用户的SQL不在白名单中,防火墙会拒绝该SQL的执行并告知用户这是一个错误。

SQL防火墙的使用

• PostgreSQL内置了很多的HOOK,这些HOOK可以方便开发者加入一些功能,例如在SQL parser阶段的HOOK,可以加入一些SQL统计,SQL篡改,SQL REWRITE的功能。在SQL执行阶段的HOOK,可以用来拒绝执行等。共享内存分配阶段的HOOK,可以用来分配用户自定义进程的共享内存等。 • SQL_FIREWALL是PostgreSQL的一个SQL防火墙插件,利用了一些HOOK,实现了SQL防火墙的功能。

HOOK 注入设计

image.png SQL_FIREWALL一共改写了7个hook函数,关系如上图所示,其方式几乎等同于pg_stat_statments。 • pgss_shmem_startup与pgss_shmem_shutdown 分别负责在其启动时将文件中的内容加载到共享内存汇总与关闭时将共享内存中的内容存储回文件。 • pgss_ProcessUtility与 pgss_post_parse_analyze 分别负责DDL与DML的解析与记录,被记录到hash表中。 • pgss_ExecutorStart/pgss_ExecutorRun/pgss_ExecutorFinish/pgss_ExecutorStart 记录SQL的统计信息

存储模块设计

SQL_FIREWALL 的数据和规则交替存储与共享内存与文件系统中。当系统运行时,SQL_FIREWALL读取本地文件到内存中,并生成一个临时文件;而当系统关闭时,SQL_FIREWALL将内存中的信息存储到文件中。