RDSの監査ログ出力について

2023.12.25
RDSの監査ログ出力について
この記事をシェアする

はじめに

こんにちは、スカイアーチHRソリューションズのharaです。

Amazon RDS (Oracle、PostgreSQL、MySQL) では、監査ログ取得設定は既定で有効化されません。

今回は、それぞれのRDS (シングル構成) での最低限の監査ログを取得する手順および方法について記載します。

なお、本記事では監査ログの中でも接続/切断ログに着目して設定していきます。

RDS for Oracle

RDS の設定

RDSを作成する際、または作成後に [ 変更 ] から、ログのエクスポートの設定を行います。

対象ログ (今回は監査ログ) のチェックボックスをオンにすることで、CloudWatchLogsへログを発行できます。

  • アラートログ:エラーやインスタンスの停止起動等の管理操作が出力
  • 監査ログ:DBに対する操作に関するログが出力
  • リスナーログ:インスタンスへの接続要求が出力
  • トレースログ:診断データが出力
  • Oracle Management Agent ログ:OEM_AGENTの操作に関するログが出力

 ※Oracle Management Agentログについてはオプショングループやポート開放等、別途要件があります。
  本記事では割愛いたしますので、詳細は以下の記事をご参照ください。

また、Oracleのログ (エラー・トレース) 詳細については以下のリファレンスをご参照ください。

パラメータグループの設定

RDSで「ログのエクスポート」を実施するのみではログは取得できません。

RDSに紐づくパラメータグループにて、[ audit_trail ] を有効化する必要があります。

audit_trailへ設定できる値は以下のとおりです。

  • none:監査機能を使用しない (既定値)
  • os:すべての監査レコードをオペレーティングシステムファイルに書き込む
  • db:オペレーティングシステムに書き込まれるレコードを除く、
      すべての監査レコードをデータベース監査証跡に記録
  • xml:xml形式でos同様の記録を行う
  • extended:SQL文等の情報を記録

各パラメータの詳細についてはOracleのリファレンスをご参照ください。

なお、本パラメータを「DB」とした場合監査ログはRDSインスタンス内に保管され、CloudWatchLogsへ出力されませんので注意してください。本環境では「OS」と設定しました。

本項目は静的パラメータ (Static) のため、RDSインスタンスへ適用する際は再起動します。

DBの設定

続いてOracle内で audit session を有効化します。

Oracleに接続し、以下のコマンドを実行してログイン・ログオフの監査記録を有効化します。

SQL> audit session;

Audit succeeded.

以下のコマンドで設定が反映されていることを確認します。

SQL> select * from dba_stmt_audit_opts;

USER_NAME
--------------------------------------------------------------------------------
PROXY_NAME
--------------------------------------------------------------------------------
AUDIT_OPTION                             SUCCESS    FAILURE
---------------------------------------- ---------- ----------


CREATE SESSION                           BY ACCESS  BY ACCESS

CloudWatchLogsで確認

実際にCloudWatchLogsで、Oracleへ接続/切断等の操作をしてログが出力されていることを確認します。

RDSでログ取得を有効化すると、ロググループが作成されます。/aws/rds/instance/rds-test-oracle/audit が作成されていますので、こちらを選択します。

ログストリームが複数あるので、 [ ロググループの検索 ] から該当のログを確認していきます。

■接続

■切断

これでOracleでの設定は完了です。

RDS for PostgreSQL

RDSの設定

PostgreSQLもOracle同様にRDSを作成する際、または作成後に [ 変更 ] から、
対象ログ (今回はPostgreSQL ログ) のチェックボックスをオンにし、エクスポートの設定を行います。

それぞれのログを有効化することで、以下のログをCloudWatchLogsへ発行できます。

今回は以下のうち、PostgreSQL ログが対象です。

  • PostgreSQLログ:SQLクエリ等のエンジンログが出力
  • アップグレードログ:PostgreSQLアップグレード時のログが出力

pgAudit 拡張機能の有効化

こちらも同様、RDSのログエクスポート設定のみでは監査ログは出力されません。

ログ出力にあたり、PostgreSQL 監査拡張機能である pgAudit 拡張機能をセットアップしていきます。

詳細は下記の手順をご参照ください。

まず、パラメータグループの項目 [ shared_preload_libraries ] へ [ pgaudit ] を追加します。

shared_preload_libraries を設定することで、起動時に事前に読み込む共有ライブラリを指定できます。

こちらも静的パラメータのため、以下のように「再起動を保留中」のステータスとなります。

適用の際はRDSインスタンスを再起動します。

再起動後、上記のパラメータが適用されたことを確認します。

postgres=> SHOW shared_preload_libraries;
      shared_preload_libraries
-------------------------------------
 rdsutils,pgaudit,pg_stat_statements
(1 row)

適用を確認後、DB内に拡張機能を追加します。「CREATE EXTENSION」と出力されればOKです。

postgres=> CREATE EXTENSION pgaudit;
CREATE EXTENSION

続いてパラメータグループの項目 [ pgaudit.log ] へ値を追加します。今回はすべてのログを取得可能な [ all ] を設定しました。

pgaudit.logで指定できるパラメータは以下のとおりです。

  • none:データベースの変更を記録しない (既定値)
  • all:すべてのログ記録
  • ddl:ROLEクラスに含まれないすべてのデータ定義言語のステートメントを記録
  • function:関数呼び出しとDOブロックの記録
  • misc:コマンドの記録
  • read:SELECT/COPYのログ記録
  • role:ロールや権限に関するログ記録
  • write:INSERTやUPDATE等のログ記録

こちらは動的パラメータのため、RDSインスタンスの再起動は不要となります。

パラメータグループの設定

PostgreSQL用のパラメータグループでは複数の項目を編集する必要があります。

クエリの記録は以下を有効化することで取得できます。

  • log_connections:ログイン履歴を取得
  • log_disconnections:ログアウト履歴を取得
  • log_lock_waits:長期間のロック待機を出力 等

各パラメータの詳細は下記をご参照ください。

なお、log_statementでもログを取得することが可能ですが、パスワード情報等が平文でログに出力されてしまうため設定する場合は注意が必要です。

本環境では接続の履歴を残すため、[ log_connections ] と [ log_disconnections ] を有効化します。

こちらも動的パラメータのため、RDSインスタンスを再起動する必要はありません。

CloudWatchLogsで確認

Oracle同様、PostgreSQLへ接続/切断等の操作をしてログが出力されていることを確認します。

/aws/rds/instance/rds-harapsql/postgresql が作成されていますので、こちらを選択します。

ログストリームから、以下のようなログを確認できました。

■接続

■切断

これでPostgreSQLでの設定は完了です。

RDS for MySQL

RDSの設定

こちらも他RDS同様にRDSを作成する際、または作成後に [ 変更 ] から、
対象ログ (今回は監査ログ) のチェックボックスをオンにし、エクスポートの設定を行います。

それぞれのログを有効化することで、以下のログをCloudWatchLogsへ発行できます。

今回は以下のうち、監査ログが対象です。

  • 監査ログ:ユーザログオンやDBに対して実行されたクエリを出力
  • エラーログ:クエリの進行状況やエラー内容を出力
  • 全般ログ:一般的なSQLステートメントを出力
  • スロークエリログ:実行に時間がかかっている最適化可能なクエリを出力

それぞれのログ詳細については、下記をご参照ください。

オプショングループの設定

オプショングループを作成し、 [ MARIADB_AUDIT_PLUGIN ] を有効化します。

オプション設定の [ SERVER_AUDIT_EVENTS ] にて、ログに記録するアクティビティタイプを設定できます。

既定ではCONNECT (接続の成功と失敗および切断) 、QUERY (DBに対して実行されたすべてのクエリ) が有効となっています。今回は既定値で設定します。

本オプションの詳細は下記をご参照ください。

CloudWatchLogsで確認

他RDS同様、ログが出力されていることを確認します。

/aws/rds/instance/rds-haramysql/audit が作成されていますので、こちらを選択します。

ログストリームから、以下のようなログを確認できました。

■接続

■切断

これでMySQLでの設定は完了です。

おわりに

今回はそれぞれ接続/切断時の出力を確認しましたが、他にも一般的な監査ログの内容も取得可能です。

本記事が実際に監査ログを設定いただく際に参考となれば幸いです。

この記事をシェアする
著者:hara
AWS2年目のエンジニア。前職ではAzure、M365サポート等をやっていました。