McAfeeのMySQL監査出力ログを、fluentd(td-agent)でMySQLに戻す
先日、[MySQL] McAfeeのMySQL監査ツールを導入する!!にてMySQLの監査ログを、JSONで出力することができるよ!ってところまで説明しました。今回は、せっかくJSONで出力されているんだからJSONファイルを、Fluentd(td-agent)を経由して、また、MySQLに戻すなんていう方法を説明したいと思います。
もちろん、MySQLに戻す必要なんてないかもしれませんが、イメージ的に、MySQLで説明したほうが(自分が)わかりやすいと思いまして・・蓋あけて見れば、なんか不毛なことをしているようにキがします。 実際は、mongodbとか、jsonベースのNoSQLのほうがわかりやすいかもしれませんが、そのあたりはいつか説明します。
イメージ図
言葉で説明するより、絵に書いたほうがわかりやすいとおもいます。こんな感じです
ざっくりと書きすぎかもしれませんが以下が具体的な設定手順になります
- MaAfee-MySQL-audit-Pluginが実装された、MySQLサーバから監査ログがJSON形式で出力される こちらに関しては、ここで説明しておりますので、設定手順については割愛させていただきます
- Fluentd(td-agent)にて上記1のjsonログを取得する 以下のような設定ファイルを記載します。 [shell] # cat /etc/td-agent/td-agent.conf <source> type tail format json path /var/log/mysql/mysqld-audit-log.json pos_file /var/log/td-agent/mysqld-audit-log.pos tag mysqlman.mysql.audit </source><match mysqlman.mysql.audit> type copy<store> type mysql host 192.168.0.41 database mysqlman username mysql_username password mypasswd key_names msg-type,date,thread-id,query-id,user,priv_user,host,cmd,query table audit columns msg_type,date,thread_id,query_id,user,priv_user,host,cmd,query # not used flush_intervals 5s </store> </match> [/shell] ・補足ですが、今回、fluentedのmysql-pluginを利用しております。mysql-pluginの方は以下の手順でインストールできます。 [shell] # /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mysql [/shell]
- 上記2のjsonデータを、MySQLのmysqlmanスキーマに直接、INSERTする この際、まあ当たり前なのですが、MySQLに当該 JSONフォーマットに対応したテーブルが存在しないといけません。例として、192.168.0.41が、ログ収集用MySQLだとします [shell] Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.5.16-log MySQL Community Server (GPL)Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysqlman Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +--------------------+ | Tables_in_mysqlman | +--------------------+ | audit | +--------------------+ 1 row in set (0.00 sec) mysql> show create table audit; +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | audit | CREATE TABLE `audit` ( `msg_type` varchar(50) DEFAULT NULL, `date` varchar(50) DEFAULT NULL, `thread_id` varchar(50) DEFAULT NULL, `query_id` varchar(50) DEFAULT NULL, `user` varchar(10) DEFAULT NULL, `priv_user` varchar(50) DEFAULT NULL, `host` varchar(50) DEFAULT NULL, `cmd` text, `query` text ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) [/shell]
です(^_^)
動作確認
それでは実際に監査ログが出力されているか確認してみましょう!!
- MaAfee-MySQL-audit-Pluginが実装されたMySQLサーバ ( 192.168.0.40) 以下の作業では、テーブルを作成→データをイINSERT→SELECTを発行しております、現在の設定ですと、INSERT,DELETEのコマンドを監査しているので、最低でも1行のレコードが出力されているはずです [shell] mysql> use work; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> create table audit_test (id int,detail varchar(200)); Query OK, 0 rows affected (0.03 sec) mysql> insert into audit_test (id,detail) values (1,'Fluentd Test'); Query OK, 1 row affected (0.00 sec) mysql> select * from audit_test; +------+--------------+ | id | detail | +------+--------------+ | 1 | Fluentd Test | +------+--------------+ 1 row in set (0.00 sec) [/shell]
- ログを収集しているmysqllog収集サーバ(192.168.0.41) 以下の通りとなりました。MySQL側にINSERTのログが出力されているのが確認できたかと思います。 [shell] mysql> select * from audit where date=1367519118131; +----------+---------------+-----------+----------+--------+-----------+-----------+--------+--------------------------------------------------------------+ | msg_type | date | thread_id | query_id | user | priv_user | host | cmd | query | +----------+---------------+-----------+----------+--------+-----------+-----------+--------+--------------------------------------------------------------+ | activity | 1367519118131 | 12 | 652 | sysadm | sysadm | localhost | insert | insert into audit_test (id,detail) values (1,'Fluentd Test') | +----------+---------------+-----------+----------+--------+-----------+-----------+--------+--------------------------------------------------------------+ 1 row in set (0.00 sec) [/shell]
- 元ネタのjsonデータは以下の通りです(192.168.0.40) [shell] # cat /var/log/mysql/mysqld-audit-log.json | grep -i audit_test {"msg-type":"activity","date":"1367519118131","thread-id":"12","query-id":"652","user":"sysadm","priv_user":"sysadm","host":"localhost","cmd":"insert","objects":[{"db":"work","name":"audit_test","obj_type":"TABLE"}],"query":"insert into audit_test (id,detail) values (1,'Fluentd Test')"} [/shell]
上記をまとめますと、
- 192.168.0.40 サーバが、監査ログを出力し。
- 192.168.0.40 サーバの/etc/td-agent/td-agent.conf の設定に従い MySQLにINSERTする
- 192.168.0.41のmysqlmanスキーマのauditテーブルに、fluentdが監査ログをインサートする
・・と・・こんな感じになります。簡単ですね。
現在の手順は、1台の監査対象のMySQLのJSONログを、ログ収集専用 MySQLにINSERTするだけですが、実運用で想定されるのは、100台以上の、監査対象MySQLの監査等にて、それぞれのサーバの監査ログを、一つのMySQLサーバ集約する、なんて実装が簡単にできちゃうとおもいます。
ぜひ、お試しあれ。