使用pgaudit进行PostgreSQL的审计!试试DB用户级的会话审计!
首先
这篇文章是”NTTテクノクロス Advent Calendar 2023″的第十天的文章。
你好!我是NTT技术创新的中村。
本文是回应对于使用pgaudit在PostgreSQL数据库进行审计而感到困惑的需求,提供具体的使用指南。同时也会涉及使用pgaudit时需要注意的要点。
数据库审计是什么?
数据库审计是指对数据库进行操作来检查是否存在非法访问。
具体来说,它是为了检测数据库是否存在非法访问而进行的操作。
-
- ①定期的に不正なアクセスが発生していないか、その予兆がないかをチェックし、
- ②問題の検出および対策、もしくは予防措置を行います。
进行审核时,检查本身可以通过自动化或人工完成。然而,为了进行审计,需要收集和存储“哪个数据库用户”、“何时”、“针对什么”、“执行了什么操作”的信息。
pgaudit是一个支持收集和存储信息的扩展功能。不仅可以在本地环境中使用,还可以在云端环境,例如Amazon Aurora PostgreSQL、Amazon RDS for PostgreSQL和Azure Database for PostgreSQL中使用。
使用pgaudit进行会话审计的总结
那么首先,我们来总结一下pgaudit的会话审计。
会话审计是指记录连接到数据库后进行的“操作内容”。操作内容主要是指SQL语句,但也可以包括SET子句和PostgreSQL的命令集。
セッション監査はDBユーザ単位に設定できる
pgauditのインストール直後はデフォルトで監査はoff(postgresql.conf のパラメータ pgaudit.log = none)になっていますので、ALTER ROLE文を使ってDBユーザ単位に監査の設定を行います。
セッション監査では監査対象のコマンドを設定できる
以下「監査対象のコマンド」に記載の通り、SELECTやDDLなど、監査の対象としたいコマンドを指定できます。ただし、コマンドごとではなく、いくつかのまとまりの単位で指定する必要があります。
セッション監査の結果はPostgreSQLのサーバログに出力される
セッション監査のログはPostgreSQLのサーバログに他のログと一緒に出力されます。ログには「AUDIT」という文字列が含まれていますので、ユーザがログを分類することは比較的容易です。
审核对象的命令
您可以使用以下格式指定要审核的命令。
pgaudit 的官方文档如下所示。
pgaudit的会话审计配置策略
从这里开始正式进行,由于会话审核可以按照数据库用户进行设置,所以应根据用户的用途来选择不同的审核类型。
要注意的是“明确要监察的命令”,只针对所需的记录类型。即使是应用程序用户,也可能经常执行DDL命令,因此需要相应地进行调整。
指定的监察类型“大致”比较宽泛,因此往往会产生比想象中更多的日志。
比如,对于只能进行参考的用户,可以通过设置对象权限,使得DML和DDL的执行会导致错误,从而可以省略DML和DDL的审计工作。(如果数据中包含个人信息,还可能需要禁止对应信息的查阅权限,或将SELECT也纳入审计范围,这样的情况也可能存在)
因此,审计设置与用户设计密切相关。
以下是一个具体的设置示例。
让我们来看一些具体的设置示例。
在安装RPM之后,需要重新启动PostgreSQL,并将shared_preload_libraries=’pgaudit’添加到postgresql.conf中,然后在要使用的数据库上执行CREATE EXTENSION pgaudit;即可开始使用pgaudit。
postgresql.conf 中的 pgaudit 参数全部默认值!
我会先列出所有的设置参数及其默认值。
我们可以先使用默认设置,然后查看输出日志,再进行调整。
另外,pgaudit的参数在安装后不会自动添加到postgresql.conf文件中。为了使其更易于理解,建议在postgresql.conf文件中以带有注释的形式添加默认值的补充。
修改数据库角色以进行每个DB用户的审计设置。
下面是为每个不同的DB用户设置审计配置的例子。
所有操作都是使用postgres用户执行的。
※验证操作在以下的本地环境中进行。
- スーパーユーザ「postgres」の場合
postgres=# ALTER ROLE postgres SET pgaudit.log='ALL';
ALTER ROLE
- 管理者ユーザ「adminuser」の場合
postgres=# ALTER ROLE adminuser SET pgaudit.log='DDL,ROLE,MISC';
ALTER ROLE
- アプリケーションユーザ「appuser」の場合
postgres=# ALTER ROLE appuser SET pgaudit.log='DDL,ROLE';
ALTER ROLE
- 読み取り専用ユーザ「readuser」の場合
postgres=# ALTER ROLE readuser SET pgaudit.log='NONE';
ALTER ROLE
您可以按照以下方式进行设置确认。
postgres=# SELECT rolname,rolconfig FROM pg_roles;
rolname | rolconfig
----------+-------------------------------
postgres | {pgaudit.log=ALL}
adminser | {"pgaudit.log=DDL,ROLE,MISC"}
appuser | {"pgaudit.log=DDL,ROLE"}
readuser | {pgaudit.log=NONE}
(4 rows)
日志输出示例
-
- DBユーザ「postgres」でSELECTコマンドを実行
- 「READ」の監査対象としてAUDITログが出力されます。
postgres=# select * from pg_class limit 1;
AUDIT: SESSION,2,1,READ,SELECT,,,select * from pg_class limit 1;,<not logged>
-
- DBユーザ「adminuser」でVACUUMコマンドを実行
- 「MISC」の監査対象としてAUDITログが出力されます。
postgres=> vacuum t_test;
AUDIT: SESSION,3,1,MISC,VACUUM,,,vacuum t_test;,<not logged>
-
- DBユーザ「appuser」でCREATEコマンドを実行
- 「DDL」の監査対象としてAUDITログが出力されます。
postgres=> create table t_test2 (col1 int);
AUDIT: SESSION,1,1,DDL,CREATE TABLE,TABLE,public.t_test2,create table t_test2 (col1 int);,<not logged>
总结
我解释了如何按DB用户对pgaudit会话进行审计。由于审计设置与DB用户设计密切相关,所以要注意是否进行审计,如果要进行审计,则需要整理DB用户的使用情况。
这篇文章告一段落。
请务必登录NTT Techno Cross的网站,我们也有关于PostgreSQL技术的文章,请务必阅读。
请继续享受NTT技术交叉的Advent Calendar 2023活动。