PostgreSQL を実行している Amazon RDS DB インスタンスを pgaudit 拡張機能を使用して監査するにはどうすればよいですか?

最終更新日: 2022 年 5 月 26 日

データベース、ロール、関係、または列をすべて監査し、ロールごとに異なるレベルの監査を実行したいと考えています。Amazon RDS for PostgreSQL を実行している Amazon Relational Database Service (Amazon RDS) DB インスタンスで、多種類のロールレベルに対して pgaudit 拡張機能を設定する方法を教えてください。

解決方法

PostgreSQL DB インスタンスでのアクティビティをログ記録するために設定できるさまざまなパラメータが用意されています。多様なデータベース、ロール、テーブル、または列の監査には、 pgaudit 拡張機能が使用できます。pgaudit 拡張機能を有効にすると、特定のデータベース、ロール、テーブル、および列を監査するために、pgaudit.log パラメータを設定できます。

PostgreSQL を実行している Amazon RDS インスタンスで pgaudit 拡張機能を有効にする

1.    次のコマンドを実行して、rds_pgaudit という専用のデータベースロールを作成します。

CREATE ROLE rds_pgaudit;
CREATE ROLE

2.    DB インスタンスに関連付けられているカスタム DB パラメータグループで、以下のパラメータを変更します
pgauditshared_preload_libraries に追加またはアペンドする
pgaudit.role をステップ 1 で作成したロールである rds_pgaudit に設定する

3.    パラメータグループへの変更がインスタンスに反映されるように、インスタンスの再起動を行います。

4.    次のコマンドを実行して、pgaudit が初期化されていることを確認します。

show shared_preload_libraries;
shared_preload_libraries 
--------------------------
rdsutils,pgaudit
(1 row)

5.    次のコマンドを実行して pgaudit 拡張機能を作成します。

CREATE EXTENSION pgaudit;
CREATE EXTENSION

6.    次のコマンドを実行して、pgaudit.rolerds_pgaudit に設定されていることを確認します。

show pgaudit.role;
pgaudit.role
------------------
rds_pgaudit

7.    次のいずれかを監査するために、pgaudit.log パラメータを設定します。

  • ALL は、以下のコマンドを監査します。
  • MISC は、DISCARD、FETCH、CHECKPOINT、VACUUM、SET などのさまざまなコマンドを監査します。
  • DDL は、ROLE クラスに含まれていないすべてのデータ記述言語 (DDL) を監査します。
  • ROLE は、GRANT、REVOKE、CREATE/ALTER/DROP ROLE など、ロールおよび権限に関連するステートメントを監査します。
  • FUNCTION は、関数呼び出しと DO ブロックを監査します。
  • WRITE は、送信先がリレーションである場合に、INSERT、UPDATE、DELETE、TRUNCATE、および COPY を監査します。
  • READ は、ソースがリレーションまたはクエリである場合に、SELECT および COPY を監査します。

監査対象に応じて、データベース、ロール、またはテーブルの pgaudit.log パラメータの値を設定します。

pgaudit 拡張機能を使用したデータベースの監査

1.    データベース、ロール、またはテーブルについて pgaudit.log パラメータの値を設定するには、パラメータグループレベルでパラメータ pgaudit.log を [none] (なし) に設定します。

> show pgaudit.log;
+---------------+
| pgaudit.log   |
|---------------|
| none          |
+---------------+
SHOW
2.次のコマンドを実行して、このデータベースでのみ、このパラメータのシステム構成を上書きします。
ALTER DATABASE test_database set pgaudit.log='All';
これにより、パラメータ pgaudit.log の値が [ All] (すべて) に変更され、 test_database が RDS DB インスタンス内で監査される唯一のデータベースとなります。

3.    test_database に接続し、次のクエリを実行します。

select * from test_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 パラメータで異なる値を持つように変更されます。以下のコマンド例では、ロール test1test2 が異なる pgaudit.log 設定を持つように変更されています。

1.    次のコマンドを実行して、test1test2 について、pgaudit.log パラメータでそれぞれ異なる値を設定します。

ALTER ROLE test1 set pgaudit.log='All';
ALTER ROLE test2 set pgaudit.log='DDL';
2.    次のクエリを実行して、ロールレベルで変更が行われたことを確認します。
> 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

3.    test1test2 の両方について次のクエリを実行します。

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>
...

注: test2pgaudit.log パラメータは DDL のみに設定されているため、SELECT クエリに関する監査エントリはありません。

pgaudit 拡張機能を使用してテーブルを監査する

pgaudit.log パラメータを設定することで、特定のリレーションに影響するステートメントを監査およびログ記録できます。pgaudit 拡張機能では、SELECTINSERTUPDATEおよび DELETE コマンドのみをログ記録できます。TRUNCATE はオブジェクト監査ログ記録に含まれません。監査対象とするテーブルに対するオペレーション (SELECTDELETEINSERTUPDATE など) へのアクセス権を rds_pgaudit ロールに付与する場合、付与監査は、対応するステートメントをログ記録します。次の例では、SELECT および DELETE へのアクセス権を rds_pgaudit ロールに付与しているので、test_table ですべての SELECT および DELETE ステートメントが監査されます。

1.    次のコマンドを実行して、SELECT および DELETE へのアクセス権を rds_pgaudit ロールに付与します。

grant select, delete on test_table to rds_pgaudit;

2.    test_tableDELETE ステートメントを実行し、監査ログ記録が正しく設定されているかどうかをテストします。

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

DELETE ステートメントの出力は次のようになります。

2019-06-25 17:13:02
UTC: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
);

1.    salary 列の SELECT ステートメントへのアクセス権を rds_pgaudit ロールに付与し、この列の SELECT が監査されるようにします。

grant select (salary)  on payroll to rds_pgaudit;

2.    salary 列を含む、テーブル内のすべての列について SELECT を実行します。

select * from payroll;

次の出力例では、salary 列を含む SELECT が監査されます。ただし、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>

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?