MariaDBでデータベースを監査して、クエリーを追跡する！

今まで、あまり気にしていなかったのですが、MariaDBって監査（audit）の機能が標準で実装されております。例えば、作業者のミスでデータが消えてしまった。重たい話では、「情報が漏洩した」なんてことが発生した場合に「いつ？」「だれか？」「何をした？」ってのを追跡したい場合ってどう対応していますか？
聞いた話では、データの情報漏えいって、ほぼ内部からしい・・なんか不安ですよね？
そのため必要なのが「監査」で、テーブルへのアクセス履歴やSQL分の実行履歴といった監査ログの記録が重要になってきます

今も昔もそうなのですが、データベースのセキュリティって結構軽く見がちです。
まあ、実装も大変ですしね。いままでは、でも、MariaDB 10には標準でモジュールが入ってました。入っているのであれば、使ってみようという意味も含め以下にメモを書いた次第です

結構あっさり設定できたので、MariaDBを使っている方は試してみてくださいね！

## audit pluginのインストール

```
MySQL> INSTALL PLUGIN server_audit SONAME 'server_audit';
Query OK, 0 rows affected (0.18 sec)
```

## プラグインディレクトリの確認

```
MariaDB [(none)]> SHOW VARIABLES LIKE 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
1 row in set (0.05 sec)
```

## Audit Logの設定値確認

```
MariaDB [(none)]> 
show global variables like '%audit%' ;                                                                               
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           | CONNECT,QUERY         |
| 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          | OFF                   |
| 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              |
+-------------------------------+-----------------------+
14 rows in set (0.00 sec)
```
## Audit Logの開始

```
MariaDB [(none)]> 
SET GLOBAL server_audit_logging=1;
FLUSH LOGS ;

```

## ログファイルに書き込まれているか確認

* デフォルトのログのフォーマットは以下の通りです

```
[timestamp],[serverhost],[username],[host],[connectionid],
[queryid],[operation],[database],[object],[retcode]
```

* 詳細な情報がほしい場合は、以下のパラメータを追加すると良いでしょう

```
MariaDB [(none)]> 
SET GLOBAL server_audit_output_type=syslog ;
[timestamp][syslog_host][syslog_ident]:[syslog_info][serverhost],[username],[host],
[connectionid],[queryid],[operation],[database],[object],[retcode]
```

* デフォルトログイメージはこんなかんじになります

```
[root@dblibm01new mysql]# cat /var/lib/mysql/server_audit.log                                                                          
20141203 20:38:28,server01.local,sysadm,localhost,14,8,QUERY,,'SET GLOBAL server_audit_logging=1',0
20141203 20:39:45,server01.local,sysadm,localhost,14,0,DISCONNECT,,,0
20141203 20:39:49,server01.local,develop,192.168.33.215,15,0,FAILED_CONNECT,,,1045
20141203 20:39:49,server01.local,develop,192.168.33.215,15,0,DISCONNECT,,,0
20141203 20:39:49,server01.local,develop,192.168.33.215,16,0,FAILED_CONNECT,,,1045
20141203 20:39:49,server01.local,develop,192.168.33.215,16,0,DISCONNECT,,,0

```
## auditログのローテートをしたい場合は、

例えば、ローテートの数を7に、ローテートサイズを、1Gにしたい場合は、以下のような設定になります

```
MariaDB [(none)]>
SET GLOBAL server_audit_file_rotations=7;
SET GLOBAL server_audit_file_rotate_size=1000000;
SET GLOBAL server_audit_file_rotate_now=ON ;
```

## MySQLの再起動時も、Auditが開始されるように、以下の通り server.cnf に以下を記述しておいたほうが良いでしょう

* /etc/my.cnf.d/server.cnf

```
[mysqld]
# Audit Plugin
server_audit_logging=1                                                                                                                         
server_audit_events=connect,query
・
・
・
```

以上、駆け足で説明しました！！