pg_snakeoil

PostgreSQL动态链接库反病毒功能

概览

扩展包名版本分类许可证语言
pg_snakeoil1.4SECPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
7380pg_snakeoil-
相关扩展pg_crash pg_cheat_funcs pg_dirtyread pg_savior pg_surgery pageinspect pg_catcheck amcheck

require clamV libs

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.41817161514pg_snakeoil-
RPMPIGSTY1.41817161514pg_snakeoil_$v-
DEBPGDG1.41817161514postgresql-$v-snakeoil-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
d12.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
d13.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
d13.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u22.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u22.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u24.x86_64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
u24.aarch64
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4
PGDG 1.4

构建

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

pig build pkg pg_snakeoil         # 构建 RPM 包

安装

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

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

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

pig install pg_snakeoil;          # 当前活跃 PG 版本安装
pig ext install -y pg_snakeoil -v 18  # PG 18
pig ext install -y pg_snakeoil -v 17  # PG 17
pig ext install -y pg_snakeoil -v 16  # PG 16
pig ext install -y pg_snakeoil -v 15  # PG 15
pig ext install -y pg_snakeoil -v 14  # PG 14
dnf install -y pg_snakeoil_18       # PG 18
dnf install -y pg_snakeoil_17       # PG 17
dnf install -y pg_snakeoil_16       # PG 16
dnf install -y pg_snakeoil_15       # PG 15
dnf install -y pg_snakeoil_14       # PG 14
apt install -y postgresql-18-snakeoil   # PG 18
apt install -y postgresql-17-snakeoil   # PG 17
apt install -y postgresql-16-snakeoil   # PG 16
apt install -y postgresql-15-snakeoil   # PG 15
apt install -y postgresql-14-snakeoil   # PG 14

预加载配置

shared_preload_libraries = 'pg_snakeoil';

创建扩展

CREATE EXTENSION pg_snakeoil;

用法

pg_snakeoil: PostgreSQL 数据的 ClamAV 防病毒扫描

pg_snakeoil 提供对 PostgreSQL 中存储数据的 ClamAV 病毒扫描功能,不干扰正常的数据库操作。

CREATE EXTENSION pg_snakeoil;

函数

函数返回类型描述
so_is_infected(text)bool检查文本数据是否匹配病毒特征
so_is_infected(bytea)bool检查 bytea 数据是否匹配病毒特征
so_virus_name(text)text如果感染则返回病毒名称,否则返回空字符串
so_virus_name(bytea)text如果感染则返回病毒名称,否则返回 NULL
so_update_signatures()bool重新加载病毒特征库,如有变化返回 true

即时扫描

SELECT so_is_infected('Not a virus!');
-- f

SELECT so_is_infected('X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*');
-- t

SELECT so_virus_name('X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*');
-- Eicar-Test-Signature

使用域进行实时防护

CREATE DOMAIN safe_text AS text CHECK (NOT so_is_infected(value));
CREATE TABLE t1 (safe safe_text);

INSERT INTO t1 VALUES ('This text is safe!');
-- INSERT

INSERT INTO t1 VALUES('X5O!P%@AP...');
-- NOTICE: Virus found: Eicar-Test-Signature
-- ERROR: value for domain safe_text violates check constraint "safe_text_check"

使用触发器进行实时防护

CREATE OR REPLACE FUNCTION check_virus() RETURNS trigger AS $$
BEGIN
    IF so_is_infected(NEW.content) THEN
        RAISE EXCEPTION 'Virus detected: %', so_virus_name(NEW.content);
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER virus_check BEFORE INSERT OR UPDATE ON uploads
    FOR EACH ROW EXECUTE FUNCTION check_virus();

最后修改 2026-03-14: update extension metadata (953cbd0)