はじめに

Verticaで監査を行う場合、下記2通りの方法があります。
– vertica.log に出力されている情報を参照する
– システムテーブルに格納されている情報を参照する

vertica.logには実行された全てのクエリやVertica内部ジョブの実行履歴も出力されるため、定常的なモニタリングには適していないと考えられます。
本記事では、定常的なモニタリングを行うことを想定し、システムテーブルの内容を参照するために必要な内容を記載しています。

システムテーブルで取得可能な監査ログ内容


以下の表は、システムテーブルを参照することで監査可能な代表的な操作および項目を示しています。

取得対象操作

操作内容取得可否スキーマ.テーブル名列名備考
ログインv_monitor.user_sessionssession_start_timestamp
ログオフv_monitor.user_sessionssession_end_timestamp
失敗ログオン×vertica.log には記録される
成功DMLv_monitor.query_requestsrequest
失敗DML×vertica.log には記録される
成功DDLv_monitor.query_requestsrequest
失敗DDL×v_monitor.query_requestsrequest構文エラーは記録されないが、テーブル無しエラー等は記録される。vertica.log には記録される
成功SELECTv_monitor.query_requestsrequest
失敗SELECT×vertica.log には記録される


取得対象項目

取得項目取得可否スキーマ.テーブル名列名備考
ログイン日時v_monitor.user_sessionssession_start_timestamp
ログオフ日時v_monitor.user_sessionssession_end_timestamp
SQL実行日時v_monitor.query_requestssession_start_timestamp
OSユーザ×v_monitor.user_sessionsclient_os_user_name
DBユーザv_monitor.user_sessionsuser_name
マシンv_monitor.user_sessionsnode_name
端末v_monitor.user_sessionsclient_hostname
プログラム×v_monitor.user_sessionsclient_type"ADO.NET"、"vsql"、
"JDBC"、"ODBC"の
タイプのみ取得可能
オブジェクト×SQL文からオブジェクトを
読み取ることで代替
SQL文v_monitor.query_requestsrequest最大64,000バイト
処理件数v_monitor.query_profilesprocessed_row_count



Vertica監査に有用なシステムテーブル

以下の表は、監査に有用なシステムテーブルと項目を示しています。
「有用度」列は、各項目の監査に対する有用度を示しています。「○」は有用、「△」は補足情報として有用であることを示しています。
以下のシステムーブルについては、基本的にスーパーユーザー以外(dbadmin以外)は、自ユーザーの監査情報しか参照できません。
自ユーザー以外の監査情報も参照したい場合は、pseudosuperuserロールの割当てが必要です。

v_monitor.user_sessionsシステムテーブル(ユーザーセッション履歴)

カラム名データ型有用度説明
authentication_methodvarchar(128)
client_hostnamevarchar(128)クライアントホスト名
client_labelvarchar(64000)クライアントラベル。ODBC、JDBCのプロパティで任意文字列を埋め込める
アプリ名称等を埋め込むことでアプリ処理 or その他処理の見分けが可能
client_osvarchar(128)
client_os_user_namevarchar(128)クライアントのOSユーザ名
client_pidintクライアントのプロセスID。Vertica以外の監査ログと突き合わせできる可能性がある
client_typevarchar(128)クライアントタイプ
client_versionvarchar(128)
is_activeboolean
node_namevarchar(128)SQL実行サーバー名
runtime_priorityvarchar(128)
session_end_timestamptimestamptzセッション終了時刻。NULLの場合はセッション継続中であることを示す
session_idvarchar(128)他システムテーブルとの結合キーに使用
session_start_timestamptimestamptzセッション開始時刻
ssl_statevarchar(128)
statement_idint
transaction_idint
user_namevarchar(128)DBユーザー名


v_monitor.query_requestsシステムテーブル(ユーザーが発行したクエリ・リクエスト)

カラム名データ型有用度説明
end_timestamptimestamptzSQL実行終了時刻。NULLの場合はSQL実行中であることを示す
error_countint
is_executingboolean
memory_acquired_mbfloat
node_namevarchar(128)
requestvarchar(64000)SQL文
request_duration_msintSQL実行経過時間(ミリ秒)。実行中の場合は現在までの経過時間を示す
request_idint
request_labelvarchar(128)
request_typevarchar(128)
search_pathvarchar(64000)
session_idvarchar(128)他システムテーブルとの結合キーに使用
start_timestamptimestamptzSQL実行開始時刻
statement_idint他システムテーブルとの結合キーに使用
successboolean実行されたSQLの成否。実行中断したSQLは失敗で記録。構文エラーは記録されない
transaction_idint他システムテーブルとの結合キーに使用
user_namevarchar(128)


query_profilesシステムテーブル(クエリ・プロファイル)

カラム名データ型有用度説明
error_codeint
identifiervarchar(128)
is_executingboolean
node_namevarchar(128)
processed_row_countintSQL処理件数。実行中断したSQLは0件で記録される
queryvarchar(64000)
query_duration_usnumeric(36,6)
query_search_pathvarchar(64000)
query_startvarchar(63)
query_start_epochint
query_typevarchar(128)SQLのタイプ(DDL,LOAD,QUERY,SET,TRANSACTION,UTILITYの6種類の存在を確認)
reserved_extra_memoryint
schema_namevarchar(128)
session_idvarchar(128)他システムテーブルとの結合キーに使用
statement_idint他システムテーブルとの結合キーに使用
table_namevarchar(128)
transaction_idint他システムテーブルとの結合キーに使用
user_namevarchar(128)


Vertica監査用SQL(サンプル)

上記のテーブルを利用した監査用のSQLのサンプルが以下記事に記載しております。

実行されたSQLをシステムテーブルで確認する方法
http://vertica-tech.ashisuto.co.jp/executed-query/


監査ログ取得の留意事項

システムテーブルを参照して監査を行う場合、下記2点に留意する必要があります。
1. システムテーブル参照に伴うオーバーヘッド
2. システムテーブル・データの保存サイズや保存期間

システムテーブル参照に伴うオーバーヘッドについて

システムテーブル参照のオーバーヘッドは、サーバースペックやデータ参照量に依存します。
システムへの影響を考慮する場合は、事前にテストすることを推奨します。

システムテーブル・データの保存サイズや保存期間

システムテーブルの情報は、データコレクター機能によって収集・管理されます。
データコレクター機能については以下の記事をご参照ください。

システムテーブルの保存条件について
http://vertica-tech.ashisuto.co.jp/datacollector


検証バージョン

この記事の内容はVertica 9.2で確認しています。

更新履歴

2019/07/18 本記事を公開