解决方法
您可以设置不同的参数来记录 RDS for PostgreSQL 数据库实例上的活动。激活 pgAudit 扩展后,您可以配置 pgaudit.log 参数来审计特定的数据库、角色、表和列。首先,在数据库、角色或表的参数组中将 pgaudit.log 参数值设置为 none:
> show pgaudit.log;+---------------+
| pgaudit.log |
|---------------|
| none |
+---------------+
SHOW
使用 pgAudit 扩展来审计数据库
完成以下步骤:
- 运行以下命令,仅在数据库中覆盖 pgaudit.log 参数的系统配置:
ALTER DATABASE test_database set pgaudit.log='All';
**注意:**将 test_database 替换为您的数据库名称。前面的命令将 pgaudit.log 参数的值更改为 All,以便 pgAudit 仅审计 test_database。
- 连接到您的数据库,然后运行以下查询来审计数据库:
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';
**注意:**将 test1 和 test2 替换为您的角色名称。
要检查修改是否在角色级别进行,请运行以下查询:
> 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
**注意:**将 test1 和 test2 替换为您的角色名称。
要测试角色的 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 查询没有审计条目,因为 test2 的 pgaudit.log 参数仅设置为 DDL。此测试验证 test2 角色仅记录 DDL 操作。
使用 pgAudit 扩展审计表
**注意:**pgAudit 扩展只能记录 SELECT、INSERT、UPDATE 和 DELETE 命令。此扩展无法审计 TRUNCATE。
要审计您的表,请运行以下命令以授予 rds_pgaudit 角色对这些命令的访问权限:
grant select, delete on test_table to rds_pgaudit;
**注意:**前面的命令允许 rds_pgaudit 角色访问 SELECT 和 DELETE。将 select 和 delete 替换为要审计的命令。
要验证审计日志记录的配置是否正确,请在表上运行语句。以下示例命令在 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 记录数据库活动