Aurora MySQLの監査ログをCloudWatch Logs Insightで確認する

Aurora MySQLの監査ログをCloudWatch Logs Insightで確認する方法をご紹介します。CW Insightでクエリを実行し、監査ログを効率的に確認できます。

パラメーターグループの作成

DBクラスターパラメーターグループを作成します。

パラメータグループを編集します。server_audit_logging1にし、 server_audit_eventsCONNECT, QUERY, QUERY_DCL, QUERY_DDL, QUERY_DML, TABLEとしました。

監査ログから除外するユーザーをserver_audit_excl_usersで指定できます。また、ログに含めるユーザをserver_audit_incl_usersで指定できます。今回はどちらも指定しませんでした。この場合は全てのユーザーが記録されます。

Amazon Auroraの作成

DB クラスターのパラメータグループに作成したパラメーターグループを指定します。

CloudWatch Logsに監査ログをエクスポートします。

CloudWatchロググループへの反映

CloudWatchコンソールを見ると、ロググループ「/aws/rds/cluster/<Auroraクラスタ名>/audit」が作成されます。

ログストリーム名は、<DBインスタンス名>.audit.log.N.YYYY-MM-DD-HH-MI.0.Nの形式です。ログストリームを選択すると、ログを確認できます。

CloudWatch Logs Insightsで確認

CloudWatch Logs Insightsでクエリを実行し、ログを確認します。ロググループと時間を選択します。キャプチャは過去30分を指定していますが、12/1 00:00〜12/2 23:59までといった指定も可能です。ログ20件を時間でソートして表示します。

クエリは以下の通りです。

fields @timestamp, @message
| sort @timestamp desc
| limit 20

クエリ結果は以下のように表示されます。

結果はmarkdownやCSVでエクスポートできます。

ログのパース

@messageとしてまとめて表示されているので、parseしてみます。以下のクエリを実行します。

parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode

ログが各要素ごとに分かれて表示されています。

DBユーザーadminからの接続のみを表示します。

parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode
| filter username = 'admin'

クエリ結果から、CREATE DATABASE mydbCREATE TABLEなどを実行した様子がわかります。

接続元ごとのログ件数を表示します。

parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode
| stats count() by host

接続元ごとのログ件数を表示されました。

簡易的ではありますが、可視化も可能です。時間軸に対するログ件数を表示します。1分ごとのログ件数をグラフにします。

parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode
| stats count () by bin(1m)

グラフは以下のような形です。

まとめ

CloudWatch Logs Insightで監査ログを集計しました。集計は比較的簡単にできますので本記事のクエリを参考にしていただければ幸いです。

検証環境

  • エンジンバージョン:5.7.mysql_aurora.2.07.0

参考