pg_command_fw
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_command_fw | 0.1.0 | SEC | BSD-3-Clause | Rust |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 7400 | pg_command_fw | 否 | 是 | 是 | 是 | 否 | 否 | - |
| 相关扩展 | pgextwlist supautils block_copy_command pg_kpart noset sepgsql set_user pg_permissions pg_readonly pg_roast |
|---|
Requires shared_preload_libraries = pg_command_fw to activate hooks for all sessions.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 0.1.0 | 1817161514 | pg_command_fw | - |
| RPM | PIGSTY | 0.1.0 | 1817161514 | pg_command_fw_$v | - |
| DEB | PIGSTY | 0.1.0 | 1817161514 | postgresql-$v-pg-command-fw | - |
构建
您可以使用 pig build 命令构建 pg_command_fw 扩展的 RPM / DEB 包:
pig build pkg pg_command_fw # 构建 RPM / DEB 包
安装
您可以直接安装 pg_command_fw 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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;
用法
- 来源:README
pg_command_fw 是 PostgreSQL 命令防火墙。它通过 ProcessUtility 钩子拦截 DDL 和工具命令,并通过解析后分析钩子阻断部分内置文件读取函数。每个命令类别都有自己的 GUC 控制。
启用扩展
该扩展必须预加载:
shared_preload_libraries = 'pg_command_fw'
然后在数据库中启用:
CREATE EXTENSION pg_command_fw;
Pigsty 包元数据记录版本 0.1.0,覆盖 PostgreSQL 15-18,并说明需要预加载才能在所有会话中激活钩子。上游 README 也记录 PostgreSQL 15-18 支持。
命令类别
上游 README 记录了这些防火墙类别:
TRUNCATE:pg_command_fw.block_truncate,默认on,阻断非超级用户。DROP TABLE:pg_command_fw.block_drop_table,默认off,启用后阻断非超级用户。ALTER SYSTEM:pg_command_fw.block_alter_system,默认on,阻断所有人。LOAD:pg_command_fw.block_load,默认on,阻断所有人。COPY ... PROGRAM:pg_command_fw.block_copy_program,默认on,阻断所有人。- 普通
COPY:pg_command_fw.block_copy,默认off,启用后阻断非超级用户。 pg_read_file()、pg_read_binary_file()和pg_stat_file():pg_command_fw.block_read_file,默认on,阻断所有人。
部分类别只阻断非超级用户,另一些类别阻断包括超级用户在内的所有人。除非显式列入 pg_command_fw.blocked_roles,超级用户只会豁免非超级用户类别。
重要 GUC
pg_command_fw.enabled:启用或禁用所有检查pg_command_fw.block_truncatepg_command_fw.block_drop_tablepg_command_fw.production_schemaspg_command_fw.block_alter_systempg_command_fw.block_loadpg_command_fw.block_copy_programpg_command_fw.block_copypg_command_fw.block_read_filepg_command_fw.blocked_rolespg_command_fw.hintpg_command_fw.audit_log_enabled
设置 production_schemas 时,DROP TABLE 检查仅限这些模式中显式带模式名的表名;README 说明未限定名称不会通过 search_path 解析。
审计日志
扩展会在 command_fw.audit_log 中记录被拦截的命令。README 记录的列包括:
- timestamp 时间戳
- session 和 current user 名称
- 原始查询文本
- 命令类型
- 目标模式或对象
- 客户端地址
- 命令是否被阻断
- 内部阻断原因
被阻断的审计插入只会尽力完成,因为该行会随被阻断事务回滚;请使用 PostgreSQL 服务器日志作为被阻断事件的权威记录。
示例
在生产模式中阻断 TRUNCATE 和 DROP 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();
在维护会话中临时禁用防火墙:
SET pg_command_fw.enabled = off;
TRUNCATE big_table;
SET pg_command_fw.enabled = on;