Aurora MySQL アドバンスト監査ログ出力
Auroraで特定のDBユーザの操作を監査ログで出力する。
公式Documentを元に設定していく。
準備
まずはRDSクラスタ、パラメータグループ、ユーザを作成する。
VPCに接続用インスタンスを作成するのがめんどくさかったので、パブリックアクセスを有効化した。
- クラスタ & インスタンス設定
項目 | 値 |
---|---|
クラスタ名 | test-db |
エンジンバージョン | 8.0.mysql_aurora.3.02.1 |
マスターユーザ | test |
インスタンスクラス | db.t4g.medium |
可用性 | Auroraレプリカを作成しない |
パブリックアクセス | あり |
セキュリティグループ | 開発PCからの3306を許可したものを設定 |
ログのエクスポート | 監査ログにチェック |
- クラスタパラメータグループ設定
audit
という名前のユーザが行った操作を監査ログに出力するように設定する。
設定項目は以下の通り。
項目 | 値 |
---|---|
server_audit_logging | 1 |
server_audit_logs_upload | 1 |
server_audit_incl_users | audit |
server_audit_events | QUERY |
ちなみに、server_audit_events
にCONNECTを追加すると、
DBへの接続・切断イベントも記録されるようになるが、
こちらはユーザの指定ができず、全ユーザのものがログ出力される。
- ユーザ作成
$ mysql -u test -h <クラスタエンドポイント> -p
mysql> CREATE USER audit@'%' IDENTIFIED BY 'audit';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON test.* TO audit@'%';
確認
variable 確認
show variables
で設定内容を確認。
mysql> SHOW VARIABLES LIKE 'server_audit%';
+------------------------------+-----------------+
| Variable_name | Value |
+------------------------------+-----------------+
| server_audit_cw_upload | OFF |
| server_audit_events | QUERY,QUERY_DML |
| server_audit_excl_users | |
| server_audit_incl_users | audit |
| server_audit_logging | ON |
| server_audit_mode | 0 |
| server_audit_query_log_limit | 65536 |
+------------------------------+-----------------+
7 rows in set (0.01 sec)
なぜかserver_audit_cw_upload
がOFFになっているが、、、
とりあえずパラメータグループの内容は反映されているっぽい(cwlogのやつ以外)。
クエリ実行してみる
$ mysql -u audit -h <クラスタエンドポイント> -paudit
mysql> CREATE TABLE test.audit_test (id int, text varchar(10));
mysql> INSERT INTO test.audit_test VALUES (1, 'test');
mysql> SELECT * FROM test.audit_test;
+------+------+
| id | text |
+------+------+
| 1 | test |
+------+------+
2 rows in set (0.01 sec)
CloudWatch Logs を確認
特にしていなければロググループに/aws/rds/cluster/<クラスタ名>/audit
というグループができている。
中を見てみると、<インスタンス名>.audit.log.x
みたいなログストリームができている。
ログを確認すると、下記のようにQUERYが記録されていることが確認できる。
1667508480539207,<インスタンス名>,audit,<接続元IP>,15659,QUERY,test,'create table audit_test',4028
1667508596853240,<インスタンス名>,audit,<接続元IP>,16684,QUERY,test,'insert audit_test values(1, \'test\')',0
1667511851715505,<インスタンス名>,audit,<接続元IP>,15617,QUERY,,'SELECT * from test.audit_test',0
以上!
server_audit_cw_upload の設定が OFF になったままなのが引っかかったが、
問題なく特定ユーザの特定クエリを監査ログとしてCloudWatchLogsにログ転送できた。
後片付けは忘れずに。。。