この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ウィスキー、シガー、パイプをこよなく愛する大栗です。
先日RDSでMySQLとMariaDBで監査ログに対応したので、ご紹介します。
MariaDB audit plug-in now available for RDS MySQL and MariaDB
DBの監査
RDSの各DBエンジンでは、以下の表のように監査機能をサポートしています。今回はMySQLとMariaDBでMariaDB社が開発しているMariaDB Audit Pluginに対応しました。
DBエンジン | 監査機能 | 備考 |
---|---|---|
Aurora | ✕ | 無し。 |
MySQL | ○ (new!) | MariaDB Audit Pluginをサポート。 5.6.29以降と5.7.11以降で使用可能です。 |
MariaDB | ○ (new!) | MariaDB Audit Pluginをサポート。 |
PostgreSQL | △ | log_statementの内容。pg_auditは未サポート。 |
Oracle | ○ | DBA監査やファイングレイン監査をサポート。 |
SQL Server | ✕ | SQL Server Auditは未サポート。 |
MariaDB Audit Pluginを設定してみる
今回はMySQL 5.7.11を使用します。補足ですが、5.7.11はdefault_password_lifetimeのデフォルト値が0になっているリバージョンです。
オプショングループの作成
MariaDB Audit Pluginの設定はオプショングループで行うため、まずオプショングループを作成します。オプショングループの画面でグループの作成
をクリックします。
事前に作成されているdefault:
で始まるオプショングループは内容を変更できないため、別途作成して下さい。
今回はMySQL 5.7.11で起動するため、MySQL 5.7を選択します。
作成したオプショングループを編集します。
まず、オプションでMARIADB_AUDIT_PLUGIN
を選択すると、以下のようにMariaDB Audit Pluginの設定項目が表示されます。ここで、内容を設定します。
今回は、下表のように設定します。今回はデフォルトの状態からSERVER_AUDIT_EVENTS
の設定にTABLE
を追加しています。
設定内容の詳細やデフォルト値はAppendix: Options for MySQLやServer_Audit System Variablesを参照して下さい。
オプション設定 | 値 | 備考 |
---|---|---|
SERVER_AUDIT_EVENTS | CONNECT,QUERY,TABLE | 監査する対象のイベントです。 |
SERVER_AUDIT_INCL_USERS | 監査対象とするユーザです。 | |
SERVER_AUDIT_EXCL_USERS | 監査対象外とするユーザです。 | |
SERVER_AUDIT_FILE_ROTATE_SIZE | ログファイルがローテーションするサイズ制限です。 | |
SERVER_AUDIT_FILE_ROTATIONS | 保存する世代数数です。 | |
SERVER_AUDIT_LOGGING | ON | ログが有効化を決めます。変更不能。 |
SERVER_AUDIT_FILE_PATH | /rdsdbdata/log/audit/ | ログファイルの場所です。変更不能。 |
SERVER_AUDIT | FORCE_PLUS_PERMANENT | この設定はセキュリティのために有効になっており、プラグイン実行時にアンインストールができないことを保証しています。変更不能。 |
MariaDB Audit Plugin 1.2.0からはserver_audit_events
に設定できる値としてQUERY_DDL
とQUERY_DML
が追加されていますが、RDSでは使用できないようです。
RDS for MySQLの起動
ここでは、DBエンジンのバージョンで5.7.11
を選択します。
なお、2016年5月2日現在では、コンソールのデフォルト値が「5.6.27」なのでMariaDB Audit Pluginが使用できないバージョンです。ご注意下さい。
オプショングループで、先ほど作成した物を設定します。
監査ログを試す
MySQLにログインして内容を確認します。
まずPluginを確認しましょう。server_audit.so
がインストールされていることが確認できます。
mysql> show plugins;
+----------------------------+----------+--------------------+-----------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+-----------------+---------+
(中略)
| SERVER_AUDIT | ACTIVE | AUDIT | server_audit.so | GPL |
+----------------------------+----------+--------------------+-----------------+---------+
46 rows in set (0.01 sec)
次にMariaDB Audit Pluginのシステム変数を確認します。server_audit_loc_info
はドキュメントにも記載がないため不明です。
mysql> SHOW GLOBAL VARIABLES LIKE 'server_audit%'\G
*************************** 1. row ***************************
Variable_name: server_audit_events
Value: CONNECT,QUERY,TABLE
*************************** 2. row ***************************
Variable_name: server_audit_excl_users
Value:
*************************** 3. row ***************************
Variable_name: server_audit_file_path
Value: /rdsdbdata/log/audit/
*************************** 4. row ***************************
Variable_name: server_audit_file_rotate_now
Value: OFF
*************************** 5. row ***************************
Variable_name: server_audit_file_rotate_size
Value: 1000000
*************************** 6. row ***************************
Variable_name: server_audit_file_rotations
Value: 9
*************************** 7. row ***************************
Variable_name: server_audit_incl_users
Value:
*************************** 8. row ***************************
Variable_name: server_audit_loc_info
Value: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
*************************** 9. row ***************************
Variable_name: server_audit_logging
Value: ON
*************************** 10. row ***************************
Variable_name: server_audit_mode
Value: 1
*************************** 11. row ***************************
Variable_name: server_audit_output_type
Value: file
*************************** 12. row ***************************
Variable_name: server_audit_query_log_limit
Value: 1024
*************************** 13. row ***************************
Variable_name: server_audit_syslog_facility
Value: LOG_USER
*************************** 14. row ***************************
Variable_name: server_audit_syslog_ident
Value: mysql-server_auditing
*************************** 15. row ***************************
Variable_name: server_audit_syslog_info
Value:
*************************** 16. row ***************************
Variable_name: server_audit_syslog_priority
Value: LOG_INFO
16 rows in set (0.00 sec)
次に一度テーブルを作成して、Selectをしてみます。
mysql> create table mydb.sample(id int, value varchar(32));
Query OK, 0 rows affected (0.02 sec)
mysql> select * from mydb.sample;
Empty set (0.00 sec)
次に監査ログを確認します。マネージメントコンソールのログの画面でaudit/server_audit.log
をダウンロードします。
ログの内容を確認する。
ログファイルでログインしたユーザの内容を確認してみます。先ほど実行したcreate文やselect文が出力されています。DDLやDMLの内容も出力されます。
$ grep awsuser ./server_audit_2.log
20160502 10:46:56,ip-10-7-0-127,awsuser,172.31.4.158,14,0,CONNECT,,,0
20160502 10:46:56,ip-10-7-0-127,awsuser,172.31.4.158,14,404,QUERY,,'select @@version_comment limit 1',0
20160502 10:47:52,ip-10-7-0-127,awsuser,172.31.4.158,14,433,QUERY,,'mysql show variables like \'server_audit_%\'',1064
20160502 10:48:01,ip-10-7-0-127,awsuser,172.31.4.158,14,444,QUERY,,'mysql show variables like \'server_audit%\'',1064
20160502 10:48:19,ip-10-7-0-127,awsuser,172.31.4.158,14,451,QUERY,,'mysql show variables like \'server_audit_events\'',1064
20160502 10:48:37,ip-10-7-0-127,awsuser,172.31.4.158,14,468,QUERY,,'show variables like \'server_audit_events\'',0
20160502 10:48:44,ip-10-7-0-127,awsuser,172.31.4.158,14,469,QUERY,,'show variables like \'server_audit_%\'',0
20160502 11:01:16,ip-10-7-0-127,awsuser,172.31.4.158,14,884,QUERY,,'show plugins',0
20160502 11:03:07,ip-10-7-0-127,awsuser,172.31.4.158,14,935,QUERY,,'show variables like \'%AUDIT%\'',0
20160502 11:06:38,ip-10-7-0-127,awsuser,172.31.4.158,14,0,DISCONNECT,,,0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,0,CONNECT,mydb,,0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,1083,QUERY,mydb,'show databases',0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,1084,QUERY,mydb,'show tables',0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,1085,QUERY,mydb,'select @@version_comment limit 1',0
20160502 11:07:50,ip-10-7-0-127,awsuser,172.31.4.158,19,1092,QUERY,mydb,'show plugins',0
20160502 11:08:01,ip-10-7-0-127,awsuser,172.31.4.158,19,1103,QUERY,mydb,'show variables like \'server_audit_%\'',0
20160502 11:18:51,ip-10-7-0-127,awsuser,172.31.4.158,19,1454,QUERY,mydb,'SHOW GLOBAL VARIABLES LIKE \'server_audit%\'',0
20160502 11:19:01,ip-10-7-0-127,awsuser,172.31.4.158,19,1465,QUERY,mydb,'SHOW GLOBAL VARIABLES LIKE \'server_audit%\'',0
20160502 11:25:08,ip-10-7-0-127,awsuser,172.31.4.158,19,1665,QUERY,mydb,'create table mydb.sample(id int, value varchar(32))',0
20160502 11:25:19,ip-10-7-0-127,awsuser,172.31.4.158,19,1672,QUERY,mydb,'select * from mydb.sample',0
20160502 11:29:09,ip-10-7-0-127,awsuser,172.31.4.158,19,0,DISCONNECT,mydb,,0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,0,CONNECT,mydb,,0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,1793,QUERY,mydb,'show databases',0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,1794,QUERY,mydb,'show tables',0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,1796,QUERY,mydb,'select @@version_comment limit 1',0
20160502 11:31:37,ip-10-7-0-127,awsuser,172.31.4.158,24,0,DISCONNECT,mydb,,0
rdsadminが実行している内容を確認する
今度はRDSの管理ユーザであるrdsadmin
が実行している内容を確認してみましょう。ログの先頭ではMariaDB Audit Pluginをインストールしていることろからログが開始されています。
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,1,QUERY,,'install plugin server_audit soname "server_audit.so"',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,2,QUERY,,'SELECT 1',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,3,QUERY,,'SET GLOBAL server_audit_file_path=\'/rdsdbdata/log/audit/\'',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,3,QUERY,,'SET GLOBAL server_audit_file_path=\'/rdsdbdata/log/audit/\'',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,4,QUERY,,'SELECT 1',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,5,QUERY,,'SET GLOBAL server_audit_events=\'CONNECT,QUERY,TABLE\'',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,6,QUERY,,'SELECT 1',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,7,QUERY,,'SET GLOBAL server_audit_logging=ON',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,8,QUERY,,'SELECT 1',0
(中略)
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,828,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,829,QUERY,,'select name from mysql.plugin',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,830,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,831,QUERY,,'SELECT count(*) from mysql.rds_history WHERE action = \'disable set master\' ORDER BY action_timestamp LIMIT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,832,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,833,QUERY,,'SELECT count(*) from mysql.rds_replication_status WHERE master_host IS NOT NULL and master_port IS NOT NULL ORDER BY action_timestamp LIMIT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,834,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,835,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,836,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,837,QUERY,,'select name from mysql.plugin',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,838,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,839,QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,840,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,841,QUERY,,'SELECT value FROM mysql.rds_heartbeat2',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,842,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,843,QUERY,,'select @@session.tx_read_only',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,844,QUERY,,'flush logs',0
(中略)
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,949,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,950,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,951,QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,952,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,953,QUERY,,'SELECT value FROM mysql.rds_heartbeat2',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,954,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,955,QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,956,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,957,QUERY,,'select @@session.tx_read_only',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,958,QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187025005) ON DUPLICATE KEY UPDATE value = 1462187025005',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,959,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,960,QUERY,,'select @@session.tx_read_only',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,961,QUERY,,'COMMIT',0
(略)
つぎにrdsadminが何をしているのか探ってみましょう。ちょっとシェル芸をして、監査ログを集計してみます。
$ grep rdsadmin ./server_audit_2.log | cut -d',' -f7- | sort | uniq -c | sort -nr
1222 QUERY,,'SELECT 1',0
260 QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
248 QUERY,,'SELECT value FROM mysql.rds_heartbeat2',0
62 QUERY,,'SELECT count(*) from mysql.rds_replication_status WHERE master_host IS NOT NULL and master_port IS NOT NULL ORDER BY action_timestamp LIMIT 1',0
62 QUERY,,'SELECT count(*) from mysql.rds_history WHERE action = \'disable set master\' ORDER BY action_timestamp LIMIT 1',0
50 QUERY,,'select @@session.tx_read_only',0
28 QUERY,,'select name from mysql.plugin',0
13 QUERY,,'flush logs',0
13 QUERY,,'SELECT NAME, VALUE FROM mysql.rds_configuration',0
12 QUERY,,'COMMIT',0
12 DISCONNECT,,,0
12 CONNECT,,,0
2 QUERY,,'SET GLOBAL server_audit_file_path=\'/rdsdbdata/log/audit/\'',0
1 QUERY,,'install plugin server_audit soname "server_audit.so"',0
1 QUERY,,'SET GLOBAL server_audit_logging=ON',0
1 QUERY,,'SET GLOBAL server_audit_events=\'CONNECT,QUERY,TABLE\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000016\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000015\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000014\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000013\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000012\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000011\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000010\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000009\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000008\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000007\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000006\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000005\'',0
1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000004\'',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462188825006) ON DUPLICATE KEY UPDATE value = 1462188825006',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462188525005) ON DUPLICATE KEY UPDATE value = 1462188525005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462188225005) ON DUPLICATE KEY UPDATE value = 1462188225005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187925005) ON DUPLICATE KEY UPDATE value = 1462187925005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187625005) ON DUPLICATE KEY UPDATE value = 1462187625005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187325005) ON DUPLICATE KEY UPDATE value = 1462187325005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187025005) ON DUPLICATE KEY UPDATE value = 1462187025005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462186725005) ON DUPLICATE KEY UPDATE value = 1462186725005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462186425004) ON DUPLICATE KEY UPDATE value = 1462186425004',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462186110005) ON DUPLICATE KEY UPDATE value = 1462186110005',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462185795004) ON DUPLICATE KEY UPDATE value = 1462185795004',0
1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462185480102) ON DUPLICATE KEY UPDATE value = 1462185480102',0
内容を確認すると、5分毎、1分毎、15秒毎にrdsadminが処理を行っていました。
5分毎の処理
以下のようにmysql.rds_heartbeat2
に対するINSERT、バイナリログの削除、プラグインの確認を行っています。
- INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462185480102) ON DUPLICATE KEY UPDATE value = 1462185480102
- PURGE BINARY LOGS TO 'mysql-bin-changelog.000005'
- select name from mysql.plugin
mysql.rds_heartbeat2
に入力している情報は、UNIX時間をミリ秒にしているデータのようです。このデータを元にRead Replicaとのレプリケーション遅延(ReplicaLag)を計測しているのかもしれません。
バイナリログの削除が5分毎なのは、Point In Time Recoveryが5分前まで可能であるためだと思われます。Read Replicaがあり、レプリケーションを止めている時には挙動が変わると思われます。
1分毎の処理
以下のように、mysql.rds_history
とmysql.rds_replication_status
を参照しています。
- SELECT count(*) from mysql.rds_history WHERE action = 'disable set master' ORDER BY action_timestamp LIMIT 1
- SELECT count(*) from mysql.rds_replication_status WHERE master_host IS NOT NULL and master_port IS NOT NULL ORDER BY action_timestamp LIMIT 1
mysql.rds_history
とmysql.rds_replication_status
の内容は、以下の通りになっていました。テーブルの項目や内容から類推すると対象のインスタンスがMasterかRead Replicaかを判定しているようです。
mysql> SELECT * from mysql.rds_history;
+---------------------+--------------------+-------------------+---------------+-------------+-------------+--------------+-----------------+----------------+------------+
| action_timestamp | called_by_user | action | mysql_version | master_host | master_port | master_user | master_log_file | master_log_pos | master_ssl |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+--------------+-----------------+----------------+------------+
| 2016-05-02 10:28:01 | rdsadmin@localhost | enable set master | 5.7.10-log | NULL | NULL | rdsrepladmin | NULL | NULL | NULL |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+--------------+-----------------+----------------+------------+
1 row in set (0.00 sec)
mysql> SELECT * from mysql.rds_replication_status;
+---------------------+--------------------+-------------------+---------------+-------------+-------------+
| action_timestamp | called_by_user | action | mysql_version | master_host | master_port |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+
| 2016-05-02 10:28:00 | rdsadmin@localhost | enable set master | 5.7.11-log | NULL | NULL |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+
1 row in set (0.00 sec)
15秒毎の処理
以下のように、mysql.rds_heartbeat2
の有無と値を確認しています。5分毎挿入しているUNIX時間を確認しているようです。
- SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'rds_heartbeat2'
- SELECT value FROM mysql.rds_heartbeat2
さいごに
MySQLやMariaDB
これらと同様にMySQLベースであるAuroraでも同様にDB Audit Pluginが使用可能になる事を期待してしまいます。そして、今後PostgreSQLでのpg_auditサポートや、SQL ServerでのSQL Server Auditサポートがされれば全てのDBエンジンで監査ログの出力が可能になります。当然AWSとしても現在監査ログが未サポート/一部のみサポートしているDBエンジンについても監査ログの対応を進めていると思われます。
そして、監査ログを有効に活かすためには監査ログの運用方法を決める必要があります。監査ログを保存している事が重要であることもありますが、定期的な確認も重要ですので上手い運用環境を構築する必要が有ることも忘れないで下さい。