pgAudit を使用してデータベースのアクティビティを記録する - Amazon Aurora

pgAudit を使用してデータベースのアクティビティを記録する

金融機関、政府機関、および多くの業界では、規制要件を満たすために監査ログを保存する必要があります。Aurora PostgreSQL DB クラスター で PostgreSQL 監査拡張機能 (pgAudit) を使用することで、監査人が通常必要とする詳細なレコードや規制要件を満たすための詳細なレコードをキャプチャできます。例えば、pgAudit 拡張機能を設定して、特定のデータベースやテーブルに加えられた変更を追跡したり、変更を加えたユーザーやその他の多くの詳細を記録したりできます。

pgAudit 拡張機能は、ログメッセージをより詳細に拡張することにより、ネイティブの PostgreSQL ログ記録インフラストラクチャの機能に基づいて構築されています。つまり、監査ログは、他のログメッセージを表示するのと同じ方法を使用します。PostgreSQL ログ記録の詳細については、「Aurora PostgreSQL データベースログファイル」を参照してください。

pgAudit 拡張機能は、クリアテキストパスワードなどの機密データをログから編集します。Aurora PostgreSQL DB クラスター が、Aurora PostgreSQL DB クラスターのクエリログ記録をオンにする で説明されているようにデータ操作言語 (DML) ステートメントをログに記録するように設定されている場合は、PostgreSQL Audit 拡張機能を使用することでクリアテキストパスワードの問題を回避できます。

データベースインスタンスの監査は、きわめて詳細に構成できます。すべてのデータベースとすべてのユーザーを監査できます。また、特定のデータベース、ユーザー、その他のオブジェクトのみを監査することもできます。特定のユーザーやデータベースを監査対象から明示的に除外することもできます。詳細については、「監査ログからのユーザーまたはデータベースの除外」を参照してください。

キャプチャできる詳細の量を考慮すると、pgAudit を使用する場合はストレージ消費量を監視することをお勧めします。

pgAudit 拡張モジュールは、使用可能なすべての Aurora PostgreSQL バージョンでサポートされています。Aurora PostgreSQL のバージョンでサポートされている pgAudit のリストについては、Aurora PostgreSQL のリリースノートの「Amazon Aurora PostgreSQL の拡張機能バージョン」を参照してください。

pgAudit 拡張機能のセットアップ

Aurora PostgreSQL DB クラスターに pgAudit 拡張機能を設定するには、まず RDS for PostgreSQL DB インスタンスのの共有ライブラリに pgAudit を追加します。Aurora PostgreSQL DB クラスター用のカスタム DB クラスターでパラメータグループ。カスタム DB クラスターパラメータグループの詳細については、「「パラメータグループを使用する」 」を参照してください。次に、pgAudit 拡張機能をインストールします。最後に、監査するデータベースとオブジェクトを指定します。このセクションの手順で、方法を示します。AWS Management Console または AWS CLI を使用できます。

これらすべてのタスクを実行するには、rds_superuser ロールとして権限が必要です。

以下の手順では、Aurora PostgreSQL DB クラスター がカスタム DB クラスター パラメータグループに関連付けられていることを前提としています。

pgAudit 拡張機能をセットアップするには
  1. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、Aurora PostgreSQL DB クラスターのライターインスタンス を選択します。

  3. Aurora PostgreSQL DB クラスターライターインスタンス[Configuration] (設定) タブを開きます。インスタンスの詳細の中から、パラメータグループのリンクを見つけてください。

  4. リンクを選択して、Aurora PostgreSQL DB クラスターに関連するカスタムパラメータを開きます。

  5. パラメータ検索フィールドに、shared_pre を入力して shared_preload_libraries パラメータを検索します。

  6. プロパティ値にアクセスするには、[Edit parameters] (パラメータの編集) を選択します。

  7. [Values] (値) フィールドのリストに pgaudit を追加します。値のリスト内の項目を区切るにはカンマを使用します。

    pgAudit が追加された shared_preload_libaries パラメータの画像。
  8. Aurora PostgreSQL DB クラスターのライターインスタンス を再起動して、shared_preload_libraries パラメータの変更を有効にします。

  9. インスタンスが使用可能になったら、pgAudit が初期化されていることを確認します。psql を使用して Aurora PostgreSQL DB クラスターのライターインスタンス、次のコマンドを実行します。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
  10. pgAudit を初期化すると、拡張機能を作成できるようになりました。pgaudit 拡張機能はデータ定義言語 (DDL) ステートメントを監査するためのイベントトリガーをインストールするため、ライブラリを初期化した後に拡張機能を作成する必要があります。

    CREATE EXTENSION pgaudit;
  11. psql セッションを終了します。

    labdb=> \q
  12. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  13. リストで pgaudit.log パラメータを検索し、ユースケースに応じた値に設定します。例えば、次の画像に示すように pgaudit.log パラメータを write に設定すると、ログへの挿入、更新、削除、およびその他のタイプの変更がキャプチャされます。

    設定を含む pgaudit.log パラメータの画像。

    pgaudit.log パラメータには、次のいずれかの値を選択することもできます。

    • none – これはデフォルトです。データベースの変更は記録されません。

    • すべて — すべてをログに記録します (読み取り、書き込み、関数、ロール、DDL、その他)。

    • ddl – ROLE クラスに含まれていない、すべてのデータ定義言語 (DDL) ステートメントのログ記録。

    • function – 関数呼び出し、および DO ブロックのログ記録。

    • misc – DISCARDFETCHCHECKPOINTVACUUMSET など、さまざまなコマンドのログ記録。

    • read – SELECT および COPY のログ記録 (ソースがリレーション (テーブルなどの) またはクエリの場合)。

    • role – GRANTREVOKECREATE ROLEALTER ROLEDROP ROLE など、ロールと権限に関連するステートメントのログ記録。

    • write – INSERTUPDATEDELETETRUNCATE、および COPY のログ記録 (送信先がリレーション (テーブル) の場合)。

  14. [Save changes] (変更の保存) をクリックします。

  15. Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  16. データベースリストから Aurora PostgreSQL DB クラスターのライターインスタンス を選択して選択し、アクションメニューから [Reboot] (再起動) を選択します。

pgAudit をセットアップするには

AWS CLI を使用して pgAudit を設定するには、次の手順に示すように、modify-db-parameter-group オペレーションを呼び出してカスタムパラメータグループの監査ログパラメータを変更します。

  1. 次の AWS CLI コマンドを使用してshared_preload_librariesパラメータに pgaudit を追加します。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  2. 次の AWS CLI コマンドを使用して Aurora PostgreSQL DB クラスターのライターインスタンス を再起動し、pgaudit ライブラリを初期化します。

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  3. インスタンスが使用可能になると、pgaudit が初期化されていることを確認できます。psql を使用して Aurora PostgreSQL DB クラスターのライターインスタンス、次のコマンドを実行します。

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

    pgAudit を初期化すると、拡張機能を作成できるようになりました。

    CREATE EXTENSION pgaudit;
  4. AWS CLI を使用できるように psql セッションを終了します。

    labdb=> \q
  5. 次の AWS CLI コマンドを使用して、セッション監査ログによって記録するステートメントのクラスを指定します。この例では、pgaudit.log パラメータを write に設定し、ログへの挿入、更新、削除をキャプチャします。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.log,ParameterValue=write,ApplyMethod=pending-reboot" \ --region aws-region

    pgaudit.log パラメータには、次のいずれかの値を選択することもできます。

    • none – これはデフォルトです。データベースの変更は記録されません。

    • すべて — すべてをログに記録します (読み取り、書き込み、関数、ロール、DDL、その他)。

    • ddl – ROLE クラスに含まれていない、すべてのデータ定義言語 (DDL) ステートメントのログ記録。

    • function – 関数呼び出し、および DO ブロックのログ記録。

    • misc – DISCARDFETCHCHECKPOINTVACUUMSET など、さまざまなコマンドのログ記録。

    • read – SELECT および COPY のログ記録 (ソースがリレーション (テーブルなどの) またはクエリの場合)。

    • role – GRANTREVOKECREATE ROLEALTER ROLEDROP ROLE など、ロールと権限に関連するステートメントのログ記録。

    • write – INSERTUPDATEDELETETRUNCATE、および COPY のログ記録 (送信先がリレーション (テーブル) の場合)。

    次の AWS CLI コマンドを使用して、Aurora PostgreSQL DB クラスターのライターインスタンス を再起動します。

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region

データベースオブジェクトの監査

Aurora PostgreSQL DB クラスター に pgAudit をセットアップし、要件に合わせて設定すると、より詳細な情報が PostgreSQL ログに取得されます。例えば、デフォルトの PostgreSQL ログ設定はデータベーステーブルに変更が加えられた日付と時刻を識別しますが、pgAudit 拡張機能では、拡張機能のパラメータの設定方法に応じて、スキーマ、変更を行ったユーザー、その他の詳細をログエントリに含めることができます。監査を設定して、次の方法で変更を追跡できます。

  • セッションごとに、ユーザー別。セッションレベルでは、完全修飾コマンドテキストをキャプチャできます。

  • オブジェクトごとに、ユーザー別、データベース別。

オブジェクト監査機能は、システムで rds_pgaudit ロールを作成し、そのロールをカスタムパラメータグループの pgaudit.role パラメータに追加したときに有効になります。デフォルトでは、pgaudit.role パラメータは設定されておらず、許容される値は rds_pgaudit だけです。以下の手順は、pgaudit が初期化され、pgAudit 拡張機能のセットアップ の手順に従って pgaudit 拡張機能を作成したことを前提としています。

pgAudit をセットアップした後の PostgreSQL ログファイルの画像。

この例に示すように、「LOG: AUDIT: SESSION」行には、テーブルとそのスキーマなどの詳細情報が表示されます。

オブジェクト監査をセットアップするには
  1. psql を使用して Aurora PostgreSQL DB クラスターのライターインスタンス、

    psql --host=your-instance-name.aws-region.rds.amazonaws.com --port=5432 --username=postgrespostgres --password --dbname=labdb
  2. 次のコマンドを使用して、rds_pgaudit というデータベースロールを作成します。

    labdb=> CREATE ROLE rds_pgaudit; CREATE ROLE labdb=>
  3. psql セッションを終了します。

    labdb=> \q

    次のステップでは、AWS CLI を使用してカスタムパラメータグループの監査ログパラメータを変更します。

  4. 次の AWS CLI コマンドを使用して、pgaudit.role パラメータを rds_pgaudit に設定します。デフォルトでは、このパラメータは空で、rds_pgaudit は、唯一の許容値です。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=pgaudit.role,ParameterValue=rds_pgaudit,ApplyMethod=pending-reboot" \ --region aws-region
  5. 次の AWS CLI コマンドを使用して Aurora PostgreSQL DB クラスターのライターインスタンス を再起動し、パラメータの変更を有効にします。

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  6. 次のコマンドを実行して、pgaudit.rolerds_pgaudit に設定されたことを確認します。

    SHOW pgaudit.role; pgaudit.role ------------------ rds_pgaudit

pgAudit ログ記録をテストするには、監査するサンプルコマンドをいくつか実行します。例えば、次のコマンドを実行します。

CREATE TABLE t1 (id int); GRANT SELECT ON t1 TO rds_pgaudit; SELECT * FROM t1; id ---- (0 rows)

データベースログには、次のようなエントリが含まれます。

... 2017-06-12 19:09:49 UTC:...:rds_test@postgres:[11701]:LOG: AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1; ...

ログの表示方法については、「Amazon Aurora ログファイルのモニタリング」を参照してください。

pgAudit 拡張機能の詳細については、GitHub で「pgAudit」を参照してください。

監査ログからのユーザーまたはデータベースの除外

Aurora PostgreSQL データベースログファイル で説明したように、PostgreSQL ログはストレージ容量を使用します。pgAudit 拡張機能を使用すると、追跡する変更に応じて、ログに収集されるデータの量が、程度の差はありますが、増加します。Aurora PostgreSQL DB クラスター内のすべてのユーザーまたはデータベースを監査する必要はないかもしれません。

ストレージへの影響を最小限に抑え、監査記録を不必要にキャプチャしないようにするには、ユーザーとデータベースを監査対象から除外できます。特定のセッション内のロギングを変更することもできます。次の例は、その方法を示しています。

注記

セッションレベルのパラメータ設定は、Aurora PostgreSQL DB クラスターのライターインスタンスのカスタム DB クラスターパラメータグループ の設定よりも優先されます。データベースユーザーに監査ログ設定の設定をバイパスさせたくない場合は、必ず権限を変更してください。

Aurora PostgreSQL DB クラスター が、すべてのユーザーとデータベースについて同じレベルのアクティビティを監査するように設定されているとします。次に、myuser ユーザーを監査しないことにします。次の SQL コマンドを使用して、myuser の監査機能を無効にできます。

ALTER USER myuser SET pgaudit.log TO 'NONE';

次に、次のクエリを使用して pgaudit.loguser_specific_settings 列をチェックし、パラメータが NONE に設定されていることを確認できます。

SELECT usename AS user_name, useconfig AS user_specific_settings FROM pg_user WHERE usename = 'myuser';

次のような出力が表示されます。

user_name | user_specific_settings -----------+------------------------ myuser | {pgaudit.log=NONE} (1 row)

次のコマンドを使用すると、データベースとのセッションの最中に、指定したユーザーのログをオフにできます。

ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'none';

次のクエリを使用して、特定のユーザーとデータベースの組み合わせの pgaudit.log の設定列を確認します。

SELECT usename AS "user_name", datname AS "database_name", pg_catalog.array_to_string(setconfig, E'\n') AS "settings" FROM pg_catalog.pg_db_role_setting s LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase LEFT JOIN pg_catalog.pg_user r ON r.usesysid = setrole WHERE usename = 'myuser' AND datname = 'mydatabase' ORDER BY 1, 2;

以下のような出力が表示されます。

user_name | database_name | settings -----------+---------------+------------------ myuser | mydatabase | pgaudit.log=none (1 row)

myuser の監査を無効化した後に、mydatabase の変更を追跡しないことにしました。次のコマンドを使用して、その特定のデータベースの監査を無効化します。

ALTER DATABASE mydatabase SET pgaudit.log to 'NONE';

次に、以下のクエリで database_specific_settings 列を確認し、pgaudit.log が NONE に設定されていることを確認します。

SELECT a.datname AS database_name, b.setconfig AS database_specific_settings FROM pg_database a FULL JOIN pg_db_role_setting b ON a.oid = b.setdatabase WHERE a.datname = 'mydatabase';

次のような出力が表示されます。

database_name | database_specific_settings ---------------+---------------------------- mydatabase | {pgaudit.log=NONE} (1 row)

myuser の設定をデフォルト設定に戻すには、次のコマンドを使用します。

ALTER USER myuser RESET pgaudit.log;

設定をデータベースのデフォルト設定に戻すには、次のコマンドを使用します。

ALTER DATABASE mydatabase RESET pgaudit.log;

ユーザーとデータベースをデフォルト設定にリセットするには、次のコマンドを使用します。

ALTER USER myuser IN DATABASE mydatabase RESET pgaudit.log;

また、pgaudit.log パラメータに pgaudit.log を他の許容値のいずれかに設定することで、特定のイベントをログに記録することもできます (詳しくは、「pgaudit.log パラメータの許容設定のリスト」を参照してください)。

ALTER USER myuser SET pgaudit.log TO 'read'; ALTER DATABASE mydatabase SET pgaudit.log TO 'function'; ALTER USER myuser IN DATABASE mydatabase SET pgaudit.log TO 'read,function'

pgAudit 拡張機能のリファレンス

このセクションにリストされている 1 つまたは複数のパラメータを変更することで、監査ログに必要な詳細レベルを指定できます。

pgAudit 動作の制御

監査ログは、次のテーブルに示す 1 つ以上のパラメータを変更することで制御できます。

パラメータ 説明

pgaudit.log

セッション監査ログ記録によってログに記録されるステートメントのクラスを指定します。許容値には、ddl、関数、その他、読み取り、ロール、書き込み、なし、すべてが含まれます。(詳しくは、「pgaudit.log パラメータの許容設定のリスト」を参照してください)。

pgaudit.log_catalog

オンにすると (1 に設定)、ステートメント内のすべてのリレーションが pg_catalog 内にある場合に、ステートメントを監査証跡に追加します。

pgaudit.log_level

ログエントリに使用されるログレベルを指定します。指定できる値は debug5、debug4、debug3、debug2、debug1、info、notice、warning、log です。

pgaudit.log_parameter

オン (1 に設定) すると、ステートメントとともに渡されたパラメータが監査ログに記録されます。

pgaudit.log_relation

オンにすると (1 に設定)、セッションの監査ログで、SELECT ステートメントまたは DML ステートメントで参照されるリレーション (TABLE、VIEW など) ごとに個別のログエントリが作成されます。

pgaudit.log_statement_once

ログ記録に、ステートメントテキストとパラメータを、ステートメントとサブステートメントの組み合わせの最初のログエントリとともに含めるか、すべてのエントリとともに含めるかを指定します。

pgaudit.role

オブジェクト監査ログ記録に使用するマスターロールを指定します。唯一許容されるエントリは rds_pgaudit です。

pgaudit.log パラメータの許容設定のリスト

Value 説明

なし

これがデフォルトです。データベースの変更は記録されません。

すべて

すべてをログに記録します (読み取り、書き込み、関数、ロール、DDL、その他)。

ddl

ROLE クラスに含まれていない、すべてのデータ定義言語 (DDL) ステートメントのログ記録。

関数

関数呼び出し、および DO ブロックのログ記録。

misc

DISCARDFETCHCHECKPOINTVACUUMSET など、さまざまなコマンドのログ記録。

read

SELECT および COPY のログ記録 (ソースがリレーション (テーブルなどの) またはクエリの場合)。

ロール

GRANTREVOKECREATE ROLEALTER ROLEDROP ROLE など、ロールと権限に関連するステートメントのログ記録。

書き込み

INSERTUPDATEDELETETRUNCATE、および COPY のログ記録 (送信先がリレーションの場合)。

セッション監査で複数のイベントタイプをログ記録するには、カンマ区切りリストを使用します。すべてのイベントタイプをログ記録するには、pgaudit.logALL に設定します。DB インスタンスを再起動して、変更を適用します。

オブジェクト監査では、監査のログ記録を絞り込み、特定のリレーションを操作できます。例えば、1 つまたは複数のテーブルで、READ オペレーションのログ記録を監査するよう指定できます。