MySQL 監査ログを出力する

MySQL

MySQLの監査ログを取得する方法を調べました。以下、2013/12/26時点での情報になります。

監査ログを取得する方法としては、主に以下の選択肢があるようです。

  1. general_logから必要なデータを抜き出す

general_logをオンにするとMySQLの処理全般のログが出力されるので、このログから必要なデータを抜き出すことができます。ただ、必要なデータを抜き出す処理を手作りすることになりますし、general_logを出力するオーバーヘッドも気になります。

  1. MySQL Enterprise Audit Log Pluginを利用する

年間5,000$支払ってMySQL Enterprise Editionを契約すれば、Enterprise Edition付属の監査ログプラグインが利用できるようです。

  1. サードパーティ製の監査ログツールを利用する

McAfeeがGPL version2でmysql-auditという監査ログプラグインを公開しています。ダウンロード数を見る限りではあまり利用者は多くはないようで、安定性は不明です。

mysql-auditの概要

今回は手間・コストが一番少ないということで、McAfeeの監査ログプラグインmysql-auditを試してみました。
mysql-auditはJSON形式で監査ログを出力します。
また、以下のフィルタ機能があります。

  • 監査対象コマンド(例:connect,insert,update,delete)
  • 監査対象テーブル(例:*.mytable,mydb.*)
  • 監査除外対象ユーザー(ホワイトリスト)

ソースコードは下記で公開されています。
https://github.com/mcafee/mysql-audit

インストール・設定については下記で説明されています。
https://github.com/mcafee/mysql-audit/wiki

インストール

利用しているOS/MySQLのバージョンに合わせて以下からバイナリを取得します。
バイナリリリース https://github.com/mcafee/mysql-audit/downloads
開発スナップショット https://bintray.com/mcafee/mysql-audit-plugin/dev-snapshot
(注:MySQL5.5.35の場合リリース版ではプラグインの初期化に失敗してしまいました。開発スナップショット版では動作確認がとれました。)

ダウンロードしだファイルを解凍するとlibディレクトリ以下にlibaudit_plugin.soがあります。これをMySQLプラグインディレクトリ(例:/usr/lib/mysql/pluginまたは/usr/lib64/mysql/plugin)にコピーし、実行権限を付与します。
プラグインディレクトリは下記MySQLコマンドで確認できます。

 show global variables like 'plugin_dir';

動作確認

MySQLコマンドでプラグインのロード、設定をして動作確認します。

プラグインをロードします。

 INSTALL PLUGIN AUDIT SONAME 'libaudit_plugin.so';

ロードされているプラグイン一覧を表示します。

 show plugins;

プラグインのバージョンを確認します。

 show global status like 'AUDIT_version';

監査ログ出力をONにします。デフォルトでは/var/lib/mysql/mysql-audit.jsonにログ出力されます。

 set global audit_json_file=1;

設定

my.cnfの[mysqld]セクションにに設定を記載します。
設定例は下記の通りです。

 plugin-load=AUDIT=libaudit_plugin.so
 audit_json_file=1
 audit_record_cmds=connect,quit,insert,update,delete
 audit_validate_checksum=OFF

設定詳細については下記リンクを参照してください。
https://github.com/mcafee/mysql-audit/wiki/Configuration

備考

現時点ではテストサーバーにインストールして動作検証中です。
mysql-5.5.35/mysql-audit 1.0.4-456の組み合わせでは、mysql起動時に下記ログが出力されました。

 131226 19:07:24 [Note] Audit Plugin: starting up. Version: 1.0.4 , Revision: 456 (64bit). AUDIT plugin interface version: 50535 (0xc567). MySQL Server version: 5.5.35-log.
 131226 19:07:24 [Note] Audit Plugin: setup_offsets audit_offsets: (null) validate_checksum: 0 offsets_by_version: 1
 131226 19:07:24 [Note] Audit Plugin: mysqld: /usr/libexec/mysqld (45e3db89ee0a09985d1756c588539d71) 
 131226 19:07:24 [ERROR] Audit Plugin: Offsets: 5.5.35 (09c5971f9df91d9fde18e969f66d9ff7) match thread validation check fails with value: 0. Skipping offest.
 131226 19:07:24 [Note] Audit Plugin: extended offsets validate res: MySQL thread id 123456, OS thread handle 0x0, query id 789 aud_tusr
 131226 19:07:24 [Note] Audit Plugin: Using decrement (24) offsets from offset version: 5.5.35 (09c5971f9df91d9fde18e969f66d9ff7) values: 6112 6160 3792 4288 88 2592 96 0 32 104
 131226 19:07:24 [Note] Audit Plugin: Set num_record_cmds: 5
 131226 19:07:24 [Note] Audit Plugin: mem func addr: 0x7f303aef48b0 mem start addr: 0x7f303aef5000 page size: 4096
 131226 19:07:24 [Note] Audit Plugin: hot patching function: 0x57db90, trampolineFunction: 0x7f303aef5000 trampolinePage: 0x7f303aef5000
 131226 19:07:24 [Note] Audit Plugin: hot patch for: log_slow_statement (0x57db90) complete. Audit func: 0x7f303aef4340, Trampoline address: 0x7f303aef5000 size: 14.
 131226 19:07:24 [Note] Audit Plugin: hot patching function: 0x581a80, trampolineFunction: 0x7f303aef5020 trampolinePage: 0x7f303aef5000
 131226 19:07:24 [Note] Audit Plugin: hot patch for: mysql_execute_command (0x581a80) complete. Audit func: 0x7f303aef4150, Trampoline address: 0x7f303aef5020 size: 20.
 131226 19:07:24 [Note] Audit Plugin: hot patching function: 0x53f9b0, trampolineFunction: 0x7f303aef5050 trampolinePage: 0x7f303aef5000
 131226 19:07:24 [Note] Audit Plugin: hot patch for: acl_authenticate (0x53f9b0) complete. Audit func: 0x7f303aef43b0, Trampoline address: 0x7f303aef5050 size: 14.
 131226 19:07:24 [Note] Audit Plugin: hot patching function: 0x556750, trampolineFunction: 0x7f303aef5070 trampolinePage: 0x7f303aef5000
 131226 19:07:24 [Note] Audit Plugin: hot patch for: send_result_to_client (0x556750) complete. Audit func: 0x7f303aef3e20, Trampoline address: 0x7f303aef5070 size: 18.
 131226 19:07:24 [Note] Audit Plugin: hot patching function: 0x57d2f0, trampolineFunction: 0x7f303aef5090 trampolinePage: 0x7f303aef5000
 131226 19:07:24 [Note] Audit Plugin: hot patch for: check_table_access (0x57d2f0) complete. Audit func: 0x7f303aef3cd0, Trampoline address: 0x7f303aef5090 size: 14.
 131226 19:07:24 [Note] Audit Plugin: hot patching function: 0x5520f0, trampolineFunction: 0x7f303aef50b0 trampolinePage: 0x7f303aef5000
 131226 19:07:24 [Note] Audit Plugin: hot patch for: open_tables (0x5520f0) complete. Audit func: 0x7f303aef3ef0, Trampoline address: 0x7f303aef50b0 size: 20.
 131226 19:07:24 [Note] Audit Plugin: Done initializing sql command names. status_vars_index: [139], com_status_vars: [0xed5ec0].
 131226 19:07:24 [Note] Audit Plugin: Init completed successfully.

参考サイト
http://www.s-quad.com/wordpress/?p=1609

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です