如何使用 pgAudit 扩展审计我的 Amazon RDS for PostgreSQL 数据库实例?

2 分钟阅读
0

我想审计 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 数据库实例中的所有数据库、角色、关系和列。另外,我想配置 pgAudit 扩展,为不同的角色提供不同级别的审计。

解决方法

您可以设置不同的参数来记录 RDS for PostgreSQL 数据库实例上的活动。激活 pgAudit 扩展后,您可以配置 pgaudit.log 参数来审计特定的数据库、角色、表和列。首先,在数据库、角色或表的参数组中将 pgaudit.log 参数值设置为 none

> show pgaudit.log;+---------------+
| pgaudit.log   |
|---------------|
| none          |
+---------------+
SHOW

使用 pgAudit 扩展来审计数据库

完成以下步骤:

  1. 运行以下命令,仅在数据库中覆盖 pgaudit.log 参数的系统配置:
    ALTER DATABASE test_database set pgaudit.log='All';
    **注意:**将 test_database 替换为您的数据库名称。前面的命令将 pgaudit.log 参数的值更改为 All,以便 pgAudit 仅审计 test_database
  2. 连接到您的数据库,然后运行以下查询来审计数据库:
    select * from aud_table;
    **注意:**将 aud_table 替换为要审计的表。
    错误日志的输出类似于以下内容:
    2019-06-25 19:21:35 UTC:192.0.2.7(39330):testpar@test_database:[21638]:LOG: AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not logged>

使用 pgAudit 扩展审计角色

您也可以修改 pgaudit.log 参数中的角色以使其具有不同的值。要为角色的 pgaudit.log 参数设置不同的值,请运行以下命令:

ALTER ROLE test1 set pgaudit.log='All';
ALTER ROLE test2 set pgaudit.log='DDL';

**注意:**将 test1test2 替换为您的角色名称。

要检查修改是否在角色级别进行,请运行以下查询:

> select rolname,rolconfig from pg_roles where rolname in ('test1','                  test2');
+-----------+----------------------+
| rolname   | rolconfig            |
|-----------+----------------------|
| test1     | [u'pgaudit.log=All'] |
| test2     | [u'pgaudit.log=DDL'] |
+-----------+----------------------+
SELECT 2
Time: 0.010s

**注意:**将 test1test2 替换为您的角色名称。

要测试角色的 pgAudit 日志记录行为,请为每个角色运行以下查询:

CREATE TABLE test_table (id int);CREATE TABLE
select * from test_table;id
----
(0 rows)

两个不同角色的日志输出类似于以下示例。

test1

...2019-06-26 14:51:12 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG:  
AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id
int);,<not logged>

2019-06-26 14:51:18 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG:  
AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not
logged>
...

test2

...2019-06-26 14:53:54 UTC:192.0.2.7(44772):test2@postgres:[5517]:LOG:  
AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id
int);,<not logged>
...

test2 示例输出中,SELECT 查询没有审计条目,因为 test2pgaudit.log 参数仅设置为 DDL。此测试验证 test2 角色仅记录 DDL 操作。

使用 pgAudit 扩展审计表

**注意:**pgAudit 扩展只能记录 SELECTINSERTUPDATEDELETE 命令。此扩展无法审计 TRUNCATE

要审计您的表,请运行以下命令以授予 rds_pgaudit 角色对这些命令的访问权限:

grant select, delete on test_table to rds_pgaudit;

**注意:**前面的命令允许 rds_pgaudit 角色访问 SELECTDELETE。将 selectdelete 替换为要审计的命令。

要验证审计日志记录的配置是否正确,请在表上运行语句。以下示例命令在 test_table 上运行 DELETE 语句:

Time: 0.008s DELETE 1
>delete from test_table where pid=5050;

DELETE 语句的输出类似于以下内容:

2019-06-25 17:13:02UTC:192.0.2.7(41810):postgresql104saz@postgresql104saz:[24976]:LOG:
AUDIT: OBJECT,3,1,WRITE,DELETE,TABLE,public.t1,delete from test_table where
pid=5050,<not logged>

使用 pgAudit 扩展审计列

您可以审计特定表的列,例如当敏感数据仅存在于一列中时。以下示例命令创建了一个工资表,该表有一个必须审计的包含工资数据的敏感列:

create table payroll(    
    name text,
    salary text
);

要审计工资列,首先运行以下命令,以授予 rds_pgaudit 角色对 salary 列上 SELECT 的访问权限:

grant select (salary)  on payroll to rds_pgaudit;

然后,运行以下命令对表中的所有列执行 SELECT,包括 salary 列:

select * from payroll;

如果 SELECT 查询不包含 salary 列,则 pgAudit 不会对该列进行审计。

在以下示例输出中,pgAudit 审计任何包含 salary 列的 SELECT

2019-06-25 18:25:02
UTC:192.0.2.7(42056):postgresql104saz@postgresql104saz:[4118]:LOG:
AUDIT: OBJECT,2,1,READ,SELECT,TABLE,public.payroll,select * from
payroll,<not logged>

相关信息

Amazon RDS for PostgreSQL 的数据库管理员常见任务

使用 pgAudit 记录数据库活动