审计管理
前言
如果说用户管理和权限管理是数据库安全的"守门人",那么审计管理就是这些守门人的"眼睛"和"记忆"。在PostgreSQL中,审计功能记录了数据库中的所有关键操作,就像是为城堡安装了无处不在的摄像头,不仅能够记录谁做了什么,还能在出现问题时提供宝贵的线索。没有审计的安全体系就像是没有摄像头的监控系统,即使有守卫,也无法回溯事件的全过程。
PostgreSQL的审计选项
PostgreSQL提供了多种审计方式,可以根据需求选择合适的方案:
标准日志
PostgreSQL的标准日志记录了服务器的基本操作,如连接、查询、错误等。可以通过配置postgresql.conf文件来控制日志级别和格式:
# 在postgresql.conf中配置
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all' # 记录所有语句
log_line_prefix = '%m [%p] %q%u@%d ' # 日志前缀格式
log_duration = on # 记录查询持续时间
log_min_duration_statement = 1000 # 记录执行时间超过1秒的查询
log_connections = on # 记录连接
log_disconnections = on # 记录断开连接
log_lock_waits = on # 记录锁等待
log_temp_files = 1024 # 记录临时文件
扩展审计模块
除了标准日志,PostgreSQL还支持多种审计扩展:
pgaudit
pgAudit是PostgreSQL的一个功能强大的审计扩展,最初由VMware公司开发,现在由社区维护。它提供了比标准PostgreSQL日志更详细、更结构化的审计信息,能够记录数据库操作的每个细节,是PostgreSQL中最受欢迎的审计工具之一。
pgAudit的特点:
- 提供详细的审计日志,包括语句类型、对象名称、参数等
- 支持多种审计类别,可以根据需要灵活配置
- 支持审计日志的格式化输出,便于分析和处理
- 支持对特定对象或操作的审计过滤
- 支持审计日志的归档和轮转
安装pgAudit:
-- 安装pgAudit扩展
CREATE EXTENSION pgaudit;
-- 验证安装
SELECT * FROM pg_available_extensions WHERE name = 'pgaudit';
配置pgAudit:
pgAudit主要通过pgaudit.log参数配置,该参数可以设置为以下值:
-- 设置审计类别
ALTER SYSTEM SET pgaudit.log = 'all'; -- 审计所有操作
ALTER SYSTEM SET pgaudit.log = 'read,write'; -- 审计读写操作
ALTER SYSTEM SET pgaudit.log = 'ddl'; -- 审计数据定义语言
ALTER SYSTEM SET pgaudit.log = 'role'; -- 审计角色管理
ALTER SYSTEM SET pgaudit.log = 'misc'; -- 审计其他操作
-- 其他常用配置
ALTER SYSTEM SET pgaudit.log_parameter = 'on'; -- 记录语句参数
ALTER SYSTEM SET pgaudit.log_relation = 'on'; -- 记录对象名称
ALTER SYSTEM SET pgaudit.log_role = 'on'; -- 记录角色信息
ALTER SYSTEM SET pgaudit.log_statement_once = 'on'; -- 每个语句只记录一次
ALTER SYSTEM SET pgaudit.log = 'write, role,ddl'; -- 组合审计类别
-- 重载配置使设置生效
SELECT pg_reload_conf();
pgAudit支持的审计类别:
READ:读取操作(SELECT, COPY FROM, SHOW等)WRITE:写入操作(INSERT, UPDATE, DELETE, COPY TO, TRUNCATE等)FUNCTION:函数调用(CALL)ROLE:角色管理(CREATE/ALTER/DROP ROLE/USER)DDL:数据定义语言(CREATE/ALTER/DROP TABLE/SCHEMA等)MISC:其他操作(DISCONNECT, DROP OWNED等)MISC_SET:SET操作SESSION:会话操作(START TRANSACTION, COMMIT, ABORT等)SYSTEM:系统操作(ALTER SYSTEM, CREATE/DROP EXTENSION等)
使用pgAudit审计特定对象:
-- 审计特定表
ALTER TABLE sensitive_data ENABLE ROW LEVEL SECURITY;
ALTER TABLE sensitive_data ADD POLICY audit_policy ON sensitive_data FOR ALL USING (true);
-- 审计特定模式
ALTER SCHEMA finance SET pgaudit.log = 'all';
pgAudit日志示例:
-- 创建表
CREATE TABLE employees (id int, name text);
-- pgaudit日志:DDL-CREATE: TABLE public.employees
-- 插入数据
INSERT INTO employees VALUES (1, 'John Doe');
-- pgaudit日志:WRITE-INSERT: TABLE public.employees
-- 查询数据
SELECT * FROM employees WHERE id = 1;
-- pgaudit日志:READ-SELECT: TABLE public.employees
-- 更新数据
UPDATE employees SET name = 'John Smith' WHERE id = 1;
-- pgaudit日志:WRITE-UPDATE: TABLE public.employees
pgAudit高级配置:
-- 设置审计日志格式
ALTER SYSTEM SET log_line_prefix = '%m [%p] %q%u@%d [%a] ';
-- 设置审计日志文件路径
ALTER SYSTEM SET pgaudit.log_directory = 'pg_audit';
-- 设置审计日志文件名
ALTER SYSTEM SET pgaudit.log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';
-- 重载配置
SELECT pg_reload_conf();
分析pgAudit日志:
# 使用grep过滤特定操作
grep "DDL-CREATE" /path/to/pg_audit.log
# 使用awk提取信息
awk '/READ-SELECT/ {print $1, $2, $3, $4, $5, $6}' /path/to/pg_audit.log
# 使用ELK Stack分析审计日志
# (配置略)
audit_ext
audit_ext是另一个流行的审计扩展,提供更灵活的审计规则:
-- 安装audit_ext
CREATE EXTENSION audit_ext;
-- 创建审计策略
SELECT audit.audit_table('public', 'employees');
SELECT audit.audit_schema('public');
-- 查看审计日志
SELECT * FROM audit.log;
审计内容配置
无论使用哪种审计方式,都需要配置审计内容。以下是常见的审计配置:
审计特定表
-- 使用pgAudit审计特定表
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;
ALTER TABLE employees ADD POLICY audit_policy ON employees FOR ALL USING (true);
-- 使用标准日志审计特定表
ALTER SYSTEM SET log_statement = 'ddl';
ALTER SYSTEM SET log_min_duration_statement = 0;
审计敏感操作
-- 使用pgAudit审计敏感操作
ALTER SYSTEM SET pgaudit.log = 'role,ddl';
ALTER SYSTEM SET pgaudit.log_parameter = 'on';
审计登录和登出
-- 配置标准日志记录登录和登出
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
审计日志管理
审计日志会产生大量数据,需要妥善管理:
日志轮转
-- 配置日志轮转
log_rotation_age = 1d # 每天轮转一次
log_rotation_size = 100MB # 文件大小达到100MB时轮转
日志归档
# 使用logrotate工具管理日志
/path/to/pg_log/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 postgres postgres
}
日志分析
可以使用多种工具分析审计日志:
# 使用grep过滤特定操作
grep "SELECT.*employees" /path/to/logfile.log
# 使用awk提取信息
awk '/LOGIN/ {print $1, $2, $3, $4, $5, $6}' /path/to/logfile.log
# 使用ELK Stack分析审计日志
# (配置略)