pgAudit を使用して PostgreSQL の監査を行う

このページでは、pgAudit 拡張機能を使用したデータベースの監査について説明します。この監査は、政府や行政機関、金融、ISO の証明書を遵守するために必要とされる多くのログの構成に役立ちます。

Cloud SQL での PostgreSQL 拡張機能の概要については、PostgreSQL の拡張機能をご覧ください。

概要

Cloud SQL for PostgreSQL のデータベース監査は、オープンソースの pgAudit 拡張機能で利用できます。

この拡張機能を使用すると、特定のデータベース インスタンスに対して実行された SQL オペレーションを選択して記録、追跡できます。この拡張機能では、選択したオペレーションのサブセットをモニタリングして記録するための監査機能を利用できます。

pgAudit 拡張機能は、実行された SQL コマンドとクエリに適用されます。これに対して、Cloud Audit Logs は Cloud SQL インスタンスで行われる管理オペレーションとメンテナンス オペレーションの監査に使用する必要があります。

Cloud SQL の監査ロギングの詳細については、監査ログのページをご覧ください。

Cloud SQL でのデータベース監査を設定する

pgAudit 拡張機能を使用した監査ログの手順は次のとおりです。

  1. Cloud SQL で cloudsql.enable_pgaudit フラグを有効にする。
  2. pgAudit 拡張機能を作成するコマンドを実行する
  3. pgaudit.log フラグの値を設定する。

データベースの監査を設定したら、ログを表示できます。また、必要に応じてロギングを無効にします。

監査を設定する

このセクションでは、データベース監査オペレーションの設定の基本について説明します。

監査を有効にする最初のフラグ

Cloud SQL では、PostgreSQL パラメータの調整やインスタンスの構成など、多くのオペレーションでデータベース フラグを使用します。cloudsql.enable_pgaudit フラグを指定すると、特定のデータベース インスタンスの監査が可能になります。cloudsql.enable_pgaudit フラグの値を変更するには、Google Cloud Console または gcloud コマンドを使用します。

フラグの標準手順を使用して、値を on に設定し、cloudsql.enable_pgaudit フラグを有効にします。たとえば、gcloud コマンドを使用するには、[INSTANCE_NAME] をインスタンス名に置き換え次のように指定します。

gcloud sql instances patch [INSTANCE_NAME] --database-flags cloudsql.enable_pgaudit=on

cloudsql.enable_pgaudit フラグは、他のサポートされているフラグとともに表示されます。これは Cloud SQL に固有のものです。

pgAudit 拡張機能を作成するコマンドを実行する

データベース フラグを有効にした後、互換性のある psql クライアントを使用して CREATE EXTENSION コマンドを実行します。次のコマンドは、Cloud SQL インスタンス内のすべてのデータベースに対して pgAudit 拡張機能を作成します。

CREATE EXTENSION pgaudit;

pgaudit.log フラグの値を設定する

フラグの標準的な手順を使用して、pgaudit.log フラグの値を設定します。

たとえば、インスタンスに対するすべてのデータベース オペレーションの監査を有効にするには、次の gcloud コマンドを使用します。

$ gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

データベースのその他の設定を構成する

データベースの監査設定を構成するには、データベース監査ロギングのカスタマイズの手順を行います。

データベースの監査ログを表示する

監査ログを表示するには、プロジェクトのデータアクセス監査ログを有効にします。特定のインスタンスに対して生成された pgAudit ログは、データアクセス監査ログとして Cloud Logging に送信されます。ユーザーは、ログ エクスプローラ アプリケーションで、生成された pgAudit ログを表示できます。

pgAudit ログを表示するには、ログ エクスプローラ アプリケーションで cloudaudit.googleapis.com/data_access ログフィルタを選択します。

また、次のクエリを使用すると、特定の Cloud SQL プロジェクトのすべての pgAudit ログを表示できます。

resource.type="cloudsql_database"
logName="projects/<your-project-name>/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"

pgAudit のログ形式

データアクセス監査ログの各 pgAudit ログエントリには、クエリで収集された情報を表すフィールドがあります。

以下に例を示します。

{
  protoPayload: {
    @type: "type.googleapis.com/google.cloud.audit.AuditLog"
    methodName: "cloudsql.instances.query"
    request: {
      @type: "type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
      auditClass: "READ"
      auditType: "SESSION"
      chunkCount: "1"
      chunkIndex: "1"
      command: "SELECT"
      database: "finance"
      databaseSessionId: 2209692
      parameter: "[not logged]"
      statement: "SELECT * FROM revenue"
      statementId: 2
      substatementId: 1
      user: "alice"
    }
  }
}

データアクセス監査ログに含まれるフィールドの説明は次のとおりです。

  • auditClass。ログに記録されるステートメントの種類です。有効な値は READWRITEFUNCTIONROLEDDLMISCMISC_SET です。
  • auditTypeSESSION または OBJECT
  • chunkCount。チャンクは、parameter フィールドと statement フィールドで提供されるデータに対して発生する可能性があります。chunkCount フィールドは、チャンクの合計数を示します。chunkIndex フィールドの説明もご覧ください。
  • chunkIndexparameter フィールドと statement フィールド(現在の request コンテナ内)にあるデータチャンクのインデックス番号を指定します。初期の番号は 1 です。chunkCount フィールドの説明もご覧ください。
  • command。たとえば、ALTER TABLESELECT です。
  • parameterchunkIndex フィールドは、このフィールドの内容を決定できます。chunkIndex フィールドの説明をご覧ください。pgaudit.log_parameter の値が設定されている場合、parameter フィールドには引用符付きの CSV データとしてステートメント パラメータを含めることができます。パラメータがない場合、このフィールドには [none] が含まれます。それ以外の場合、このフィールドには [not logged] が含まれます。
  • statement。バックエンドで実行されたステートメント。chunkIndex フィールドは、statement フィールドの内容を決定できます。chunkIndex フィールドの説明をご覧ください。
  • statementId。このセッションの一意のステートメント ID。各ステートメント ID はバックエンド呼び出しを表します。一部のステートメントがログに記録されていない場合でも、ステートメント ID は順次となります。
  • substatementId。メイン ステートメント内の各サブステートメントの順次 ID。

これらのフィールドの一部は pgAudit のドキュメントで説明されています。

監査を無効にする

データベースの監査を無効にするには、cloudsql.enable_pgaudit フラグの値を off に設定します。この値は、Google Cloud Console または gcloud コマンドを使用して変更できます。フラグの標準手順に沿って cloudsql.enable_pgaudit フラグを無効にします。

また、互換性のある psql クライアントを使用して DROP EXTENSION コマンドを実行し、拡張機能の状態を削除します。

DROP EXTENSION pgaudit;

Cloud SQL でデータベース監査ロギングをカスタマイズする

このセクションでは、データベース インスタンスの監査動作をカスタマイズする方法について説明します。

拡張機能の追加機能については、pgAudit のドキュメントをご覧ください。

スーパーユーザー権限の要件

Cloud SQL では、拡張機能は cloudsqlsuperuser ロールの一部であるユーザーのみが作成できます。新しい PostgreSQL インスタンスを作成すると、デフォルトの PostgreSQL ユーザーが作成されます(ただし、ユーザーのパスワードを設定する必要があります)。デフォルトの PostgreSQL ユーザーは cloudsqlsuperuser ロールの一部です。詳細については、PostgreSQL ユーザーをご覧ください。

インスタンスのすべてのデータベース オペレーションに対する監査を構成する

インスタンス内のすべてのデータベースに監査を構成するには、pgAudit 設定をシステムレベルで適用する必要があります。システムレベルの監査パラメータは、Google Cloud Console または gcloud コマンドを使用したデータベース フラグとしてのみ設定できます。たとえば、インスタンスに対するすべてのデータベース オペレーションの監査を有効にするには、次の gcloud コマンドを使用します。

$ gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

すべてのインスタンス データベースに特定のオペレーションを構成する

すべてのインスタンス データベースを監査するには、Google Cloud Console または gcloud コマンドを使用します。たとえば、インスタンスで読み取り / 書き込みオペレーションのみの監査を有効にするには、次の gcloud コマンドを使用できます。この例では、リストベースの構文を使用して複数の値を指定しています。

$ gcloud sql instances patch [INSTANCE_NAME] \
  --database-flags ^:^cloudsql.enable_pgaudit=on:pgaudit.log=read,write

このコマンドは、既存のデータベース フラグを上書きします。

特定のデータベースの監査を構成する

特定のデータベースの監査を構成するには、pgAudit パラメータをデータベース レベルで設定します。たとえば、次の SQL コマンドを使用して、finance という名前のデータベースに対する読み取り / 書き込み監査を有効にできます。

finance=> ALTER DATABASE finance SET pgaudit.log = 'read,write';

リレーションの監査を構成する

リレーションの監査は、特定のデータベースの監査よりも範囲が狭くなります。

リレーションの監査では、一意の監査ロールが pgaudit.role パラメータに割り当てられます。このロールに付与されたオブジェクトやリレーションはログに記録されます。

たとえば、employee データベース内の salary リレーションのすべての SELECT クエリの監査を構成するには、次のコマンドを使用します。

employee=> CREATE ROLE auditor WITH NOLOGIN;
employee=> ALTER DATABASE employee SET pgaudit.role = 'auditor';
employee=> GRANT SELECT ON salary TO auditor;

特定のリレーションで列のサブセットを監査することもできます。

たとえば、次のコマンドは、income 列と tax_status 列が salary リレーションからアクセスした場合にのみ監査ロギングを実行するように構成します。

employee=> GRANT SELECT(income, tax_status) ON salary TO auditor;

データベース ユーザーの監査を構成する

特定のユーザーの監査を有効にするには、ROLE ごとに pgaudit.log パラメータを設定します。

たとえば、次の SQL コマンドは、ユーザー Alice によって実行されるすべてのデータベース オペレーションの監査を設定します。

finance=> ALTER ROLE alice SET pgaudit.log = 'all';

Cloud SQL の監査管理に関するヒント

監査動作をカスタマイズするときは、次の点に注意してください。

  • データベース フラグ cloudsql.enable_pgaudit をオフにすると、監査ロギングは直ちに停止します。ただし、適用される pgAudit 設定(たとえば、pgaudit.log パラメータの設定)は、明示的に削除しない限り保持されます。
  • cloudsql.enable_pgaudit のデータベース フラグ値を変更すると、データベース インスタンスが再起動します。
  • 明示的な CREATE ROLE コマンドを使用して作成されたデータベース ユーザーには、監査設定の変更権限がありません。監査設定を変更できるのは、Google Cloud コンソールと gcloud コマンドで作成されたデータベース ユーザーのみです。
  • セッション監査ロギングとオブジェクト監査ロギングの両方を有効にすると、両方に関連するステートメントがログに追加されます。セッション ロギングとオブジェクト ロギングが相互にキャンセルや変更を行うことはありません。

Cloud SQL for PostgreSQL の pgAudit 拡張機能の制限事項

監査ログはインスタンスのディスクに一時的に書き込まれ、ログが Cloud Logging に送信される前にディスク領域を占有します。そのため、この機能を有効にする前に、以下の情報をすべて確認してください。

  • ログ取り込み率は 4 MB/秒です。ログの生成による負荷が取り込み率を超えると、以下のようになる可能性があります。
    • ディスク使用量が不必要に増加することがあります。
    • ディスク容量が不足する可能性があります。
  • この機能を有効にして監査条件を満たすクエリを多数実行すると、ディスク使用量が急激に増加する可能性があります。
  • この機能を使用する前に、以下を行ってください。
    • ストレージの自動増量を有効にする
    • 全体的なディスク使用量をモニタリングします。ログの生成による負荷を別々にモニタリングすることはできません。Metrics Explorercloudsql.googleapis.com/database/disk/utilization 指標を使用します。
    • 必要に応じて、実行するクエリの数を減らすか、監査を減らすことでディスク使用量を減らします。
  • 使用可能なディスク容量が不足すると、一部のクエリの監査ログが失われる可能性があります。