22
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

McAfee MySQL Audit Plugin で MySQL の監査ログを採取する

Last updated at Posted at 2015-06-21

McAfee が作ったオープンソースの MySQL プラグイン "McAfee MySQL Audit Plugin" を使うと、MySQL の監査ログが取得できるようになります。

会社のセキュリティ要件で監査が必要になったので、使い物になるかどうか検証してみました。

McAfee MySQL Audit Plugin の特徴

  • 監査対象の DB やテーブルを細かく指定できる
  • 監査を除外するユーザーも指定可能
  • JSON 形式でログが出る
  • 無停止でインストールや設定変更が可能
  • MySQL >= 5.1 に対応

インストールの手順

CentOS 6.3 (64bit) 上に MySQL 5.6 をインストールしている環境を想定しています。

プラグインのダウンロード

まず、Plugin のダウンロードページ から最新のバイナリをダウンロードし、MySQL のプラグインディレクトリに解凍します。MySQL のバージョンと OS の bit を間違えないように。

$ wget http://dl.bintray.com/mcafee/mysql-audit-plugin/1.0.4/audit-plugin-mysql-5.6-1.0.4-459-linux-x86_64.zip
$ unzip audit-plugin-mysql-5.6-1.0.4-459-linux-x86_64.zip
$ sudo mv audit-plugin-mysql-5.6/lib/libaudit_plugin.so /usr/lib64/mysql/plugin/

※MySQL のプラグインディレクトリが不明な場合、MySQL クライアントから以下のクエリを叩くことで確認できます。

mysql> show global variables like 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+

Audit プラグインのインストール

MySQL CLI から以下のコマンドを叩いてインストールします。

mysql> INSTALL PLUGIN AUDIT SONAME 'libaudit_plugin.so';

※my.cnf に以下の設定を書いて mysqld を再起動してもインストールできます。

[mysqld]
plugin-load=AUDIT=libaudit_plugin.so

動作確認

以下のようにコマンドを叩いた結果が出ればインストール成功です。

mysql> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name                       | Status   | Type               | Library            | License |
+----------------------------+----------+--------------------+--------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
...
| AUDIT                      | ACTIVE   | AUDIT              | libaudit_plugin.so | GPL     |
+----------------------------+----------+--------------------+--------------------+---------+

mysql> show global status like 'AUDIT_version';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| Audit_version | 1.0.4-459 |
+---------------+-----------+

プラグインを有効化

インストールしただけでは Audit Plugin はまだ有効になっていないので、設定する必要があります。設定方法は以下の2通り。

my.cnf に書き込む場合

my.cnf の [mysqld] セクションに書き込んで、mysqld を再起動する。

[mysqld]
audit_json_file = On

MySQL クライアントから有効にする場合

SET ステートメントを使います。この方法なら無停止で動的に設定変更ができます。

mysql> SET GLOBAL audit_json_file = 'On';

プラグインの設定

設定パラメータを全部書くのは面倒なので主要なものだけ。詳しくは Configuration · mcafee/mysql-audit Wiki を参照。

変数名 内容
audit_json_file Audit を有効にするか。 [On or Off]
audit_json_log_file Audit ログの保存場所。絶対パスか、data-dir からの相対パスで記述。
audit_record_cmds どのコマンドをロギングするか。カンマ区切り。空白なら全てのコマンドを記録。(e.g.: insert,update,delete)
audit_record_objs ロギングしたいオブジェクト (テーブル)。カンマ区切り。空白なら全てのオブジェクトを記録。 (e.g.: mydb.*,database.table)
audit_whitelist_users ここに指定したユーザーのクエリはロギングしない。カンマ区切り。

設定値は以下のコマンドで確認できます。

mysql> SHOW VARIABLES LIKE 'audit_%';
+---------------------------------+----------------------------+
| Variable_name                   | Value                      |
+---------------------------------+----------------------------+
| audit_checksum                  |                            |
| audit_delay_cmds                |                            |
| audit_delay_ms                  | 0                          |
| audit_json_file                 | OFF                        |
| audit_json_file_flush           | OFF                        |
| audit_json_file_sync            | 0                          |
| audit_json_log_file             | mysql-audit.json           |
| audit_json_socket               | OFF                        |
| audit_json_socket_name          | /tmp/mysql-audit.json.sock |
| audit_offsets                   |                            |
| audit_offsets_by_version        | ON                         |
| audit_record_cmds               |                            |
| audit_record_objs               |                            |
| audit_uninstall_plugin          | OFF                        |
| audit_validate_checksum         | ON                         |
| audit_validate_offsets_extended | ON                         |
| audit_whitelist_users           |                            |
+---------------------------------+----------------------------+
17 rows in set (0.00 sec)

注意

  • MySQL 5.1 では boolean 型は 01 で指定しないとエラーになります。(On or Off ではダメ)
  • MariaDB や Percona MySQL などの MySQL の派生バイナリにインストールすると、デフォルトではエラーが出て動かせないそうです。この場合、audit_offset の設定が必要です。詳しくは以下の記事を参照。

取得できる値の例

正しく設定できていると、クエリを投げるたびに以下のような値がログに吐かれます。

{
  "msg-type": "activity",
  "date": "1398043832028",
  "thread-id": "8",
  "query-id": "11436",
  "user": "root",
  "priv_user": "root",
  "host": "localhost",
  "ip": "",
  "cmd": "update",
  "objects": [
    {
      "db": "foobar",
      "name": "sessions",
      "obj_type": "TABLE"
    }
  ],
  "query": "UPDATE `foobar`.`sessions` SET `status` = 'card_not_registered', `need_mail` = '0', `merchant_id` = 1, `modified` = '2014-04-21 10:30:32'  WHERE `foobar`.`sessions`.`id` = '1'"
}

それぞれの値の意味は下記。

キー 中身
msg_type 「activity」固定
date コマンドが実行された日時のUNIXTIME。単位はミリ秒。
thread-id スレッドID。コネクション毎のユニークなID。
query-id クエリID。クエリ毎のユニークなID。
user ユーザ名。
priv_user ユーザ名。LDAP認証を使っている場合はuserと異なるユーザ名になるケースがある。基本はpriv_userを見れば良い。
host アクセス元ホスト名。
ip アクセス元IP。
cmd 実行したコマンド。
objects 対処のオブジェクト。
query 実行したクエリー全体。

まとめ

インストールは非常に簡単ですし、動的に ON/OFF の切り替えや設定パラメータの変更が可能です。ログは JSON で出力されるので、fluentd などに食わせて管理するのも楽です。

この記事には書きませんでしたが、監査対象のユーザーやテーブルの指定も簡単でした。

MySQL の監査ログを取りたければ、これを使っておけばひとまず十分ではないでしょうか。

追記: 負荷はどれくらい?

Audit Plugin によって性能は何%ぐらい劣化するのかを、以下の記事で検証しました。

McAfee MySQL Audit Plugin の負荷はどれくらい? - Qiita

参考

22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?