【新機能】Amazon Auroraで監査ログに対応しました

Amazon RDS

大栗です。

先程RDSのAmazon AuroraでAdvanced Auditingという監査ログ機能に対応したのでご紹介します。

Advanced Auditingとは

RDSの各DBエンジンでは、以下の表のように監査機能をサポートしています。今回はAurora (MySQL compatibility)で監査ログに対応しました。

DBエンジン 監査機能 備考
Aurora (MySQL compatibility) ○ (new!) Advanced Auditing。バージョン 1.10.1からサポートしている模様。
Aurora (PostgreSQL compatibility) - 不明。
MySQL MariaDB Audit Pluginをサポート。5.6.29以降と5.7.11以降で使用可能です。
MariaDB MariaDB Audit Pluginをサポート。
PostgreSQL log_statementの内容。pgauditやpg_auditは未サポート。
Oracle DBA監査やファイングレイン監査をサポート。
SQL Server SQL Server Auditは未サポート。

Auroraで採用されている監査ログ機能は、他のMySQL互換エンジンで採用しているMariaDB Audit Pluginとは異なる実装の様です。

パフォーマンスへの影響

先日のre:Invent 2016のセッションでもAuroraの監査機能について言及されていました。MySQL 5.7でMariaDB Audit Pluginを使用するとスループットが65%低下しますが、AuroraでAdvanced Auditingを使用するとスループットは15%の低下となっています。

設定内容

Advanced AuditingはDBクラスタパラメータグループで設定します。設定項目は以下の4項目となっています。

項目名 設定可能な値 備考
server_audit_logging 0,1 ログの有効にするか設定します。
server_audit_events Connect, Query, Query_DCL, Query_DDL, Query_DML, Table 監査する対象のイベントです。複数イベントの入力が可能です。
server_audit_excl_users <任意のユーザ名> 監査対象外とするユーザです。複数ユーザの入力が可能です。
server_audit_incl_users <任意のユーザ名> 監査対象とするユーザです。複数ユーザの入力が可能です。空の場合は全てのユーザが対象となります。

server_audit_eventsで設定するイベントの詳細は以下になります。

イベント 出力内容
Connect 接続の成功と失敗を記録します。ユーザー情報が含まれます。
Query 構文や権限のエラーを含めてクエリとクエリ結果を記録します。
Query_DCL Queryと同様ですがDCLクエリ(GRANT、REVOKEなど)のみ記録します。
Query_DDL Queryと同様ですがDDLクエリ(CREATE、ALTERなど)のみ記録します。
Query_DML Queryと同様ですがDMLクエリ(INSERT、UPDATEなど)のみ記録します。
Table クエリの実行で影響を受けたテーブルを記録します。

出力内容

また出力内容がMariaDB Audit Pluginを異なっているので注意が必要です。詳細はドキュメントのAudit Log Detailsを参照して下さい。

  • タイムスタンプがUNIX時間フォーマットになっている。
  • ログイベントは複数ファイルに書き込まれ、ログレコードが順序通りになりません。
  • ログファイルの数はDBインスタンスの数に応じて異なる場合があります。
  • ファイルのローテーションは100MBに固定されています。

Advanced Auditingを設定してみる

Advanced AuditingはDBクラスタパラメータグループで設定します。

DBクラスタパラメータグループの作成

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

RDS_·_AWS_Console

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

まず、パラメータグループのフィルタにserver_auditを入力すると、以下のAdvanced Auditingの設定項目が表示されます。ここでは以下のように設定してみました。

項目名 設定値 備考
server_audit_logging 1 ログの有効化
server_audit_events Connect,Query,Query_DCL,Query_DDL,Query_DML,Table 全てのイベント
server_audit_excl_users <なし> 監査対象外のユーザなし
server_audit_incl_users <なし> 全てのユーザが対象

Auroraの起動

Auroraを起動します。

複数インスタンスを起動したいのでマルチAZ配置にします。

RDS_·_AWS_Console

Auroraの詳細設定行います。ここで先程作成したDBクラスタパラメータグループを設定します。

RDS_·_AWS_Console

この様にDBインスタンスが2台起動します。

RDS_·_AWS_Console

起動したばかりの状態で、各々4個の監査ログファイルが出力されていました。

RDS_·_AWS_Console

RDS_·_AWS_Console

ログを確認する

正常に接続する

DBインスタンスに以下のようにログインしてshow processlistを実行して、終了してみました。

$ mysql -u awsuser -p -h audit-cluster-001.cluster-abcdfeghijk1.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show processlist
    -> ;
+----+----------+-------------------+------+---------+------+----------------------+------------------+
| Id | User     | Host              | db   | Command | Time | State                | Info             |
+----+----------+-------------------+------+---------+------+----------------------+------------------+
| 27 | rdsadmin | localhost         | NULL | Sleep   |    0 | delayed send ok done | NULL             |
| 29 | rdsadmin | localhost         | NULL | Sleep   |    0 | delayed send ok done | NULL             |
| 30 | rdsadmin | localhost         | NULL | Sleep   |   19 | cleaned up           | NULL             |
| 31 | rdsadmin | localhost         | NULL | Sleep   |  128 | delayed send ok done | NULL             |
| 32 | awsuser  | 172.31.8.39:55476 | NULL | Query   |    0 | init                 | show processlist |
+----+----------+-------------------+------+---------+------+----------------------+------------------+
5 rows in set (0.00 sec)

mysql> exit
Bye

すると、以下の様なログが出力されます。このログは複数のログファイルでバラバラに出力されていたものをまとめたものです。

1484262735,aurora-audit,awsuser,172.31.8.39,32,0,CONNECT,,,0
1484262735,aurora-audit,awsuser,172.31.8.39,32,10511,QUERY,,'select @@version_comment limit 1',0
1484262753,aurora-audit,awsuser,172.31.8.39,32,10623,QUERY,,'show processlist',0
1484262756,aurora-audit,awsuser,172.31.8.39,32,0,DISCONNECT,,,0

最初に接続した時のログでCONNECTshow processlistの実行内容のQUERY、接続終了のDISCONNECTと出力されています。select @@version_comment limit 1という内容も出力されていますが

接続エラー

次にパスワードを間違えてログインができなかった場合のログを確認してみます。

$ mysql -u awsuser -p -h audit-cluster-001.cluster-abcdfeghijk1.ap-northeast-1.rds.amazonaws.com
Enter password:
ERROR 1045 (28000): Access denied for user 'awsuser'@'172.31.8.39' (using password: YES)

すると、以下の様なログが出力されます。

1484262764,aurora-audit,awsuser,172.31.8.39,33,0,FAILED_CONNECT,,,1045
1484262764,aurora-audit,awsuser,172.31.8.39,33,0,DISCONNECT,,,0

ログインの失敗がFAILED_CONNECTと出力され、接続終了がDISCONNECTとして出力されます。

テーブル作成、レコード挿入

以下のように、テーブルを作成してレコードを挿入してみます。

$ mysql -u awsuser -p -h audit-cluster-001.cluster-abcdfeghijk1.ap-northeast-1.rds.amazonaws.com mydb
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create table sample1(id int, data varchar(20));
Query OK, 0 rows affected (0.04 sec)

mysql> select * from sample1;
Empty set (0.01 sec)

mysql> insert into sample1(id, data) values(1, 'Ooguri');
Query OK, 1 row affected (0.00 sec)

mysql> select * from sample1;
+------+--------+
| id   | data   |
+------+--------+
|    1 | Ooguri |
+------+--------+
1 row in set (0.03 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from sample1;
+------+--------+
| id   | data   |
+------+--------+
|    1 | Ooguri |
+------+--------+
1 row in set (0.00 sec)

mysql>
mysql> exit;
Bye

出力される監査ログは以下のようになります。

1484265305,aurora-audit,awsuser,172.31.8.39,36,0,CONNECT,mydb,,0
1484265305,aurora-audit,awsuser,172.31.8.39,36,26893,QUERY,mydb,'show databases',0
1484265305,aurora-audit,awsuser,172.31.8.39,36,26894,QUERY,mydb,'show tables',0
1484265305,aurora-audit,awsuser,172.31.8.39,36,26896,QUERY,mydb,'select @@version_comment limit 1',0
1484265311,aurora-audit,awsuser,172.31.8.39,36,26933,CREATE,mydb,sample1,
1484265311,aurora-audit,awsuser,172.31.8.39,36,26933,QUERY,mydb,'create table sample1(id int, data varchar(20))',0
1484265314,aurora-audit,awsuser,172.31.8.39,36,26957,READ,mydb,sample1,
1484265314,aurora-audit,awsuser,172.31.8.39,36,26957,QUERY,mydb,'select * from sample1',0
1484265318,aurora-audit,awsuser,172.31.8.39,36,26985,WRITE,mydb,sample1,
1484265318,aurora-audit,awsuser,172.31.8.39,36,26985,QUERY,mydb,'insert into sample1(id, data) values(1, \'Ooguri\')',0
1484265323,aurora-audit,awsuser,172.31.8.39,36,27019,READ,mydb,sample1,
1484265323,aurora-audit,awsuser,172.31.8.39,36,27019,QUERY,mydb,'select * from sample1',0
1484265328,aurora-audit,awsuser,172.31.8.39,36,27050,QUERY,mydb,'commit',0
1484265332,aurora-audit,awsuser,172.31.8.39,36,27078,QUERY,mydb,'select * from sample1',0
1484265338,aurora-audit,awsuser,172.31.8.39,36,0,DISCONNECT,mydb,,0

テーブル作成やテーブルの読み書きは、コマンドに対して基本的に2レコード出力される模様です。

  • テーブル作成:CREATEQUERYの2レコードが出力されました。
  • レコード挿入:WRITEQUERYの2レコードが出力されました。
  • レコード参照:READQUERYの2レコードが出力されました。ただしコミット後はQUERYレコードのみとなっていました。

ユーザ作成、権限追加/削除

ユーザを作成して、SELECT権限追加、削除してみます。

$ mysql -u awsuser -p -h audit-cluster-001.cluster-abcdfeghijk1.ap-northeast-1.rds.amazonaws.com mydb
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE USER 'auditor'@"%" IDENTIFIED BY "mypassword";
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT SELECT ON mydb.* TO 'auditor'@"%";
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> REVOKE SELECT ON mydb.* FROM 'auditor'@"%";
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

監査ログの結果は以下のように出力されます。内容を確認すると、内部的にmysqlデータベースの権限管理を行っているテーブルを参照していることがわかります。

1484267935,aurora-audit,awsuser,172.31.8.39,37,0,CONNECT,mydb,,0
1484267935,aurora-audit,awsuser,172.31.8.39,37,43690,QUERY,mydb,'show databases',0
1484267935,aurora-audit,awsuser,172.31.8.39,37,43691,QUERY,mydb,'show tables',0
1484267935,aurora-audit,awsuser,172.31.8.39,37,43694,QUERY,mydb,'select @@version_comment limit 1',0
1484267940,aurora-audit,awsuser,172.31.8.39,37,43730,WRITE,mysql,user,
1484267940,aurora-audit,awsuser,172.31.8.39,37,43730,WRITE,mysql,db,
1484267940,aurora-audit,awsuser,172.31.8.39,37,43730,WRITE,mysql,tables_priv,
1484267940,aurora-audit,awsuser,172.31.8.39,37,43730,WRITE,mysql,columns_priv,
1484267940,aurora-audit,awsuser,172.31.8.39,37,43730,WRITE,mysql,procs_priv,
1484267940,aurora-audit,awsuser,172.31.8.39,37,43730,WRITE,mysql,proxies_priv,
1484267940,aurora-audit,awsuser,172.31.8.39,37,43730,QUERY,mydb,'CREATE USER \'auditor\'@\'%\' IDENTIFIED BY PASSWORD *****',0
1484267946,aurora-audit,awsuser,172.31.8.39,37,43764,WRITE,mysql,user,
1484267946,aurora-audit,awsuser,172.31.8.39,37,43764,WRITE,mysql,db,
1484267946,aurora-audit,awsuser,172.31.8.39,37,43764,QUERY,mydb,'GRANT SELECT ON mydb.* TO \'auditor\'@"%"',0
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,READ,mysql,user,
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,READ,mysql,db,
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,READ,mysql,proxies_priv,
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,READ,mysql,tables_priv,
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,READ,mysql,columns_priv,
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,READ,mysql,procs_priv,
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,READ,mysql,servers,
1484267951,aurora-audit,awsuser,172.31.8.39,37,43801,QUERY,mydb,'FLUSH PRIVILEGES',0
1484267957,aurora-audit,awsuser,172.31.8.39,37,43843,WRITE,mysql,user,
1484267957,aurora-audit,awsuser,172.31.8.39,37,43843,WRITE,mysql,db,
1484267957,aurora-audit,awsuser,172.31.8.39,37,43843,QUERY,mydb,'REVOKE SELECT ON mydb.* FROM \'auditor\'@"%"',0
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,READ,mysql,user,
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,READ,mysql,db,
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,READ,mysql,proxies_priv,
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,READ,mysql,tables_priv,
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,READ,mysql,columns_priv,
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,READ,mysql,procs_priv,
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,READ,mysql,servers,
1484267962,aurora-audit,awsuser,172.31.8.39,37,43876,QUERY,mydb,'FLUSH PRIVILEGES',0
1484267969,aurora-audit,awsuser,172.31.8.39,37,0,DISCONNECT,mydb,,0

さいごに

RDBMSで監査ログを有効にすると、一般的に大幅なパフォーマンス劣化を招きます。しかし、Advanced Auditingではパフォーマンスの劣化が抑えられています。ストレージ容量を考慮する必要はありますが、要件によっては監査を常時有効化することも検討できるのではないでしょうか。