pg_command_fw

PostgreSQL 的 DDL 与 utility 命令防火墙

概览

扩展包名版本分类许可证语言
pg_command_fw0.1.0SECBSD-3-ClauseRust
ID扩展名BinLibLoadCreateTrustReloc模式
7400pg_command_fw-
相关扩展pgaudit pgextwlist login_hook set_user

Requires shared_preload_libraries = pg_command_fw to activate hooks for all sessions.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.01817161514pg_command_fw-
RPMPIGSTY0.1.01817161514pg_command_fw_$v-
DEBPIGSTY0.1.01817161514postgresql-$v-pg-command-fw-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISS
el8.aarch64PIGSTY MISS
el9.x86_64PIGSTY MISS
el9.aarch64PIGSTY MISS
el10.x86_64PIGSTY MISS
el10.aarch64PIGSTY MISS
d12.x86_64PIGSTY MISS
d12.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY MISS
d13.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY MISS
d13.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY MISS
u22.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY MISS
u22.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY MISS
u24.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY MISS
u24.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY MISS

构建

您可以使用 pig build 命令构建 pg_command_fw 扩展的 RPM / DEB 包:

pig build pkg pg_command_fw         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_command_fw 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_command_fw;          # 当前活跃 PG 版本安装
pig ext install -y pg_command_fw -v 18  # PG 18
pig ext install -y pg_command_fw -v 17  # PG 17
pig ext install -y pg_command_fw -v 16  # PG 16
pig ext install -y pg_command_fw -v 15  # PG 15
dnf install -y pg_command_fw_18       # PG 18
dnf install -y pg_command_fw_17       # PG 17
dnf install -y pg_command_fw_16       # PG 16
dnf install -y pg_command_fw_15       # PG 15
apt install -y postgresql-18-pg-command-fw   # PG 18
apt install -y postgresql-17-pg-command-fw   # PG 17
apt install -y postgresql-16-pg-command-fw   # PG 16
apt install -y postgresql-15-pg-command-fw   # PG 15

预加载配置

shared_preload_libraries = 'pg_command_fw';

创建扩展

CREATE EXTENSION pg_command_fw;

用法

语法:

CREATE EXTENSION pg_command_fw;
ALTER SYSTEM SET pg_command_fw.block_truncate = on;
ALTER SYSTEM SET pg_command_fw.production_schemas = 'public,payments';
SELECT pg_reload_conf();

来源:README

pg_command_fw 是 PostgreSQL 命令防火墙。它通过 ProcessUtility 钩子拦截 DDL 和 utility 命令,并通过 post-parse analyze 钩子拦截部分危险的内置文件读取函数。每个命令类别都由独立的 GUC 控制。

安装

扩展必须预加载:

shared_preload_libraries = 'pg_command_fw'

然后在数据库中启用:

CREATE EXTENSION pg_command_fw;

命令类别

上游 README 记录了以下防火墙类别:

  • TRUNCATE
  • DROP TABLE
  • ALTER SYSTEM
  • LOAD
  • COPY ... PROGRAM
  • 普通 COPY
  • pg_read_file()pg_read_binary_file()pg_stat_file()

其中部分类别仅阻止非超级用户,另一些则连超级用户也会阻止。只有当超级用户未被列入 pg_command_fw.blocked_roles 时,才会免于非超级用户类检查。

重要 GUC

  • pg_command_fw.enabled 用于整体启用或禁用所有检查
  • pg_command_fw.block_truncate
  • pg_command_fw.block_drop_table
  • pg_command_fw.production_schemas
  • pg_command_fw.block_alter_system
  • pg_command_fw.block_load
  • pg_command_fw.block_copy_program
  • pg_command_fw.block_copy
  • pg_command_fw.block_read_file
  • pg_command_fw.blocked_roles
  • pg_command_fw.hint
  • pg_command_fw.audit_log_enabled

审计日志

扩展会将拦截到的命令写入 command_fw.audit_log。README 中描述的字段包括:

  • 时间戳
  • 会话用户和当前用户
  • 原始查询文本
  • 命令类型
  • 目标模式或对象
  • 客户端地址
  • 是否被阻止
  • 内部阻止原因

示例

在生产模式下阻止 TRUNCATEDROP TABLE

ALTER SYSTEM SET pg_command_fw.block_truncate = on;
ALTER SYSTEM SET pg_command_fw.block_drop_table = on;
ALTER SYSTEM SET pg_command_fw.production_schemas = 'public,payments';
ALTER SYSTEM SET pg_command_fw.hint = 'Contact your DBA to request access';
SELECT pg_reload_conf();

阻止特定角色执行任何受防火墙管控的命令:

ALTER SYSTEM SET pg_command_fw.blocked_roles = 'app_deploy';
SELECT pg_reload_conf();

最后修改 2026-04-10: extension update (13b4540)