解決策
RDS for PostgreSQL DB インスタンスのアクティビティをログに記録するために設定できる複数のパラメータがあります。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)
2 つの別々のロールについて、次の例のようなログが出力されます。
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 の出力例では、test2 の pgaudit.log パラメータが DDL のみに設定されているため、SELECT クエリに対する監査エントリはありません。このテストにより、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 拡張を使用して列を監査する
たとえば、機密データが 1 つの列のみに含まれている場合には、特定のテーブルの列を監査します。次のコマンド例では、監査が必要であり、給与データを含む機密列があるペイロールテーブルを作成します。
create table payroll(
name text,
salary text
);
給与 (salary) 列を監査するには、最初に次のコマンドを実行して rds_pgaudit ロールに salary 列に SELECT を実行するためのアクセス許可を付与します。
grant select (salary) on payroll to rds_pgaudit;
次に、次のコマンドを実行して、salary 列を含む、テーブル内のすべての列に SELECT を実行します。
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 の一般的な DBA タスク
pgAudit を使用してデータベースのアクティビティを記録する