block_copy_command

通过可配置的 ProcessUtility hook 阻止 COPY 命令

概览

扩展包名版本分类许可证语言
block_copy_command0.1.5SECBSD 3-ClauseRust
ID扩展名BinLibLoadCreateTrustReloc模式
7405block_copy_command-

Requires shared_preload_libraries = block_copy_command.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.51817161514block_copy_command-
RPMPIGSTY0.1.51817161514block_copy_command_$v-
DEBPIGSTY0.1.51817161514postgresql-$v-block-copy-command-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
el8.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
el9.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
el9.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
el10.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
el10.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
d12.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
d12.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
d13.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
d13.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u22.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u22.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u24.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u24.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u26.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
u26.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS

构建

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

pig build pkg block_copy_command         # 构建 RPM / DEB 包

安装

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

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

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

pig install block_copy_command;          # 当前活跃 PG 版本安装
pig ext install -y block_copy_command -v 18  # PG 18
pig ext install -y block_copy_command -v 17  # PG 17
pig ext install -y block_copy_command -v 16  # PG 16
pig ext install -y block_copy_command -v 15  # PG 15
pig ext install -y block_copy_command -v 14  # PG 14
dnf install -y block_copy_command_18       # PG 18
dnf install -y block_copy_command_17       # PG 17
dnf install -y block_copy_command_16       # PG 16
dnf install -y block_copy_command_15       # PG 15
dnf install -y block_copy_command_14       # PG 14
apt install -y postgresql-18-block-copy-command   # PG 18
apt install -y postgresql-17-block-copy-command   # PG 17
apt install -y postgresql-16-block-copy-command   # PG 16
apt install -y postgresql-15-block-copy-command   # PG 15
apt install -y postgresql-14-block-copy-command   # PG 14

预加载配置

shared_preload_libraries = 'block_copy_command';

创建扩展

CREATE EXTENSION block_copy_command;

用法

block_copy_command 安装一个 ProcessUtility hook 来拦截 COPY 语句。库一旦加载,该 hook 就会在整个集群范围内生效,而 CREATE EXTENSION 只是在某个数据库中登记元数据。

启用扩展

shared_preload_libraries = 'block_copy_command'
CREATE EXTENSION block_copy_command;

上游 README 标明支持 PostgreSQL 13-18。

阻断规则

默认情况下,非超级用户不能执行 COPY TOCOPY FROM

COPY my_table TO STDOUT;
COPY my_table FROM STDIN;
COPY (SELECT * FROM my_table) TO '/tmp/out.csv';

文档给出的优先级如下:

  • block_copy_command.blocked_roles:始终阻断,即使是超级用户。
  • block_copy_command.block_program = on:对所有用户阻断 COPY ... PROGRAM
  • block_copy_command.enabled = off:允许不在 blocked_roles 中的角色执行 COPY
  • 其他情况下,超级用户可以绕过方向阻断。
  • block_copy_command.block_toblock_copy_command.block_from 控制对非超级用户的导出/导入阻断。

主要配置

  • block_copy_command.enabled:非超级用户阻断的总开关。
  • block_copy_command.block_to:阻断 COPY TO
  • block_copy_command.block_from:阻断 COPY FROM
  • block_copy_command.block_program:对所有用户阻断 COPY TO/FROM PROGRAM
  • block_copy_command.hint:为被阻止的错误追加自定义 HINT
  • block_copy_command.blocked_roles:以逗号分隔的始终阻断角色列表。
  • block_copy_command.audit_log_enabled:将拦截事件写入审计表。

审计与注意事项

无论命令最终被允许还是被阻止,扩展都会进行拦截;同时它还定义了 block_copy_command.audit_log,并会把被阻止事件写入服务器日志。README 特别说明了一个重要 caveat:被阻止事件的审计行是在抛错前插入的,因此会随着事务一起回滚。实际使用时,PostgreSQL 服务器日志才是被阻止 COPY 尝试的权威记录。