【新機能】Amazon Auroraで監査ログに対応しました
大栗です。
先程RDSのAmazon AuroraでAdvanced Auditingという監査ログ機能に対応したのでご紹介します。
- Amazon Aurora Now Offers Advanced Audit Capability
- Auditing an Amazon Aurora Cluster
- Using Advanced Auditing in an Amazon Aurora DB Cluster
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クラスタパラメータグループを作成します。
作成した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配置にします。
Auroraの詳細設定行います。ここで先程作成したDBクラスタパラメータグループを設定します。
この様にDBインスタンスが2台起動します。
起動したばかりの状態で、各々4個の監査ログファイルが出力されていました。
ログを確認する
正常に接続する
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
最初に接続した時のログでCONNECT
、show 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レコード出力される模様です。
- テーブル作成:
CREATE
とQUERY
の2レコードが出力されました。 - レコード挿入:
WRITE
とQUERY
の2レコードが出力されました。 - レコード参照:
READ
とQUERY
の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ではパフォーマンスの劣化が抑えられています。ストレージ容量を考慮する必要はありますが、要件によっては監査を常時有効化することも検討できるのではないでしょうか。