Postgres扩展之PGAudit:审计

server/2024/11/15 0:20:21/

简介

PGAudit是一个专为PostgreSQL数据库设计的审计扩展模块,它为用户提供了详细的查询和命令审计功能,有助于满足监管要求并保护敏感信息。这可以帮助您满足法规的审计要求,检测可疑的数据库活动,识别并修复数据库问题。

功能特点

全面审计能力:

  • PGAudit能够记录对数据库的所有读写操作,包括SELECT、INSERT、UPDATE、DELETE等SQL命令,以及DDL(如CREATE TABLE)和系统权限修改等。
  • 它支持行模式和语句模式两种日志输出方式:行模式记录每个受影响的行,语句模式则记录整个SQL语句。

灵活配置:

  • 用户可以根据自己的需求配置审计规则,选择监视特定用户、特定表或特定操作类型。
  • 支持全局审计和角色审计,允许针对特定用户或所有用户的审计配置。

集成与定制:

  • PGAudit集成了PostgreSQL的标准日志机制,可以利用现有的日志处理工具(如logrotate或syslog)来管理和存储审计日志。
  • 日志格式可以定制,以适应不同的日志分析工具。

合规性支持:

  • 对于金融、医疗等受严格法规约束的行业,PGAudit可以帮助满足PCI DSS、HIPAA等合规性要求。
  • 它能够生成符合合规性标准的审计报告。

安全性增强:

  • 通过审计功能,数据库管理员可以检测潜在的安全风险,如未经授权的访问或数据修改。
  • 可以记录和报告异常或可疑的数据库活动。

性能优化:

  • 分析查询历史,找出低效的SQL,有助于提升数据库性能。
  • 尽管PGAudit会生成大量的日志记录,但它使用高效的日志记录机制,可以在不影响数据库性能的情况下记录和监视数据库活动。

工作原理

PGAudit在PostgreSQL内核级别插入审计钩子。当执行查询或命令时,这些钩子捕获并记录相关信息,如事件类型、用户名、时间戳、SQL语句等,并将这些信息写入审计日志文件中。

以下是一个简单的教程,指导你如何配置 PGAudit 并在 PostgreSQL 中使用它。

准备工作

登录MemFire Cloud平台,创建一个新应用,如下图所示:

应用创建成功后,即可获得一个云端的Postgres数据库

启用PGAudit扩展

  1. 转到仪表板中的数据库页面。

  2. 点击侧边栏中的扩展

  3. 搜索pgaudit并启用该扩展。

以下是如何启用和禁用 pgaudit扩展的 SQL 代码:

-- Enable the "pgaudit" extension
create extension pgaudit;
​
-- Disable the "pgaudit" extension
drop extension if exists pgaudit;

即使 SQL 代码是 create extension,这等同于启用扩展。要禁用扩展,你可以调用 drop extension

配置扩展

PGAudit可以用不同的精度级别进行配置。

PGAudit日志记录精度

  • 会话:记录连接内的活动,比如psql连接。

  • 用户:记录特定数据库用户(例如,匿名用户或postgres)的活动。

  • 全局:记录整个数据库的活动。

  • 对象:记录与特定数据库对象(例如,auth.users表)相关的事件。

尽管会话、用户和全局模式在精度上有所不同,但它们都被认为属于会话模式,并且使用相同的输入类别进行配置。

会话模式类别

这些模式可以监控数据库操作的预定义类别:

类别它记录的内容描述
read数据检索(SELECT, COPY)跟踪正在访问的数据。
write数据修改(INSERT, DELETE, UPDATE, TRUNCATE, COPY)跟踪对数据库所做的更改。
function函数、过程和DO/END块的执行跟踪例程/函数的执行
role用户管理操作(用户和权限上的CREATE, DROP, ALTER)跟踪用户权限和访问的更改。
ddl架构更改(CREATE, DROP, ALTER语句)监控对数据库结构(表、索引等)的修改。
misc不太常见的命令(FETCH, CHECKPOINT)如果需要,捕获不太常见的操作以进行深入分析。
all以上所有综合日志记录,用于完整的审计跟踪。

会话日志记录

当您在会话环境中连接,例如psql连接时,您可以配置PGAudit以记录会话内启动的事件。

在会话中,默认情况下,PGAudit不会记录任何内容:

-- 返回'none'
SHOW pgaudit.log;

查看结果如下:

在会话中,您可以设置pgaudit.log变量以记录事件:

-- 记录CREATE, ALTER和DROP事件
SET pgaudit.log = 'ddl';
-- 记录所有CREATE, ALTER, DROP和SELECT事件
SET pgaudit.log = 'read, ddl';
-- 不记录任何内容
SET pgaudit.log = 'none';

用户日志记录

在某些情况下,您可能想要监控数据库用户的活动。例如,假设您将数据库连接到Zapier并为其创建了一个自定义角色:

CREATE USER "test" WITH PASSWORD '<new password>';

您可能想要记录zapier发起的所有操作,这可以通过以下命令完成:

ALTER ROLE "test" SET pgaudit.log to 'all';

执行结果如下:

要删除设置,请执行以下代码:

-- 禁用角色的日志记录
ALTER ROLE "test" SET pgaudit.log to 'none';
-- 检查更改是否已最终确定:
SELECTrolname,rolconfig
FROM pg_roles
WHERE rolname = 'test';
-- 应该返回一个包含"pgaudit.log=none"的rolconfig路径

执行结果如下:

全局日志记录

以下SQL配置PGAudit记录与"postgres"角色关联的所有事件。由于它具有广泛的权限,这实际上监控了所有数据库活动。

ALTER ROLE "postgres" SET pgaudit.log to 'all';

要检查postgres角色是否正在审计,请执行以下命令:

SELECTrolname,rolconfig
FROM pg_roles
WHERE rolname = 'postgres';
-- 应该返回一个包含"pgaudit.log=all"的rolconfig路径

执行结果如下:

要删除设置,请执行以下代码:

ALTER ROLE "postgres" SET pgaudit.log to 'none';

对象日志记录

要微调PGAudit将记录哪些对象事件,您必须创建一个具有有限权限的自定义数据库角色:

CREATE ROLE "some_audit_role" NOINHERIT;

没有其他Postgres用户可以通过此角色进行假设或登录。它仅存在以安全地定义PGAudit将记录的内容。

创建角色后,您可以通过将pgaudit.role变量分配给它来指导PGAudit进行日志记录:

ALTER ROLE "postgres" SET pgaudit.role to 'some_audit_role';

然后,您可以将角色分配给仅监控批准的对象事件,例如包括特定表的select语句:

GRANT SELECT ON random_table TO "some_audit_role";

有了这个权限,PGAudit将记录所有引用random_table的选择语句,无论谁或什么实际启动了事件。所有可分配的权限可以在Postgres文档中查看。

如果您不再希望使用对象日志记录,您将需要取消分配pgaudit.role变量:

-- 更改pgaudit.role,不再引用some_audit_role
ALTER ROLE "postgres" SET pgaudit.role to '';
-- 查看pgaudit.role是否已更改的以下命令:
SELECTrolname,rolconfig
FROM pg_roles
WHERE rolname = 'postgres';
-- 应该返回一个包含"pgaudit.role="的rolconfig路径

解析审计日志

PGAudit旨在将日志存储为CSV文件,具有以下标题:

标题描述
AUDIT_TYPE会话或对象
STATEMENT_ID此会话的唯一语句ID。即使某些语句未记录,也是连续的。
SUBSTATEMENT_ID主语句中每个子语句的顺序ID。即使有些未记录,也是连续的。
CLASS..., 读取,角色(见pgaudit.log)。
COMMAND..., 改变表,选择。
OBJECT_TYPE表,索引,视图等。适用于SELECT,DML和大多数DDL语句。
OBJECT_NAME完全限定的对象名称(例如,public.account)。适用于SELECT,DML和大多数DDL。
STATEMENT在后端执行的语句。
PARAMETER如果设置了pgaudit.log_parameter,则此字段包含语句参数作为引用的CSV,或<none>。否则,它是<not logged>。

由以下创建语句生成的日志:

CREATE TABLE account (id int primary key,name text,description text
);

生成以下日志:

AUDIT: SESSION,1,1,DDL,CREATE TABLE,TABLE,public.account,create table account(id int,name text,description text
); <not logged>

查找和过滤审计日志

由PGAudit生成的日志可以在Postgres日志中找到。要查找特定日志,您可以使用日志浏览器。以下是一个基本示例,用于提取引用CREATE TABLE事件的日志:

SELECTcast(t.timestamp as datetime) as timestamp,event_message
FROMpostgres_logs as tcross join unnest(metadata) as mcross join unnest(m.parsed) as p
WHERE event_message like 'AUDIT%CREATE TABLE%'
ORDER BY timestamp desc
LIMIT 100;

实践示例

监控API事件

要监控Postgrest API角色发起的所有写入:

ALTER ROLE "authenticator" SET pgaudit.log to 'write';
-- 上述等同于:
-- ALTER ROLE "anon" SET pgaudit.log TO 'write';
-- ALTER ROLE "authenticated" SET pgaudit.log TO 'write';
-- ALTER ROLE "service_role" SET pgaudit.log TO 'write';

监控auth.users

在最坏的情况下,如果特权角色的密码被泄露,您可以使用PGAudit来监控是否针对了auth.users表。应该指出,API请求已经在API边缘网络中被监控,这更多的是关于提供对数据库层面正在发生的事情的更大清晰度。

以对象模式记录auth.user需要一个自定义角色:

-- 创建日志记录角色
CREATE ROLE "auth_auditor" NOINHERIT;
-- 给角色权限以观察相关表事件
GRANT SELECT ON auth.users TO "auth_auditor";
GRANT DELETE ON auth.users TO "auth_auditor";
-- 将auth_auditor分配给pgaudit.role
ALTER ROLE "postgres" SET pgaudit.role to 'auth_auditor';

有了上述代码,任何涉及从auth.users表读取或删除的查询都将被记录。

注意事项

  • 在配置pgAudit时,应注意避免生成过多的日志,因为这可能会对数据库性能产生负面影响。

  • 应根据实际需求和安全策略来配置会话日志记录参数,以确保只记录必要的日志信息。

  • 在使用pgAudit时,应定期检查和分析日志,以便及时发现和处理潜在的安全问题或异常行为。


http://www.ppmy.cn/server/111938.html

相关文章

mongodb在Java中条件分组聚合查询并且分页(时间戳,按日期分组,年月日...)

废话不多说&#xff0c;先看效果图&#xff1a; SQL查询结果示例&#xff1a; 多种查询结果示例&#xff1a; 原SQL&#xff1a; db.getCollection("hbdd_order").aggregate([{// 把时间戳格式化$addFields: {orderDate: {"$dateToString": {"for…

TS中type和interface在类型声明时的区别

在TS中interface 和 type都可以用来自定义数据类型&#xff0c;两者有许多相同之处&#xff0c;但是也有差别。我们一般选择 type 来定义基本类型别名、联合类型、元组等类型&#xff0c;而选择 interface 来定义复杂的对象、类、以及进行接口的继承。 1. 声明常见类型 和 方法…

惠中科技RDS自清洁膜层:光伏领域的绿色革命

惠中科技RDS自清洁膜层&#xff1a;光伏领域的绿色革命 在全球能源转型和光伏产业蓬勃发展的背景下&#xff0c;光伏电站的运营维护面临着诸多挑战&#xff0c;其中灰尘污染问题尤为突出。灰尘的堆积不仅降低了光伏板的透光率&#xff0c;还直接影响了电站的发电效率和经济效益…

Java重修笔记 第四十六天 Map 接口、HashMap 类

Map 接口 1. 用于保存具有映射关系的数据&#xff1a;Key-Value&#xff08;双列元素&#xff09; 2. Map 中的 key 和 value 可以是任何引用类型的数据&#xff0c;会封装到 HashMap$Node 对象中 3. Map 中的 key 不允许重复&#xff0c;原因和 HashSet 一样&#xff0c;v…

发布npm包到GitLab教程

之前在研究如何搭建UI组件库&#xff08;内部使用&#xff09;&#xff0c;其中重要的一步就是发布npm包到GitLab。中间踩了很多坑&#xff0c;在这里记录一下整个流程方便大家快速上手。不足之处欢迎指出&#x1f64f; 1. 获取Token 在gitlab中打开access tokens申请页面&am…

09.定时器02

#include "reg52.h"sbit led P3^6;void delay10ms() { //1. 配置定时器0工作模式位16位计时TMOD 0x01;//2. 给初值&#xff0c;定一个10ms出来TL00x00;TH00xDC;//3. 开始计时TR0 1;TF0 0; } void main() {int cnt 0;led 1;while(1){if(TF0 1)//当爆表的时候&a…

【高等代数笔记】(18)N阶行列式

2. N阶行列式 2.12 行列式按k行&#xff08;列&#xff09;展开 【拉普拉斯定理】 n n n阶矩阵 A ( a i j ) \boldsymbol{A}(a_{ij}) A(aij​)&#xff0c;取定第 i 1 , i 2 , . . . , i k i_{1},i_{2},...,i_{k} i1​,i2​,...,ik​行&#xff08;其中 i 1 < i 2 < .…

Redis数据结构与连接

1 基本的数据结构 1.1 string string的实现有多种 int&#xff1a;字符串长度小于等于20且能转成整数raw&#xff1a;字符串长度大于44embstr&#xff1a;字符串长度小于等于44 字符串长度小于1M 时&#xff0c;加倍扩容&#xff1b;超过 1M 每次只多扩1M&#xff1b;字符串…