PostgreSQLには、データベースが出力したログをファイルに記録する機能が標準で実装されています。デフォルトではログファイルはデータベース領域のpg_logディレクトリに保存されています。
PowerGres + securityでは、このログをデータベースに保管するように設定します。作業としてログを格納するためのスキーマとオブジェクトを以下のように作成します。
図2:スキーマとオブジェクトの作成 (画像をクリックすると別ウィンドウに拡大図を表示します)
- connectionsテーブル
- connections_last_dayビュー
- messagesテーブル
- processed_filesテーブル
- process_all_logs関数
- process_log関数
表4:auditスキーマ内に作成されるオブジェクト
ログファイルに記録されたメッセージをテーブルに登録するには、process_all_logs関数を実行します。この関数はC言語で作成されており、pg_logディレクトリ内のログファイルを読み込み、その内容をconnectionsテーブルとmessagesテーブルに登録します。
connectionsテーブルには接続のログが登録されています。「誰がどのデータベースに接続した」という情報はもちろん、接続から切断までの時間やセッションIDを閲覧することができます。24時間以内の接続に限って閲覧する場合は、connections_last_dayビューを使います(図3)。
図3:connectionsテーブルを検索した結果の一例 (画像をクリックすると別ウィンドウに拡大図を表示します)
まだ切断されていない接続(接続時間を格納するdurationなど)に関しては空欄となります。
messagesテーブルには、ログファイル内に記録される通常のメッセージが登録されます。ログファイルから時刻・ユーザ名などが抽出され、それぞれ対応するカラムに格納されるので、SQL文を使った条件検索などが容易に実行できるようになっています。
図4:messagesテーブルを検索した結果の一例(注2) (画像をクリックすると別ウィンドウに拡大図を表示します)
※注2:
1行に収めるために、ログレベルなど途中のカラムを省略しています。
この機能を使うと「特定のユーザだけのログを取得したい」や「4日前の14:00から14:15までのログを取得したい」といった情報の取得も簡単にできます。この機能によってログの解析が容易になり、ログの監査に役立つでしょう。
|