監査ログファイルの内容は暗号化されません。セクション6.3.12.2「監査ログプラグインのセキュリティーに関する考慮事項」を参照してください。
監査ログファイルは、UTF-8 (1 文字当たり最大 4
バイト) を使用した XML
として記述されています。ルート要素は、<AUDIT>
です。監査プラグインログの終了時に、ルート要素の終了タグ
</AUDIT>
が書き込まれます。そのため、このタグは、プラグインがアクティブになっている間はファイル内に存在しません。
ルート要素には、<AUDIT_RECORD>
要素が含まれています。この要素のそれぞれは、監査対象のイベントに関する情報を提供します。
MySQL 5.6.14 では、Oracle Audit Vault
との互換性を高くするために、新しい監査ログファイルの形式が導入されました。audit_log_format
システム変数を使用すれば、古い形式または新しい形式を選択できます。この変数では、OLD
および NEW
(デフォルトは
OLD
) の値が許可されています。
audit_log_format
の値を変更する場合は、次の手順を使用して、ある形式のログエントリが別の形式のエントリを含む既存のログファイルに書き込まれることを回避します。
サーバーを停止します。
現在の監査ログファイルの名前を手動で変更します。
新しい
audit_log_format
の値でサーバーを再起動します。監査ログプラグインによって、選択した形式のログエントリを含む新しいログファイルが作成されます。
次に、デフォルトの (古い) 形式のサンプルログファイルを示します。ただし、読みやすくするために形式が若干変更されています。
<?xml version="1.0" encoding="UTF-8"?>
<AUDIT>
<AUDIT_RECORD
TIMESTAMP="2012-08-02T14:52:12"
NAME="Audit"
SERVER_ID="1"
VERSION="1"
STARTUP_OPTIONS="--port=3306"
OS_VERSION="i686-Linux"
MYSQL_VERSION="5.6.10-log"/>
<AUDIT_RECORD
TIMESTAMP="2012-08-02T14:52:41"
NAME="Connect"
CONNECTION_ID="1"
STATUS="0"
USER="root"
PRIV_USER="root"
OS_LOGIN=""
PROXY_USER=""
HOST="localhost"
IP="127.0.0.1"
DB=""/>
<AUDIT_RECORD
TIMESTAMP="2012-08-02T14:53:45"
NAME="Query"
CONNECTION_ID="1"
STATUS="0"
SQLTEXT="INSERT INTO t1 () VALUES()"/>
<AUDIT_RECORD
TIMESTAMP="2012-08-02T14:53:51"
NAME="Quit"
CONNECTION_ID="1"
STATUS="0"/>
<AUDIT_RECORD
TIMESTAMP="2012-08-06T14:21:03"
NAME="NoAudit"
SERVER_ID="1"/>
</AUDIT>
次に、新しい形式のサンプルログファイルを示します。ただし、読みやすくするために形式が若干変更されています。
<?xml version="1.0" encoding="UTF-8"?>
<AUDIT>
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:24 UTC</TIMESTAMP>
<RECORD_ID>1_2013-09-17T15:03:24</RECORD_ID>
<NAME>Audit</NAME>
<SERVER_ID>1</SERVER_ID>
<VERSION>1</VERSION>
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
--socket=/usr/local/mysql/mysql.sock
--port=3306</STARTUP_OPTIONS>
<OS_VERSION>x86_64-osx10.6</OS_VERSION>
<MYSQL_VERSION>5.7.2-m12-log</MYSQL_VERSION>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:40 UTC</TIMESTAMP>
<RECORD_ID>2_2013-09-17T15:03:24</RECORD_ID>
<NAME>Connect</NAME>
<CONNECTION_ID>2</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root</USER>
<OS_LOGIN></OS_LOGIN>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>connect</COMMAND_CLASS>
<PRIV_USER>root</PRIV_USER>
<PROXY_USER></PROXY_USER>
<DB>test</DB>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:41 UTC</TIMESTAMP>
<RECORD_ID>4_2013-09-17T15:03:24</RECORD_ID>
<NAME>Query</NAME>
<CONNECTION_ID>2</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root[root] @ localhost [127.0.0.1]</USER>
<OS_LOGIN></OS_LOGIN>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>drop_table</COMMAND_CLASS>
<SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:41 UTC</TIMESTAMP>
<RECORD_ID>5_2013-09-17T15:03:24</RECORD_ID>
<NAME>Query</NAME>
<CONNECTION_ID>2</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root[root] @ localhost [127.0.0.1]</USER>
<OS_LOGIN></OS_LOGIN>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>create_table</COMMAND_CLASS>
<SQLTEXT>CREATE TABLE t (i INT)</SQLTEXT>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:41 UTC</TIMESTAMP>
<RECORD_ID>7_2013-09-17T15:03:24</RECORD_ID>
<NAME>Quit</NAME>
<CONNECTION_ID>2</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER></USER>
<OS_LOGIN></OS_LOGIN>
<HOST></HOST>
<IP></IP>
<COMMAND_CLASS>connect</COMMAND_CLASS>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:47 UTC</TIMESTAMP>
<RECORD_ID>9_2013-09-17T15:03:24</RECORD_ID>
<NAME>Shutdown</NAME>
<CONNECTION_ID>3</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root[root] @ localhost [127.0.0.1]</USER>
<OS_LOGIN></OS_LOGIN>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS></COMMAND_CLASS>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:47 UTC</TIMESTAMP>
<RECORD_ID>10_2013-09-17T15:03:24</RECORD_ID>
<NAME>Quit</NAME>
<CONNECTION_ID>3</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER></USER>
<OS_LOGIN></OS_LOGIN>
<HOST></HOST>
<IP></IP>
<COMMAND_CLASS>connect</COMMAND_CLASS>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2013-09-17T15:03:49 UTC</TIMESTAMP>
<RECORD_ID>11_2013-09-17T15:03:24</RECORD_ID>
<NAME>NoAudit</NAME>
<SERVER_ID>1</SERVER_ID>
</AUDIT_RECORD>
</AUDIT>
<AUDIT_RECORD>
要素の属性には、次のような特性があります。
一部の属性はすべての要素に表示されますが、大部分はオプションであり、必ずしもすべての要素に表示されるとはかぎりません。
要素内の属性の順序は保証されません。
属性値は固定長ではありません。あとで属性の説明で示すように、長い値は切り捨てられる可能性があります。
<
、>
、"
、および&
文字は、それぞれ<
、>
、"
、および&
としてエンコードされます。NUL バイト (U+00) は、?
文字としてエンコードされます。-
XML 文字として有効でない文字は、数値の文字参照を使用してエンコードされます。有効な XML 文字は次のとおりです。
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
新しい監査ログファイル形式
すべての <AUDIT_RECORD>
要素には、必須の要素セットが含まれています。監査レコードのタイプに応じて、その他のオプションの要素が表示される場合もあります。
次の要素は、すべての
<AUDIT_RECORD>
要素で必須です。
-
<NAME>
監査イベントを生成した命令 (サーバーがクライアントから受信したコマンドなど) のタイプを表す文字列。
例:
<NAME>Query</NAME>
一部の一般的な
<NAME>
値:Audit When auditing starts, which may be server startup time Connect When a client connects, also known as logging in Query An SQL statement (executed directly) Prepare Preparation of an SQL statement; usually followed by Execute Execute Execution of an SQL statement; usually follows Prepare Shutdown Server shutdown Quit When a client disconnects NoAudit Auditing has been turned off
指定可能な値は
Audit
、Binlog Dump
、Change user
、Close stmt
、Connect Out
、Connect
、Create DB
、Daemon
、Debug
、Delayed insert
、Drop DB
、Execute
、Fetch
、Field List
、Init DB
、Kill
、Long Data
、NoAudit
、Ping
、Prepare
、Processlist
、Query
、Quit
、Refresh
、Register Slave
、Reset stmt
、Set option
、Shutdown
、Sleep
、Statistics
、Table Dump
、Time
です。Audit
とNoAudit
を除いて、これらの値はmysql_com.h
ヘッダーファイルに一覧表示されたCOM_
コマンドの値に対応します。たとえば、xxx
Create DB
とShutdown
は、それぞれCOM_CREATE_DB
とCOM_SHUTDOWN
に対応します。 -
<RECORD_ID>
監査レコードを表す一意の識別子。この値はシーケンス番号とタイムスタンプで構成され、形式は
です。シーケンス番号は、監査ログプラグインによって開かれ、レコードのログが記録されるたびに 1 ずつ増分されると、監査ログファイルのサイズに初期化されます。タイムスタンプは、監査ログプラグインによってファイルが開かれた時間を示すSEQ_TIMESTAMP
形式の UTC 値です。yyyy-mm-dd
Thh:mm:ss
例:
<RECORD_ID>28743_2013-09-18T21:03:24</RECORD_ID>
-
<TIMESTAMP>
監査イベントが生成された日付と時間。たとえば、クライアントから受信された SQL ステートメントの実行に対応するイベントでは、
<TIMESTAMP>
値はステートメントが受信されたときではなく、終了したあとに生成されます。この値の形式は、
(yyyy-mm-dd
Thh:mm:ss
UTCT
の場合は小数点不可) です。この形式の末尾には、タイムゾーン指定子が含まれています。現在、タイムゾーンは常に UTC です。例:
<TIMESTAMP>2013-09-17T15:03:49 UTC</TIMESTAMP>
次の要素は、<AUDIT_RECORD>
要素ではオプションです。これらの多くは、特定の
<NAME>
値でのみ発生します。
-
<COMMAND_CLASS>
実行されたアクションのタイプを示す文字列。
例:
<COMMAND_CLASS>drop_table</COMMAND_CLASS>
この値は、MySQL ソース配布の
sql/mysqld.cc
ファイル内のcom_status_vars
配列から取得されます。これらは、このステートメントで表示されるステータス変数に対応します。SHOW STATUS LIKE 'Com%';
-
<CONNECTION_ID>
クライアント接続識別子を表す符号なし整数。これは、セッション内の
CONNECTION_ID()
関数の値と同じです。例:
<CONNECTION_ID>127</CONNECTION_ID>
-
<DB>
デフォルトのデータベース名を表す文字列。この要素は、
<NAME>
値がConnect
またはChange user
である場合にのみ表示されます。 -
<HOST>
クライアントのホスト名を表す文字列。この要素は、
<NAME>
値がConnect
、Change user
、またはQuery
である場合にのみ表示されます。例:
<HOST>localhost</HOST>
-
<IP>
クライアントの IP アドレスを表す文字列。この要素は、
<NAME>
値がConnect
、Change user
、またはQuery
である場合にのみ表示されます。例:
<IP>127.0.0.1</IP>
-
<MYSQL_VERSION>
MySQL サーバーのバージョンを表す文字列。これは、セッション内の
VERSION()
関数またはversion
システム変数の値と同じです。この要素は、<NAME>
値がAudit
である場合にのみ表示されます。例:
<MYSQL_VERSION>5.7.1-m11-log</MYSQL_VERSION>
-
<OS_LOGIN>
外部ユーザーを表す文字列 (none の場合は空です)。たとえば、サーバーが外部の認証方式を使用してクライアントを認証する場合は、この値が
<USER>
の値と異なる可能性があります。この要素は、<NAME>
値がConnect
、Change user
、またはQuery
である場合にのみ表示されます。 -
<OS_VERSION>
サーバーが構築された、または実行されているオペレーティングシステムを表す文字列。この要素は、
<NAME>
値がAudit
である場合にのみ表示されます。例:
<OS_VERSION>x86_64-Linux</OS_VERSION>
-
<PRIV_USER>
サーバーがクライアントを認証する際に使用したユーザーを表す文字列。これは、サーバーが権限チェックを行う際に使用するユーザー名であり、
<USER>
の値とは異なる可能性があります。この要素は、<NAME>
値がConnect
またはChange user
である場合にのみ表示されます。 -
<PROXY_USER>
プロキシユーザーを表す文字列。ユーザーのプロキシ処理が有効になっていない場合は、値が空です。この要素は、
<NAME>
値がConnect
またはChange user
である場合にのみ表示されます。 -
<SERVER_ID>
サーバー ID を表す符号なし整数。これは、
server_id
システム変数の値と同じです。この要素は、<NAME>
値がAudit
またはNoAudit
である場合にのみ表示されます。例:
<SERVER_ID>1</SERVER_ID>
-
<SQLTEXT>
SQL ステートメントのテキストを表す文字列。この値は、空にすることができます。長い値は、切り捨てられる可能性があります。この要素は、
<NAME>
値がQuery
またはExecute
である場合にのみ表示されます。監査ログファイル自体などの文字列は、UTF-8 (1 文字当たり最大 4 バイト) を使用して記述されるため、この値が変換の結果となる場合があります。たとえば、元のステートメントは、SJIS 文字列としてクライアントから受信された可能性があります。
例:
<SQLTEXT>DELETE FROM t1</SQLTEXT>
-
<STARTUP_OPTIONS>
MySQL サーバーの起動時に、コマンド行またはオプションファイルで指定されたオプションを表す文字列。この要素は、
<NAME>
値がAudit
である場合にのみ表示されます。例:
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log-output=FILE</STARTUP_OPTIONS>
-
<STATUS>
コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合はゼロ以外)。これは、
mysql_errno()
C API 関数の値と同じです。監査ログには、SQLSTATE 値またはエラーメッセージが含まれていません。エラーコード、SQLSTATE 値、およびメッセージ間の関連性を確認する方法については、セクションB.3「サーバーのエラーコードおよびメッセージ」を参照してください。
警告のログは記録されません。
<STATUS>
と異なる点については、<STATUS_CODE>
の説明を参照してください。例:
<STATUS>1051</STATUS>
-
<STATUS_CODE>
コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合は 1)。
STATUS_CODE
の値は、STATUS
の値とは異なります。STATUS_CODE
は、成功した場合は 0、エラーが発生した場合は 1 であり、Audit Vault の EZ_collector コンシューマとの互換性があります。STATUS
は、mysql_errno()
C API 関数の値です。これは、成功した場合は 0、エラーが発生した場合はゼロ以外です。そのため、エラーが発生した場合、必ずしも 1 であるとはかぎりません。例:
<STATUS_CODE>0</STATUS_CODE>
-
<USER>
クライアントによって送信されたユーザー名を表す文字列。これは、
<PRIV_USER>
の値とは異なる可能性があります。この要素は、<NAME>
値がConnect
、Change user
、またはQuery
である場合にのみ表示されます。例:
<USER>root[root] @ localhost [127.0.0.1]</USER>
-
<VERSION>
監査ログファイル形式のバージョンを表す符号なし整数。この要素は、
<NAME>
値がAudit
である場合にのみ表示されます。例:
<VERSION>1</VERSION>
古い監査ログファイル形式
すべての <AUDIT_RECORD>
要素には、必須の属性セットが含まれています。監査レコードのタイプに応じて、その他のオプションの属性が表示される場合もあります。
次の属性は、すべての
<AUDIT_RECORD>
要素で必須です。
-
NAME
監査イベントを生成した命令 (サーバーがクライアントから受信したコマンドなど) のタイプを表す文字列。
例:
NAME="Query"
一部の一般的な
NAME
値:"Audit" When auditing starts, which may be server startup time "Connect" When a client connects, also known as logging in "Query" An SQL statement (executed directly) "Prepare" Preparation of an SQL statement; usually followed by Execute "Execute" Execution of an SQL statement; usually follows Prepare "Shutdown" Server shutdown "Quit" When a client disconnects "NoAudit" Auditing has been turned off
指定可能な値は
"Audit"
、"Binlog Dump"
、"Change user"
、"Close stmt"
、"Connect Out"
、"Connect"
、"Create DB"
、"Daemon"
、"Debug"
、"Delayed insert"
、"Drop DB"
、"Execute"
、"Fetch"
、"Field List"
、"Init DB"
、"Kill"
、"Long Data"
、"NoAudit"
、"Ping"
、"Prepare"
、"Processlist"
、"Query"
、"Quit"
、"Refresh"
、"Register Slave"
、"Reset stmt"
、"Set option"
、"Shutdown"
、"Sleep"
、"Statistics"
、"Table Dump"
、"Time"
です。"Audit"
と"NoAudit"
を除いて、これらの値はmysql_com.h
ヘッダーファイルに一覧表示されたCOM_
コマンドの値に対応します。たとえば、xxx
"Create DB"
と"Shutdown"
は、それぞれCOM_CREATE_DB
とCOM_SHUTDOWN
に対応します。 -
TIMESTAMP
監査イベントが生成された日付と時間。たとえば、クライアントから受信された SQL ステートメントの実行に対応するイベントでは、
TIMESTAMP
値はステートメントが受信されたときではなく、終了したあとに生成されます。この値は、
形式 (yyyy-mm-dd
Thh:mm:ss
T
の場合は小数点不可) の UTC です。例:
TIMESTAMP="2012-08-09T12:55:16"
次の属性は、<AUDIT_RECORD>
要素ではオプションです。これらの多くは、NAME
属性の特定の値を含む要素でのみ発生します。
-
CONNECTION_ID
クライアント接続識別子を表す符号なし整数。これは、セッション内の
CONNECTION_ID()
関数の値と同じです。例:
CONNECTION_ID="127"
-
DB
デフォルトのデータベース名を表す文字列。この属性は、
NAME
値が"Connect"
または"Change user"
である場合にのみ表示されます。 -
HOST
クライアントのホスト名を表す文字列。この属性は、
NAME
値が"Connect"
または"Change user"
である場合にのみ表示されます。例:
HOST="localhost"
-
IP
クライアントの IP アドレスを表す文字列。この属性は、
NAME
値が"Connect"
または"Change user"
である場合にのみ表示されます。例:
IP="127.0.0.1"
-
MYSQL_VERSION
MySQL サーバーのバージョンを表す文字列。これは、セッション内の
VERSION()
関数またはversion
システム変数の値と同じです。この属性は、NAME
値が"Audit"
である場合にのみ表示されます。例:
MYSQL_VERSION="5.6.11-log"
-
OS_LOGIN
外部ユーザーを表す文字列 (none の場合は空です)。たとえば、サーバーが外部の認証方式を使用してクライアントを認証する場合は、この値が
USER
と異なる可能性があります。この属性は、NAME
値が"Connect"
または"Change user"
である場合にのみ表示されます。 -
OS_VERSION
サーバーが構築された、または実行されているオペレーティングシステムを表す文字列。この属性は、
NAME
値が"Audit"
である場合にのみ表示されます。例:
OS_VERSION="x86_64-Linux"
-
PRIV_USER
サーバーがクライアントを認証する際に使用したユーザーを表す文字列。これは、サーバーが権限チェックを行う際に使用するユーザー名であり、
USER
の値とは異なる可能性があります。この属性は、NAME
値が"Connect"
または"Change user"
である場合にのみ表示されます。 -
PROXY_USER
プロキシユーザーを表す文字列。ユーザーのプロキシ処理が有効になっていない場合は、値が空です。この属性は、
NAME
値が"Connect"
または"Change user"
である場合にのみ表示されます。 -
SERVER_ID
サーバー ID を表す符号なし整数。これは、
server_id
システム変数の値と同じです。この属性は、NAME
値が"Audit"
または"NoAudit"
である場合にのみ表示されます。例:
SERVER_ID="1"
-
SQLTEXT
SQL ステートメントのテキストを表す文字列。この値は、空にすることができます。長い値は、切り捨てられる可能性があります。この属性は、
NAME
値が"Query"
または"Execute"
である場合にのみ表示されます。監査ログファイル自体などの文字列は、UTF-8 (1 文字当たり最大 4 バイト) を使用して記述されるため、この値が変換の結果となる場合があります。たとえば、元のステートメントは、SJIS 文字列としてクライアントから受信された可能性があります。
例:
SQLTEXT="DELETE FROM t1"
-
STARTUP_OPTIONS
MySQL サーバーの起動時に、コマンド行またはオプションファイルで指定されたオプションを表す文字列。この属性は、
NAME
値が"Audit"
である場合にのみ表示されます。例:
STARTUP_OPTIONS="--port=3306 --log-output=FILE"
-
STATUS
コマンドのステータスを表す符号なし整数 (成功した場合は 0、エラーが発生した場合はゼロ以外)。これは、
mysql_errno()
C API 関数の値と同じです。監査ログには、SQLSTATE 値またはエラーメッセージが含まれていません。エラーコード、SQLSTATE 値、およびメッセージ間の関連性を確認する方法については、セクションB.3「サーバーのエラーコードおよびメッセージ」を参照してください。
警告のログは記録されません。
例:
STATUS="1051"
-
USER
クライアントによって送信されたユーザー名を表す文字列。これは、
PRIV_USER
の値とは異なる可能性があります。この属性は、NAME
値が"Connect"
または"Change user"
である場合にのみ表示されます。 -
VERSION
監査ログファイル形式のバージョンを表す符号なし整数。この属性は、
NAME
値が"Audit"
である場合にのみ表示されます。例:
VERSION="1"