エンジニアブログ

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

2019.09.28

はじめに

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

ログ出力例1
20190707 20:30:55,ip-172-23-2-48,root,10.100.xx.xx,1234567,0,DISCONNECT,,,0 
ログ出力例2
20190808 10:15:30,ip-10-7-1-52,testdbuser,172.16.xx.xx,2345678,23456789,QUERY,testdb02,'SET autocommit=1',0
ログ出力例3
20190909 05:25:25,ip-10-7-1-52,rdsadmin,localhost,3456789,98765432,QUERY,,'SELECT 1',0

なんとなく書いてあることは分かるものの、それぞれのフィールドについてきちんと公式のドキュメントで確認したいと思い、調べました。

結論

以下の通りです。

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.

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

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としか書かれていませんが、DISCONNECTFAILED_CONNECTも記録されるようです。冒頭の例1でも、DISCONNECTが記録されたことが確認できています。1

クエリ関連のイベントの例
[timestamp],[serverhost],[username],[host],[connectionid],[queryid],QUERY,[database],[object], [retcode]
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

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によってマネージされている領域であるため、ユーザーが意識する必要無し、ということでオプショングループの設定対象に含まれていないのだろうと考えます。

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を見て「あれ?」と思ったことも書きたかったのですが、それはまた次回にでも。


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

関連キーワード

この記事をシェアする

Facebook Twitter LINE はてなブックマーク

この記事を読んだ方に
おすすめの記事