Skip to content

GaussDB 审计功能

审计配置

启用审计功能

参数配置

sql
-- 启用审计功能
ALTER SYSTEM SET audit_enabled = on;

-- 设置审计日志目录
ALTER SYSTEM SET audit_directory = '/var/log/gaussdb/audit';

-- 设置审计日志文件大小限制
ALTER SYSTEM SET audit_rotation_size = '100MB';

-- 设置审计日志文件保留时间
ALTER SYSTEM SET audit_file_remain_time = 90;

审计级别配置

sql
-- 设置审计级别为详细
ALTER SYSTEM SET audit_level = 'detailed';

-- 设置审计日志格式为 JSON
ALTER SYSTEM SET audit_format = 'json';

-- 设置审计日志类型为所有操作
ALTER SYSTEM SET audit_logging_type = 'all';

审计规则配置

配置审计事件

sql
-- 配置审计事件,如登录、权限变更、DDL 操作等
ALTER SYSTEM SET audit_events = 'login,logout,grant,revoke,create,drop,alter,insert,update,delete';

-- 配置不审计的用户
ALTER SYSTEM SET audit_user_exempted = 'gaussdb';

-- 配置审计的数据库
ALTER SYSTEM SET audit_database = 'mydb';

配置审计过滤条件

sql
-- 配置审计过滤规则,如只审计特定用户或操作
SELECT audit_set_filter('usename = ''user1'' AND command_tag IN (''SELECT'', ''INSERT'', ''UPDATE'', ''DELETE'')');

-- 查看当前审计过滤规则
SELECT audit_get_filter();

-- 清除审计过滤规则
SELECT audit_reset_filter();

审计日志管理

审计日志文件

日志文件命名格式

  • 审计日志文件命名格式:audit_instance_name_timestamp.log
  • 如:audit_gaussdb_20240117100000.log

日志文件轮转

  • 当审计日志文件达到 audit_rotation_size 配置的大小时,会自动轮转
  • 旧日志文件会被压缩存储
  • 超过 audit_file_remain_time 配置的日志文件会被自动清理

审计日志内容

日志字段说明

  • timestamp:审计事件发生的时间戳
  • username:执行操作的用户名
  • database:操作的数据库名称
  • client_addr:客户端 IP 地址
  • client_port:客户端端口
  • command_tag:操作类型,如 SELECT、INSERT、UPDATE 等
  • object_type:操作的对象类型,如表、视图、函数等
  • object_name:操作的对象名称
  • statement:执行的 SQL 语句
  • result:操作结果,如成功或失败
  • detail_info:详细信息,如错误码、影响行数等

日志示例

json
{
  "timestamp": "2024-01-17T10:00:00.123456+08:00",
  "username": "user1",
  "database": "mydb",
  "client_addr": "192.168.1.100",
  "client_port": 54321,
  "command_tag": "UPDATE",
  "object_type": "table",
  "object_name": "users",
  "statement": "UPDATE users SET name = 'new_name' WHERE id = 1;",
  "result": "success",
  "detail_info": "Rows affected: 1"
}

审计日志查询与分析

查询审计日志

使用 SQL 查询审计日志

sql
-- 查询最近 24 小时的审计日志
SELECT * FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00');

-- 查询特定用户的审计日志
SELECT * FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00') WHERE username = 'user1';

-- 查询特定操作类型的审计日志
SELECT * FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00') WHERE command_tag = 'DELETE';

使用命令行工具查询

bash
# 使用 gs_audittool 工具查询审计日志
gs_audittool query -d mydb -s 2024-01-16 10:00:00 -e 2024-01-17 10:00:00 -o audit_result.csv

# 查看审计日志统计信息
gs_audittool stat -d mydb -s 2024-01-16 10:00:00 -e 2024-01-17 10:00:00

审计日志分析

分析用户活动

sql
-- 统计各用户的操作次数
SELECT username, COUNT(*) AS operation_count
FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00')
GROUP BY username
ORDER BY operation_count DESC;

-- 统计各用户的操作类型分布
SELECT username, command_tag, COUNT(*) AS count
FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00')
GROUP BY username, command_tag
ORDER BY username, count DESC;

分析异常操作

sql
-- 查询失败的登录尝试
SELECT * FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00')
WHERE command_tag = 'login' AND result = 'failed';

-- 查询删除操作
SELECT * FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00')
WHERE command_tag = 'DELETE' ORDER BY timestamp DESC;

-- 查询权限变更操作
SELECT * FROM pg_query_audit('2024-01-16 10:00:00', '2024-01-17 10:00:00')
WHERE command_tag IN ('GRANT', 'REVOKE') ORDER BY timestamp DESC;

审计日志导出与备份

导出审计日志

bash
# 使用 gs_audittool 工具导出审计日志
gs_audittool export -d mydb -s 2024-01-16 10:00:00 -e 2024-01-17 10:00:00 -f audit_export.zip

# 导出为 CSV 格式
gs_audittool query -d mydb -s 2024-01-16 10:00:00 -e 2024-01-17 10:00:00 -o audit.csv -F csv

备份审计日志

bash
# 手动备份审计日志目录
cp -r /var/log/gaussdb/audit /backup/gaussdb/audit/$(date +%Y%m%d)

# 使用 rsync 同步审计日志到远程服务器
rsync -avz /var/log/gaussdb/audit/ user@remote-server:/backup/gaussdb/audit/

审计功能最佳实践

审计策略设计

分级审计

  • 对不同级别的操作设置不同的审计级别
  • 高危操作(如删除、权限变更)设置详细审计
  • 普通操作(如查询)设置基本审计

合理配置审计范围

  • 只审计必要的操作和用户,避免审计日志过大
  • 排除系统用户和频繁执行的维护操作
  • 根据业务需求调整审计范围

定期审查审计策略

  • 定期审查审计策略,根据业务变化调整
  • 评估审计日志的存储和性能影响
  • 确保审计策略符合合规要求

审计日志管理

合理设置日志保留期限

  • 根据合规要求设置日志保留期限
  • 定期清理过期日志,释放存储空间
  • 备份重要的审计日志到安全位置

监控审计日志大小

  • 设置审计日志大小告警,及时发现异常
  • 监控审计日志的增长速度,发现异常活动
  • 调整审计配置,避免日志过大影响性能

保护审计日志完整性

  • 限制审计日志文件的访问权限
  • 使用加密存储审计日志
  • 定期验证审计日志的完整性

审计日志分析

定期分析审计日志

  • 定期分析审计日志,发现异常操作
  • 建立审计日志分析流程,及时处理异常情况
  • 生成审计报告,向管理层汇报

使用自动化工具分析

  • 使用日志分析工具,如 ELK Stack、Splunk 等
  • 配置审计日志告警规则,及时发现异常
  • 建立审计日志的可视化 dashboard

结合其他安全工具

  • 结合入侵检测系统(IDS),发现恶意操作
  • 结合用户行为分析(UBA),发现异常行为
  • 结合安全信息和事件管理(SIEM)系统,实现全面安全监控

常见问题(FAQ)

Q1: 如何启用 GaussDB 的审计功能?

A1: 启用 GaussDB 审计功能的步骤:

  1. 设置 audit_enabled 参数为 on
  2. 配置审计日志目录、大小限制、保留时间等参数
  3. 配置审计级别和审计事件
  4. 重新加载配置或重启数据库实例

Q2: 审计功能会影响数据库性能吗?

A2: 审计功能会对数据库性能产生一定影响,主要取决于审计级别和审计范围:

  1. 详细审计级别会产生更多日志,对性能影响较大
  2. 只审计必要的操作和用户,可以减少性能影响
  3. 建议在测试环境评估审计功能对性能的影响,再在生产环境启用

Q3: 如何查询审计日志?

A3: 查询审计日志的方法:

  1. 使用 pg_query_audit 函数查询
  2. 使用 gs_audittool 命令行工具查询
  3. 直接查看审计日志文件(JSON 或文本格式)
  4. 使用第三方日志分析工具查询

Q4: 如何保护审计日志的安全性?

A4: 保护审计日志安全性的方法:

  1. 限制审计日志文件的访问权限,只有授权用户可以访问
  2. 使用加密存储审计日志,防止日志被篡改
  3. 定期备份审计日志到安全位置,防止日志丢失
  4. 监控审计日志的访问和修改,发现异常操作

Q5: 如何清理过期的审计日志?

A5: 清理过期审计日志的方法:

  1. 配置 audit_file_remain_time 参数,自动清理过期日志
  2. 使用 gs_audittool 工具手动清理过期日志
  3. 编写脚本定期清理过期日志
  4. 将审计日志存储到外部存储系统,自动管理生命周期

Q6: 如何审计特定用户的操作?

A6: 审计特定用户操作的方法:

  1. 配置 audit_events 参数,指定要审计的操作类型
  2. 使用 audit_set_filter 函数设置过滤条件,如只审计特定用户
  3. 配置 audit_user_exempted 参数,排除不需要审计的用户
  4. 在查询审计日志时,过滤特定用户的操作

Q7: 如何审计特定数据库的操作?

A7: 审计特定数据库操作的方法:

  1. 配置 audit_database 参数,指定要审计的数据库
  2. 使用 audit_set_filter 函数设置过滤条件,如只审计特定数据库
  3. 在查询审计日志时,过滤特定数据库的操作

Q8: 如何导出审计日志?

A8: 导出审计日志的方法:

  1. 使用 gs_audittool export 命令导出审计日志
  2. 使用 gs_audittool query 命令将审计日志导出为 CSV 格式
  3. 直接复制审计日志文件到其他位置
  4. 使用第三方工具导出和分析审计日志

Q9: 如何分析审计日志中的异常操作?

A9: 分析审计日志中异常操作的方法:

  1. 查询失败的登录尝试
  2. 分析大量的删除或修改操作
  3. 监控权限变更操作
  4. 分析异常时间的操作
  5. 结合其他安全工具,发现恶意操作

Q10: 审计功能如何满足合规要求?

A10: 审计功能满足合规要求的方法:

  1. 配置审计策略,记录所有必要的操作
  2. 确保审计日志的完整性和不可篡改性
  3. 保留足够长时间的审计日志
  4. 定期分析审计日志,发现和处理异常
  5. 生成审计报告,证明合规性
  6. 接受第三方审计,验证审计功能的有效性