1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG283-PG 安全审计:使用 pgAudit 插件实现细粒度审计

本文档详细介绍PostgreSQL中使用pgAudit插件实现细粒度安全审计,风哥教程参考PostgreSQL官方文档内容,适合数据库管理员在生产环境中配置和使用审计功能,确保数据库操作的可追溯性和安全性。

Part01-基础概念与理论知识

1.1 pgAudit 插件概述

pgAudit是PostgreSQL的一个扩展插件,用于提供细粒度的审计功能。它可以记录数据库中的各种操作,包括DML(数据修改)、DDL(数据定义)、DCL(数据控制)和其他管理操作。pgAudit可以帮助组织满足合规要求,如PCI DSS、HIPAA等。更多视频教程www.fgedu.net.cn

pgAudit的主要特性:

  • 细粒度审计:可以精确控制要审计的操作类型
  • 灵活的审计策略:可以根据用户、数据库、表等设置不同的审计策略
  • 详细的审计日志:记录操作的详细信息,包括操作类型、用户、时间、对象等
  • 合规支持:帮助满足各种合规要求

1.2 审计级别

pgAudit支持以下审计级别:

  • SESSION:审计整个会话中的操作
  • OBJECT:审计特定对象的操作
  • STATEMENT:审计特定类型的语句
  • ROLE:审计角色相关的操作
  • READ:审计读取操作
  • WRITE:审计写入操作

1.3 审计事件

pgAudit可以审计以下类型的事件:

  • DDL事件:CREATE、ALTER、DROP等数据定义语句
  • DML事件:INSERT、UPDATE、DELETE等数据修改语句
  • DCL事件:GRANT、REVOKE等权限管理语句
  • SELECT事件:查询操作
  • 其他事件:登录、注销、事务等操作
风哥提示:pgAudit是PostgreSQL中实现细粒度审计的重要工具,对于需要满足合规要求的组织尤为重要。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 审计规划

— 审计规划

— 1. 审计目标确定
— – 确定需要审计的操作类型
— – 确定需要审计的对象
— – 确定审计的详细程度
— – 确定审计日志的存储和保留策略

— 2. 审计范围规划
— 生产环境审计范围示例:
— – 所有DDL操作(CREATE、ALTER、DROP等)
— – 所有DCL操作(GRANT、REVOKE等)
— – 敏感表的DML操作(INSERT、UPDATE、DELETE)
— – 敏感表的SELECT操作
— – 登录和注销事件

— 3. 审计策略制定
— – 为不同用户设置不同的审计策略
— – 为不同数据库设置不同的审计策略
— – 为不同表设置不同的审计策略
— – 确定审计日志的存储位置和保留期限

2.2 性能考虑

pgAudit的性能考虑:

  • 审计开销:启用审计会增加数据库的开销,特别是详细审计时
  • 日志存储:审计日志会占用大量存储空间,需要合理规划
  • I/O影响:审计日志的写入会增加I/O操作
  • 查询性能:详细审计可能会影响查询性能
风哥教程针对生产环境建议:在保证审计需求的前提下,尽量减少审计的范围和详细程度,以降低性能影响。from PostgreSQL视频:www.itpux.com

2.3 安全考虑

审计的安全考虑:

  • 审计日志安全:确保审计日志的安全存储,防止未授权访问
  • 日志完整性:确保审计日志的完整性,防止篡改
  • 权限控制:严格控制审计相关的权限,防止滥用
  • 合规要求:确保审计策略满足相关合规要求

Part03-生产环境项目实施方案

3.1 pgAudit 安装

— pgAudit 安装

— 1. 从源码安装
— 下载pgAudit源码
$ git clone https://github.com/pgaudit/pgaudit.git
$ cd pgaudit

— 编译和安装
$ make
$ make install

— 2. 从包管理器安装
— Debian/Ubuntu
$ apt-get install postgresql-18-pgaudit

— Red Hat/CentOS
$ yum install postgresql18-pgaudit

— 3. 启用pgAudit
— 修改postgresql.conf文件
$ vi /postgresql/fgdata/postgresql.conf

— 添加pgAudit到shared_preload_libraries
shared_preload_libraries = ‘pgaudit’

— 4. 重启PostgreSQL服务
$ systemctl restart postgresql-18

— 5. 创建pgAudit扩展
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb

fgedudb=# CREATE EXTENSION pgaudit;

— 6. 验证安装
fgedudb=# SELECT * FROM pg_extension WHERE extname = ‘pgaudit’;

— 输出:
— extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
— ———-+———-+————–+—————-+————+———–+—————
— pgaudit | 10 | 11 | f | 1.7.0 | |
— (1 row)

3.2 pgAudit 配置

— pgAudit 配置

— 1. 基本配置
— 修改postgresql.conf文件
$ vi /postgresql/fgdata/postgresql.conf

— 配置审计级别
pgaudit.log = ‘ddl, dml, role’

— 配置审计日志格式
pgaudit.log_format = ‘json’

— 配置审计日志详细程度
pgaudit.log_level = ‘log’

— 配置审计会话标签
pgaudit.session_label = ‘fgedu_audit’

— 2. 高级配置
— 配置审计范围
pgaudit.log_catalog = on
pgaudit.log_parameter = on
pgaudit.log_relation = on
pgaudit.log_statement_once = off

— 3. 基于对象的审计
— 创建审计策略
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb

— 审计特定表的所有操作
fgedudb=# AUDIT SELECT, INSERT, UPDATE, DELETE ON fgedu_users;

— 审计特定模式的所有操作
fgedudb=# AUDIT ALL ON SCHEMA public;

— 4. 基于角色的审计
— 审计特定角色的操作
fgedudb=# AUDIT ALL BY fgedu_admin;

— 5. 查看审计配置
fgedudb=# SELECT * FROM pg_pgaudit_audit_log;

— 6. 修改审计配置
— 移除审计策略
fgedudb=# NOAUDIT SELECT ON fgedu_users;

3.3 审计日志管理

— 审计日志管理

— 1. 日志配置
— 修改postgresql.conf文件
$ vi /postgresql/fgdata/postgresql.conf

— 配置日志文件
log_directory = ‘log’
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’
log_rotation_age = 1d
log_rotation_size = 100MB

— 配置日志格式
log_line_prefix = ‘%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ‘

— 2. 日志存储
— 创建专用的审计日志目录
$ mkdir -p /postgresql/audit_logs
$ chown -R postgres:postgres /postgresql/audit_logs
$ chmod 700 /postgresql/audit_logs

— 配置日志归档
$ vi /postgresql/scripts/archive_audit_logs.sh

#!/bin/bash
# archive_audit_logs.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

LOG_DIR=”/postgresql/fgdata/log”
ARCHIVE_DIR=”/postgresql/audit_logs/$(date +%Y-%m-%d)”

mkdir -p “$ARCHIVE_DIR”

find “$LOG_DIR” -name “postgresql-*.log” -mtime +7 -exec mv {} “$ARCHIVE_DIR” \;

— 设置定时任务
$ crontab -e

0 0 * * * /postgresql/scripts/archive_audit_logs.sh

— 3. 日志清理
— 创建清理脚本
$ vi /postgresql/scripts/clean_audit_logs.sh

#!/bin/bash
# clean_audit_logs.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

ARCHIVE_DIR=”/postgresql/audit_logs”

— 删除30天前的审计日志
find “$ARCHIVE_DIR” -type f -mtime +30 -exec rm {} \;

— 设置定时任务
$ crontab -e

0 0 * * * /postgresql/scripts/clean_audit_logs.sh

— 4. 日志分析
— 使用pgBadger分析审计日志
$ pgbadger -o /var/www/html/audit_report.html /postgresql/fgdata/log/postgresql-*.log

风哥提示:合理管理审计日志,确保日志的安全存储和及时清理,避免存储空间不足。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 pgAudit 安装与配置案例

— pgAudit 安装与配置案例:生产环境设置

— 场景:在生产环境中安装和配置pgAudit,实现细粒度审计

— 实施步骤:

— 1. 安装pgAudit
— 从源码安装
$ git clone https://github.com/pgaudit/pgaudit.git
$ cd pgaudit
$ make
$ make install

— 2. 配置PostgreSQL
— 修改postgresql.conf文件
$ vi /postgresql/fgdata/postgresql.conf

— 添加pgAudit到shared_preload_libraries
shared_preload_libraries = ‘pgaudit’

— 配置审计级别
pgaudit.log = ‘ddl, dml, role, read’

— 配置审计日志格式
pgaudit.log_format = ‘json’

— 配置审计日志详细程度
pgaudit.log_level = ‘log’

— 配置审计参数
pgaudit.log_parameter = on
pgaudit.log_relation = on
pgaudit.log_statement_once = off

— 3. 重启PostgreSQL服务
$ systemctl restart postgresql-18

— 4. 创建pgAudit扩展
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb

fgedudb=# CREATE EXTENSION pgaudit;

— 5. 验证安装
fgedudb=# SELECT * FROM pg_extension WHERE extname = ‘pgaudit’;

— 6. 测试审计
— 执行DDL操作
fgedudb=# CREATE TABLE fgedu_audit_test (id SERIAL PRIMARY KEY, name VARCHAR(50));

— 执行DML操作
fgedudb=# INSERT INTO fgedu_audit_test (name) VALUES (‘test’);

— 执行SELECT操作
fgedudb=# SELECT * FROM fgedu_audit_test;

— 查看审计日志
$ tail -f /postgresql/fgdata/log/postgresql-2026-04-07_120000.log

— 审计日志输出示例:
— 2026-04-07 12:34:56 UTC [12345]: [1-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: SESSION,1,1,DDL,CREATE TABLE,TABLE,public.fgedu_audit_test,”CREATE TABLE fgedu_audit_test (id SERIAL PRIMARY KEY, name VARCHAR(50));”,
— 2026-04-07 12:34:57 UTC [12345]: [2-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: SESSION,1,2,DML,INSERT,TABLE,public.fgedu_audit_test,”INSERT INTO fgedu_audit_test (name) VALUES (‘test’);”,
— 2026-04-07 12:34:58 UTC [12345]: [3-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: SESSION,1,3,READ,SELECT,TABLE,public.fgedu_audit_test,”SELECT * FROM fgedu_audit_test;”,

4.2 审计策略配置案例

— 审计策略配置案例:敏感数据审计

— 场景:为敏感表配置详细审计,确保数据操作的可追溯性

— 实施步骤:

— 1. 创建敏感表
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb

fgedudb=# CREATE TABLE fgedu_users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(100) NOT NULL,
role VARCHAR(20) NOT NULL
);

fgedudb=# CREATE TABLE fgedu_customers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone VARCHAR(20) NOT NULL,
address TEXT,
credit_card VARCHAR(16) NOT NULL
);

— 2. 配置审计策略
— 审计所有DDL操作
fgedudb=# AUDIT DDL;

— 审计敏感表的所有操作
fgedudb=# AUDIT SELECT, INSERT, UPDATE, DELETE ON fgedu_users;
fgedudb=# AUDIT SELECT, INSERT, UPDATE, DELETE ON fgedu_customers;

— 审计权限管理操作
fgedudb=# AUDIT ROLE;

— 3. 测试审计策略
— 执行敏感表操作
fgedudb=# INSERT INTO fgedu_users (name, email, password, role) VALUES (‘Admin’, ‘admin@fgedu.net.cn’, ‘admin123’, ‘admin’);
fgedudb=# UPDATE fgedu_customers SET credit_card = ‘1234567812345678’ WHERE id = 1;
fgedudb=# SELECT * FROM fgedu_customers WHERE credit_card LIKE ‘1234%’;

— 执行权限操作
fgedudb=# CREATE ROLE fgedu_readonly;
fgedudb=# GRANT SELECT ON fgedu_users TO fgedu_readonly;

— 查看审计日志
$ tail -f /postgresql/fgdata/log/postgresql-2026-04-07_120000.log

— 审计日志输出示例:
— 2026-04-07 12:34:56 UTC [12345]: [1-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: OBJECT,1,1,INSERT,TABLE,public.fgedu_users,”INSERT INTO fgedu_users (name, email, password, role) VALUES (‘Admin’, ‘admin@fgedu.net.cn’, ‘admin123’, ‘admin’);”,
— 2026-04-07 12:34:57 UTC [12345]: [2-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: OBJECT,1,2,UPDATE,TABLE,public.fgedu_customers,”UPDATE fgedu_customers SET credit_card = ‘1234567812345678’ WHERE id = 1;”,
— 2026-04-07 12:34:58 UTC [12345]: [3-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: OBJECT,1,3,SELECT,TABLE,public.fgedu_customers,”SELECT * FROM fgedu_customers WHERE credit_card LIKE ‘1234%’;”,
— 2026-04-07 12:34:59 UTC [12345]: [4-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: SESSION,1,4,ROLE,CREATE ROLE,,”CREATE ROLE fgedu_readonly;”,
— 2026-04-07 12:35:00 UTC [12345]: [5-1] user=fgedu,db=fgedudb,app=psql,client=192.168.1.101 LOG: AUDIT: SESSION,1,5,ROLE,GRANT,,”GRANT SELECT ON fgedu_users TO fgedu_readonly;”,

4.3 审计日志分析案例

— 审计日志分析案例:安全事件检测

— 场景:分析审计日志,检测潜在的安全事件

— 实施步骤:

— 1. 收集审计日志
— 确保审计日志已启用并配置正确

— 2. 分析审计日志
— 使用pgBadger分析审计日志
$ pgbadger -o /var/www/html/audit_analysis.html /postgresql/fgdata/log/postgresql-*.log

— 3. 手动分析审计日志
— 提取敏感操作
$ grep -E “AUDIT.*(DELETE|UPDATE|GRANT|REVOKE)” /postgresql/fgdata/log/postgresql-*.log

— 提取特定用户的操作
$ grep -E “user=fgedu_admin.*AUDIT” /postgresql/fgdata/log/postgresql-*.log

— 提取特定表的操作
$ grep -E “TABLE,public.fgedu_customers.*AUDIT” /postgresql/fgdata/log/postgresql-*.log

— 4. 检测异常操作
— 检测大量DELETE操作
$ grep -c “AUDIT.*DELETE” /postgresql/fgdata/log/postgresql-2026-04-07_*.log

— 检测非工作时间的操作
$ grep -E “(2[23]|[01][0-9]):[0-5][0-9]:[0-5][0-9].*AUDIT” /postgresql/fgdata/log/postgresql-*.log

— 检测权限变更
$ grep -E “AUDIT.*(GRANT|REVOKE)” /postgresql/fgdata/log/postgresql-*.log

— 5. 创建审计分析脚本
$ vi /postgresql/scripts/audit_analysis.sh

#!/bin/bash
# audit_analysis.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

LOG_DIR=”/postgresql/fgdata/log”
OUTPUT_DIR=”/var/www/html/audit_reports/$(date +%Y-%m-%d)”

mkdir -p “$OUTPUT_DIR”

— 分析审计日志
pgbadger -o “$OUTPUT_DIR/audit_analysis.html” “$LOG_DIR”/postgresql-*.log

— 检测异常操作
echo “=== 异常操作检测 ===” > “$OUTPUT_DIR/anomalies.txt”
echo “\n1. 大量DELETE操作:” >> “$OUTPUT_DIR/anomalies.txt”
grep -c “AUDIT.*DELETE” “$LOG_DIR”/postgresql-$(date +%Y-%m-%d)_*.log >> “$OUTPUT_DIR/anomalies.txt”

echo “\n2. 非工作时间操作:” >> “$OUTPUT_DIR/anomalies.txt”
grep -E “(2[23]|[01][0-9]):[0-5][0-9]:[0-5][0-9].*AUDIT” “$LOG_DIR”/postgresql-$(date +%Y-%m-%d)_*.log >> “$OUTPUT_DIR/anomalies.txt”

echo “\n3. 权限变更:” >> “$OUTPUT_DIR/anomalies.txt”
grep -E “AUDIT.*(GRANT|REVOKE)” “$LOG_DIR”/postgresql-$(date +%Y-%m-%d)_*.log >> “$OUTPUT_DIR/anomalies.txt”

echo “\n4. 敏感表操作:” >> “$OUTPUT_DIR/anomalies.txt”
grep -E “TABLE,public.fgedu_customers.*AUDIT” “$LOG_DIR”/postgresql-$(date +%Y-%m-%d)_*.log >> “$OUTPUT_DIR/anomalies.txt”

— 设置定时任务
$ crontab -e

0 1 * * * /postgresql/scripts/audit_analysis.sh

— 6. 配置告警
— 创建告警脚本
$ vi /postgresql/scripts/audit_alert.sh

#!/bin/bash
# audit_alert.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

LOG_FILE=”/postgresql/fgdata/log/postgresql-$(date +%Y-%m-%d)_*.log”

— 检测大量DELETE操作
DELETE_COUNT=$(grep -c “AUDIT.*DELETE” “$LOG_FILE”)
if [ “$DELETE_COUNT” -gt 10 ]; then
echo “检测到大量DELETE操作:$DELETE_COUNT次” | mail -s “PostgreSQL审计告警” admin@fgedu.net.cn
fi

— 检测权限变更
PERMISSION_COUNT=$(grep -c “AUDIT.*(GRANT|REVOKE)” “$LOG_FILE”)
if [ “$PERMISSION_COUNT” -gt 0 ]; then
echo “检测到权限变更操作:$PERMISSION_COUNT次” | mail -s “PostgreSQL审计告警” admin@fgedu.net.cn
fi

— 设置定时任务
$ crontab -e

*/15 * * * * /postgresql/scripts/audit_alert.sh

Part05-风哥经验总结与分享

5.1 pgAudit 使用技巧

pgAudit 使用技巧:

  • 合理配置审计级别:根据实际需求配置审计级别,避免过度审计影响性能
  • 使用基于对象的审计:对于敏感表,使用基于对象的审计,精确控制审计范围
  • 配置审计日志格式:使用json格式的审计日志,便于自动化分析
  • 定期分析审计日志:定期分析审计日志,检测潜在的安全事件
  • 结合监控工具:将审计日志与监控工具集成,实现实时告警

5.2 审计问题排查

— 审计问题排查

— 1. 审计日志不记录问题
— 症状:
— – 预期的操作没有被记录到审计日志中

— 排查步骤:
— – 检查pgAudit是否已安装
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb -c “SELECT * FROM pg_extension WHERE extname = ‘pgaudit’;”

— – 检查pgAudit是否已加载
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb -c “SHOW shared_preload_libraries;”

— – 检查审计配置
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb -c “SHOW pgaudit.log;”

— – 检查审计策略
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb -c “SELECT * FROM pg_pgaudit_audit_log;”

— 2. 审计性能问题
— 症状:
— – 数据库性能下降
— – 审计日志过大

— 排查步骤:
— – 检查审计配置,减少审计范围
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb -c “SHOW pgaudit.log;”

— – 检查审计日志大小
$ du -h /postgresql/fgdata/log/

— – 调整审计日志轮转设置
$ vi /postgresql/fgdata/postgresql.conf
log_rotation_size = 50MB

— 3. 审计日志分析问题
— 症状:
— – 审计日志难以分析
— – 无法提取有用信息

— 排查步骤:
— – 配置审计日志格式为json
$ psql -h 192.168.1.100 -p 5432 -U fgedu -d fgedudb -c “SHOW pgaudit.log_format;”

— – 使用pgBadger分析审计日志
$ pgbadger -o audit_report.html /postgresql/fgdata/log/postgresql-*.log

— – 创建自定义分析脚本
$ vi /postgresql/scripts/audit_analyzer.py

5.3 审计管理最佳实践

— 审计管理最佳实践

— 1. 审计规划
— – 明确审计目标和范围
— – 制定审计策略和流程
— – 确定审计日志的存储和保留策略
— – 定期审查审计策略的有效性

— 2. 审计配置
— – 合理配置审计级别,避免过度审计
— – 使用基于对象的审计,精确控制审计范围
— – 配置适当的审计日志格式和详细程度
— – 定期更新审计配置,适应业务变化

— 3. 审计日志管理
— – 确保审计日志的安全存储
— – 配置合理的日志轮转和归档策略
— – 定期清理过期的审计日志
— – 备份审计日志,防止丢失

— 4. 审计日志分析
— – 定期分析审计日志,检测潜在的安全事件
— – 使用自动化工具分析审计日志
— – 建立审计日志分析的流程和规范
— – 及时处理审计日志中的异常情况

— 5. 审计响应
— – 建立审计事件的响应流程
— – 对异常审计事件进行及时处理
— – 定期 review 审计响应的有效性
— – 持续改进审计响应流程

— 6. 合规与审计
— – 确保审计策略满足相关合规要求
— – 定期进行合规审计
— – 记录审计过程和结果
— – 持续改进审计体系

— 7. 培训与意识
— – 对数据库管理员进行审计相关培训
— – 提高开发人员的审计意识
— – 定期更新审计知识和技能
— – 建立审计文化

风哥提示:安全审计是数据库安全的重要组成部分,使用pgAudit可以实现细粒度的审计,帮助组织满足合规要求,防止未授权操作。合理配置和管理审计系统,可以在保证安全性的同时,将性能影响降到最低。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息