Amazon RDS(MySQL)の監査ログのフォーマットを確認する。【MARIADB_AUDIT_PLUGIN】


# はじめに

Amazon RDS(MySQL)で、監査ログ出力を有効にしました。一部マスクした出力例がこちら。

```text:ログ出力例1
20190707 20:30:55,ip-172-23-2-48,root,10.100.xx.xx,1234567,0,DISCONNECT,,,0 
```
 
```text:ログ出力例2
20190808 10:15:30,ip-10-7-1-52,testdbuser,172.16.xx.xx,2345678,23456789,QUERY,testdb02,'SET autocommit=1',0
```

```text:ログ出力例3
20190909 05:25:25,ip-10-7-1-52,rdsadmin,localhost,3456789,98765432,QUERY,,'SELECT 1',0
```
なんとなく書いてあることは分かるものの、それぞれのフィールドについてきちんと公式のドキュメントで確認したいと思い、調べました。


# 結論

以下の通りです。

```text:Auditログのフォーマット
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],[operation],[database],[object],[retcode]
```

以下のドキュメントに記載されている内容と一致しています。

[Amazon Aurora MySQL DB クラスターでの高度な監査の使用 - 監査ログの詳細]
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Auditing.html#AuroraMySQL.Auditing.Logs

>監査ログファイルの行には、次のカンマ区切りの情報が指定された順序で含まれています。

| フィールド        | 説明                                                                          |
|--------------|-----------------------------------------------------------------------------|
| timestamp    | 記録されたイベントの UNIX タイムスタンプ \(マイクロ秒の精度\)。                                       |
| serverhost   | イベントが記録されているインスタンスの名前。                                                      |
| username     | ユーザーの接続されたユーザー名。                                                            |
| host         | ユーザーの接続元のホスト。                                                               |
| connectionid | 記録されたオペレーションの接続 ID 番号。                                                      |
| queryid      | クエリ ID 番号。リレーショナルテーブルイベントと関連するクエリの検索に使用できます。TABLE イベントの場合、複数の行が追加されます。      |
| オペレーション      | 記録されたアクションの種類。指定できる値は CONNECT、QUERY、READ、WRITE、CREATE、ALTER、RENAME、DROP です。 |
| データベース       | USE コマンドにより設定されたアクティブなデータベース。                                               |
| オブジェクト       | QUERY イベントの場合、この値は実行されたクエリを表示します。TABLE イベントの場合、テーブル名を示します。                  |
| retcode      | 記録されたオペレーションのリターンコード。                                                      |

結果的には同じだったのですが、あくまで上記はAmazon Aurora(MySQL)のドキュメントなので、これを正式な情報源として終了、というのももやっとします。Amazon RDS(MySQL)のドキュメントに同じ記載があればよかったのですが、該当する記述は見当たりませんでした。

# 公式のソースにあたる

AWSドキュメント以外のソースを探すことにします。その取っ掛かりとして`MARIADB_AUDIT_PLUGIN`というキーワードを用います。`MARIADB_AUDIT_PLUGIN`とは、Amazon RDS(MySQL)において監査ログの出力を有効にするために有効化が必要なオプションの名称です。

>監査ログにアクセスするには、DB インスタンスは MARIADB_AUDIT_PLUGIN オプションを指定してカスタムオプショングループを使用する必要があります。

[MySQL データベースログファイル - MySQL 監査ログへのアクセス]
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html#USER_LogAccess.MySQL.Auditlog

そして、MariaDBとは『MySQL派生として開発されている、オープンソースの関係データベース管理システム (RDBMS) 』です。（Wikipediaより。）

MariaDBの公式ソースにあたるものを調べたところ、`Knowledge Base`というページが該当しそうです。その中の1ページとして、お目当てのものを見つけました。

[MariaDB Audit Plugin - Log Format]
https://mariadb.com/kb/en/library/mariadb-audit-plugin-log-format/

Amazon Aurora(MySQL)のドキュメントに記載されていた内容と概ね同じことが記載されています。

| Item logged   | Description                                                                                                                                       |
|---------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| timestamp     | Time at which the event occurred\. If syslog is used, the format is defined by syslogd\.                                                          |
| serverhost    | The MariaDB server host name\.                                                                                                                    |
| username      | Connected user\.                                                                                                                                  |
| host          | Host from which the user connected\.                                                                                                              |
| connectionid  | Connection ID number for the related operation\.                                                                                                  |
| queryid       | Query ID number, which can be used for finding the relational table events and related queries\. For TABLE events, multiple lines will be added\. |
| operation     | Recorded action type: CONNECT, QUERY, READ, WRITE, CREATE, ALTER, RENAME, DROP\.                                                                  |
| database      | Active database \(as set by USE\)\.                                                                                                               |
| object        | Executed query for QUERY events, or the table name in the case of TABLE events\.                                                                  |
| retcode       | Return code of the logged operation\.                                                                                                             |

ログの出力例も記載されています。

```text:connect関連のイベントの例
[timestamp],[serverhost],[username],[host],[connectionid],0,CONNECT,[database],,0 
[timestamp],[serverhost],[username],[host],[connectionid],0,DISCONNECT,,,0 
[timestamp],[serverhost],[username],[host],[connectionid],0,FAILED_CONNECT,,,[retcode]
```
上記の表の『Recorded action type:』には`CONNECT`としか書かれていませんが、`DISCONNECT`や`FAILED_CONNECT`も記録されるようです。冒頭の例1でも、`DISCONNECT`が記録されたことが確認できています。[^1]

[^1]: `CONNECT`、`DISCONNECT`、`FAILED_CONNECT`の3つとも、タイプは「CONNECT」に分類される、という位置づけなのでしょうか。理解が追い付いていません。

```text:クエリ関連のイベントの例
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],QUERY,[database],[object], [retcode]
```


```text:table関連のイベントの例
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],CREATE,[database],[object], 
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],READ,[database],[object], 
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],WRITE,[database],[object], 
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],ALTER,[database],[object], 
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],RENAME,[database], [object_old]|[database_new].[object_new], 
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],DROP,[database],[object],
```


# 純粋なMariaDB Audit Pluginとの違い

Amazon Aurora(MySQL)のドキュメントには記載が無く、MariaDBのドキュメントには記載が有るフィールドがあります。

| Item logged   | Description                                                                                                                                       |
|---------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| syslog\_host | Host from which the syslog entry was received\.                                                                                                   |
| syslog\_ident | For identifying a system log entry, including the MariaDB server\.                                                                                |
| syslog\_info | For providing information for identifying a system log entry\.                                                                                    |

syslog関連のフィールドです。ちなみにsyslogとは、Wikipediaによると以下の通り。

>Syslog は、ログメッセージをIPネットワーク上で転送するための標準規格である。"Syslog" という用語は、その通信プロトコルを指すだけでなく、Syslog メッセージを送信するアプリケーションやライブラリに対しても使われる。

上記のフィールドは、MariaDB Audit Pluginの設定値の一つをデフォルトから変えることで出力が有効になるものです。

>If the **server_audit_output_type** variable is set to **syslog** instead of the default, file, the audit log file format will be as follows:

どういった設定があるかについては、以下ページで確認できました。

https://mariadb.com/kb/en/library/mariadb-audit-plugin-options-and-system-variables/#server_audit_output_type

```text:VARIABLES
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           | CONNECT,QUERY,TABLE   |
| 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                  | # syslogに変えるのはここ
| server_audit_query_log_limit  | 1024                  |
| server_audit_syslog_facility  | LOG_USER              |
| server_audit_syslog_ident     | mysql-server_auditing |
| server_audit_syslog_info      |                       |
| server_audit_syslog_priority  | LOG_INFO              |
+-------------------------------+-----------------------+
```

一方で、Amazon RDS(MySQL)の`MARIADB_AUDIT_PLUGIN`で設定可能なオプションについては以下ドキュメントに記載があります。MariaDB Audit Pluginで設定可能なパラメータと比較して、種類が少なくなっていることが分かります。

[MariaDB 監査プラグインのサポート]
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.MySQL.Options.AuditPlugin.html

| オプション設定                           | 有効な値                                           | デフォルト値                |
|-----------------------------------|------------------------------------------------|-----------------------|
| SERVER\_AUDIT\_FILE\_PATH         | /rdsdbdata/log/audit/                          | /rdsdbdata/log/audit/ |
| SERVER\_AUDIT\_FILE\_ROTATE\_SIZE | 1–1000000000                                   | 1000000               |
| SERVER\_AUDIT\_FILE\_ROTATIONS    | 0–100                                          | 9                     |
| SERVER\_AUDIT\_EVENTS             | CONNECT、QUERY、QUERY\_DDL、QUERY\_DML、QUERY\_DCL | CONNECT、QUERY         |
| SERVER\_AUDIT\_INCL\_USERS        | 複数のカンマ区切り値                                     | なし                    |
| SERVER\_AUDIT\_EXCL\_USERS        | 複数のカンマ区切り値                                     | なし                    |
| SERVER\_AUDIT\_LOGGING            | ON                                             | ON                    |



RDS（Aurora含む）は、RDBMSを提供するPaaSであり、ユーザがOS相当の領域に変更を加えることができません。各種RDBMSにおけるconfファイルも触ることができないため、代わりにパラメータグループやオプショングループでの設定を通じ、それらに相当するような設定を行うことが可能です。とはいえconfの全量が触れるというわけではなく、飽くまでRDBMSの機能に必要な分だけが取捨選択されています。

上記の例のsyslogで言えば、サーバ・ネットワークレイヤが主戦場であり、AWSによってマネージされている領域であるため、ユーザーが意識する必要無し、ということでオプショングループの設定対象に含まれていないのだろうと考えます。



```text:RDSやAuroraでは見られないsyslogフィールドを含むAuditログのフォーマット
[timestamp][syslog_host][syslog_ident]:[syslog_info][serverhost],[username],[host],[connectionid],[queryid],[operation],[database],[object],[retcode]
```

# Auroraの監査ログもきっとMariaDB Audit Plugin

Amazon Aurora(MySQL)では、オプショングループではなくパラメータグループで監査ログの出力設定を行います。

[Amazon Aurora MySQL DB クラスターでの高度な監査の使用 - 高度な監査の有効化]
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Auditing.html#AuroraMySQL.Auditing.Enable

設定可能なパラメータは以下の通り。


- server_audit_logging
- server_audit_events
- server_audit_excl_users
- server_audit_incl_users

MariaDB Audit Pluginの設定項目と同じ名称です。ドキュメントに明確に記載は無いものの、恐らく裏側では利用しているのでしょう。Amazon RDS(MySQL)の`MARIADB_AUDIT_PLUGIN`と比較すると、ログファイルの出力先、ローテートに関する項目が減っています。RDSとAuroraのアーキテクチャの違いにより、ユーザがどこまで触れる（指定できる）かが異なるんだなーと再認識させられます。

>ログファイルは UTF-8 形式です。ログは、複数のファイルに書き込まれます。ファイル数は、インスタンスのサイズによって異なります。最新のイベントを表示するには、すべての監査ログファイルの確認が必要な場合があります。
ログファイルは、合計 100 MB に達するとローテーションされます。この制限は設定できません。

# おわりに

本来はログのフォーマットを書いておしまいの予定だったのですが、どうやって正式なソースにあたるか、という話に波及しました。ついついなんでもAWSの公式ドキュメントを見てしまうのですが、Linuxのログ（例えば/var/log/messages）のログフォーマットをEC2のドキュメントで確認しないように、AWSが提供している範囲を意識して、適宜参照すべきソースをあたらなくてはなと思いました。

本当は冒頭のログ出力例1~3を見て「あれ？」と思ったことも書きたかったのですが、それはまた次回にでも。