Amazon Auroraの監査ログをCloudWatch Logsへ出力できるようになりました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

Auroraではパフォーマンス影響が少ない監査ログを出力することができます。

今までは各Auroraインスタンスのローカルに保存されていましたが、CloudWatch Logsへ出力することができるようになりました!

Monitoring Amazon Aurora Audit Events with Amazon CloudWatch

Auroraの監査ログ

詳しくはこちらのエントリーに書いていますが、通常のMySQLやMariaDBの監査ログと比較してパフォーマンスの影響が少ないことが特徴の監査ログです。しかし、各インスタンスのローカルに保存されていて、内容を確認するためにはコンソールからダウンロードしたり、aws rds download-db-log-file-portionコマンドを使用する必要がありました。

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

今回CloudWatch Logsに出力できるようになったため、監査ログの監視がやりやすくなり、長期保存も簡単になりました。

試してみる

Auroraの監査ログをCloudWatch Logsに出力して、内容を監視して通知を行ってみます。

Auroraの監査ログの設定

CloudWatch Logs用のIAM Roleの作成

Aurora用のIAM Roleの作成はこちらも参考になります。

IAMの画面から左のメニューでポリシーを開き、ポリシーの作成をクリックします。 ポリシーを作成します。Policy Generatorを選択します。

IAM_Management_Console

アクセス許可の編集で以下の内容を設定します。

|効果|アクション|リソース| |---|---|---| |Allow|logs:CreateLogGroup logs:PutRetentionPolicy|arn:aws:logs:*:*:log-group:/aws/rds/* |Allow|logs:CreateLogStream logs:DescribeLogStreams logs:GetLogEvents logs:PutLogEvents|arn:aws:logs:*:*:log-group:/aws/rds/*:log-stream:*|

IAM_Management_Console

内容を確認してポリシーを作成します。

IAM_Management_Console

IAMの画面から左のメニューでロールを開き、ロールの作成をクリックします。

AWS サービスRDSを選択します。

IAM_Management_Console

ユースケースの選択RDSを選択して先に進みます。

IAM_Management_Console

ここではポリシーを設定せずに先に進みます。なお設定されている権限は不要なので後で消します。

IAM_Management_Console

ロールを作成します。

IAM_Management_Console

作成Roleを選択して、既存のポリシーをデタッチします。

IAM_Management_Console

ポリシーのアタッチをクリックします。

IAM_Management_Console2

先ほど作成したポリシーをアタッチします。

IAM_Management_Console

これでRoleにポリシーがアタッチされました。

IAM_Management_Console

Auroraの構築

次にAuroraを構築します。

監査ログをCloudWatch Logsへ出力するためのDBパラメータグループの設定を行います。

パラメータグループのメニューを開きパラメータグループの作成をクリックします。そして、以下の内容でクラスタパラメータグループを作成します。

項目 内容 備考
パラメータグループファミリー aurora5.6
タイプ DB Cluster Parameter Group
グループ名 aurora-audit-1 内容は任意です
説明 Parameter Group for Aurora Audit 内容は任意です

RDS_·_AWS_Console

選択したクラスタパラメータグループを選択して、パラメータの編集をクリックします。

監査ログ関連のパラメータを以下のように編集して保存します。

名前 値の編集 備考
server_audit_events CONNECT, QUERY, QUERY_DCL, QUERY_DDL, QUERY_DML, TABLE 全ての監査ログを出力
server_audit_excl_users 全ユーザを対象
server_audit_incl_users 全ユーザを対象
server_audit_logging 1 監査ログの有効化
server_audit_logs_upload 1 <-New CloudWatcg Logsへのアップロードを有効にします
aws_default_logs_role arn:aws:iam::123456789012:role/aurora-audit <-New 作成したIAM RoleのARN

RDS_·_AWS_Console

Auroraを起動します。起動時に作成したDBクラスタパラメータグループを設定します。

Auroraを起動したら、メニューのクラスターで起動したAuroraクラスタを選択して、IAM ロールの管理をクリックします。

RDS_·_AWS_Console

作成したIAM Roleを設定して完了します。

RDS_·_AWS_Console

CloudWatch Logsを確認するとロググループが作成されています。ロググループ名は/aws/rds/cluster/&lt;Auroraクラスタ名&gt;/auditとなります。

CloudWatch_Management_Console

ログストリームは&lt;Auroraインスタンス名&gt;.audit.log.X.YYYY-MM-DD-HH-MI.0.Xの形式で出力されるようです。

CloudWatch_Management_Console

監査ログの監視設定

log2snslogs2sns.ymlを使用します。log2snsについては、こちらのエントリーを御覧ください。

CloudWatch LogsのLambdaによるログ監視

今回はログイン失敗を監視したいので、パラメータを以下で設定しました。

パラメータ 設定内容 備考
FilterPattern /,FAILED_CONNECT,/ 監視する正規表現
FilterPatternExcluded /$^/ 監視を除外する正規表現
MailSubject Aurora Login Failure メールのタイトル
NotifyTopicName AuroraAuditNotifyTopic SNSトピックの名前

新しいスタックの作成

log2snsのCloudFormationスタックを作成したら、作成したSNSトピックにメール通知を登録します。

通知する

CloudWatch Logsで監査ログのロググループを選択して、Lambda サービスへのストリーミングの開始をクリックします。

CloudWatch_Management_Console_と_投稿の編集_‹_Developers_IO_—_WordPress

log2snsのLambdaを選択します。

CloudWatch_Management_Console

ログの形式をその他にします。今回は特にフィルタんリングを設定せずに先に進めます。

CloudWatch_Management_Console

内容を確認してストリーミングを開始します。

CloudWatch_Management_Console

Auroraのログインを失敗してみます。存在しないユーザFAILUSERでログインを試みますが、ログインに失敗します。

$ mysql -u FAILUSER -p -h mycluster-audit.cluster-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com
Enter password:
ERROR 1045 (28000): Access denied for user 'FAILUSER'@'172.31.26.6' (using password: NO)

すると、こんなメールが届きます。FAILUSERユーザでFAILED_CONNECTになっていることが分かります。

Aurora_Login_Failure_-_hajime_g86_gmail_com_-_Gmail

さいごに

今までは監査ログはaws rds download-db-log-file-portionコマンドで定期的にダウンロードする必要があり、内容の差分も取れないので、監視が難しい状態でした。CloudWatch Logsへ出力できるようになって監視や長期保存が簡単に行えるようになりました。

今後はAurora以外のDBエンジンや、監査ログ以外のログもCloudWatch Logsへ出力できるようになってくれたら、より監視が楽になるのでアップデートを期待しています!