WED, 2014/09/03 07:48 ANATOLIYDIMITROV
データベースの環境を監視する上で監査は必須のタスクである。監査の情報はパフォーマンスやアプリケションの問題をトラブルシュートしたり、どのようなSQLクエリが処理されているのか正確に知るのに役立つ。 MariaDBの監査プラグインは、MariaDBだけでなく、MySQLにも監査機能を提供する。
MariaDBを公式のパッケージからインストールした場合は、標準でインストール済みでも有効化されているわけでもないがプラグインはシステム上にある。
server_audit.so(Linux)かserver_audit.dll(Windows)をプラグインディレクトリ(CentOS 6では/usr/lib64/mysql/plugin)を探してみてほしい。
プラグインディレクトリが分からない場合は、次のクエリを発行すると良いだろう。SHOW VARIABLES LIKE 'plugin_dir';
プラグインディレクトリにプラグインが見つけられなかった場合は、ダウンロードして、プラグインディレクトリに手動で設置するとよい。 MariaDBサーバがファイルを読めるように、Linuxでは755の権限を与えrootユーザに対する所有権を付与するのを忘れないようにしてほしい。
次に、プラグインをINSTALL PLUGIN server_audit SONAME 'server_audit';
コマンドを使ってインストールする。
プラグインがインストールされ有効化されたことを確認するには、show plugins;
クエリを実行する。一覧の中に下記のようなレコードを見つけられるはずである。
+-----------------------------+----------+--------------------+-----------------+---------+ | Name | Status | Type | Library | License | +-----------------------------+----------+--------------------+-----------------+---------+ | SERVER_AUDIT | ACTIVE | AUDIT | server_audit.so | GPL | +-----------------------------+----------+--------------------+-----------------+---------+
MariaDBの監査プラグインは重要なステートメントやイベントだけに集中できるように良く調整するのに十分な変数を持つ。
現在の変数の設定値は、show global variables like "server_audit%";
で確認できる。
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE "server_audit%"; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | server_audit_events | | | server_audit_excl_users | | | server_audit_file_path | server_audit.log | | server_audit_file_rotate_now | OFF | | server_audit_file_rotate_size | 1000000 | | server_audit_file_rotations | 9 | | server_audit_incl_users | | | server_audit_logging | ON | | server_audit_mode | 0 | | server_audit_output_type | file | | server_audit_syslog_facility | LOG_USER | | server_audit_syslog_ident | mysql-server_auditing | | server_audit_syslog_info | | | server_audit_syslog_priority | LOG_INFO | +-------------------------------+-----------------------+
これらの変数がサーバーを再起動しても設定が永続するようにする為には、MariaDBのサーバ設定ファイル(CentOSでは/etc/my.cnf.d/server.cnf)の[mysqld]
セクションで指定する。
例えばserver_audit_logging
変数ををONにするには、ファイルにserver_audit_logging=ON
の行を追加する。
最も重要な変数のいくつかをここに示す。
server_audit_logging
– 監査のログを有効化する。ONでない場合は監査イベントは記録されず監査プラグインは何もしない。server_audit_events
– ログに記録したいイベントを指定する。標準では値は空で、この場合全てのイベントが記録される。次の値が選択できる。CONNECTION
(ユーザーの接続と切断)、QUERY
(クエリとその結果)、TABLE
(どのテーブルがクエリで影響を受けるか)server_audit_excl_users
,server_audit_incl_users
– これらの変数は監査から除外する、または対象とするユーザを指定する。server_audit_incl_users
の方が優先度が高い。標準では全ユーザの活動が記録される。server_audit_output_type
– 標準では監査の出力はファイルに送られる。その他の選択肢としてsyslog
があり、全てのエントリがsyslogファシリティーにいく。server_audit_syslog_facility
,server_audit_syslog_priority
– syslogファシリティーと、syslogにいくイベントのプライオリティーを示す。
使い方
監査プラグインを設定し動作させれば、ログファイルを確認できるようになる。CentOSでは標準で/var/lib/mysql/server_audit.logである。
server_audit_logging
変数で有効化した全てのイベントを見つけられるだろう。例えば、CONNECTIONの場合は、ユーザーと、どこから接続と切断が発生したかが下記のようにわかる。
20140901 15:33:43,localhost.localdomain,root,localhost,5,0,CONNECT,,,0 20140901 15:45:42,localhost.localdomain,root,localhost,5,0,DISCONNECT,,,0
TABLEとQUERYのサンプルは下記の通りである。
20140901 15:19:44,localhost.localdomain,root,localhost,4,133,WRITE,employees,salaries, 20140901 15:19:44,localhost.localdomain,root,localhost,4,133,QUERY,employees,'DELETE FROM salaries LIMIT 100',0
最初のエントリはWRITE操作がemployeesデータベースとsalariesテーブルに実施されたことを示す。また、WRITE操作を実施したクエリは次の通りである。DELETE FROM salaries LIMIT 100
これらのステートメントの順序は常に同一である。すなわち、初めにTABLEイベント、そして次にそれを発生させたQUERYイベントである。
READ操作は下記のようになる。
20140901 15:20:02,localhost.localdomain,root,localhost,4,134,READ,employees,salaries, 20140901 15:20:05,localhost.localdomain,root,localhost,4,134,QUERY,employees,'SELECT * FROM salaries LIMIT 100',0
監査ログファイルは素早くざっくばらんに見るにはすばらしいのだが、データベースのログをモニタする方法としては現実的ではない。 おそらくはsyslogオプションを利用し、syslogについてのレポートをするツールの長所を活かせばうまくいくだろう。
監査のログは、server_audit_output_type
変数をsyslog
に変更することにより、rsyslogd(CentOSとほとんどのLinuxディストリビューションでの標準)の様なsyslogファシリティーに送ることが出来る。
この設定は、/etc/my.cnf.d/server.cnfファイルの[mysqld]
の部分にserver_audit_output_type=syslog
を追記して、MariaDBのサービスを再起動することによって永続化できる。
一度設定を行えば、syslogイベントがsyslogのUSERファシリティーにINFOプライオリティーで現れるのがわかるだろう。 標準ではCentOSはこのようなイベントは、/var/log/messagesファイルに受取るように設定されており、下記のような行を見ることができる。
Sep 1 16:05:35 localhost mysql-server_auditing: localhost.localdomain,root,localhost,3,0,CONNECT,,,0 Sep 1 16:05:39 localhost mysql-server_auditing: localhost.localdomain,root,localhost,3,3,QUERY,,'SHOW GLOBAL VARIABLES LIKE "server_audit%"',0
この時点でこの監査ログのエントリでおおよそ何でもできる。中央syslogサーバーに送るだとか、興味のある特定のイベント種別だけ処理をするなどである。 これについては以前のブログエントリMariaDB監査プラグイン - rsyslogでリモートログファイルを設定するを参照していただきたい。
お分かりいただけたと思うが、MariaDBの監査プラグインはDBAにとって助けとなる。企業のコンプライアンス上のロギングの簡単なトラブルシューティングのタスクに有用な情報を提供する。