CloudWatch Logs Insights で監査ログの分析をしてみる #reinvent

CloudWatch Logs Insights を使って CloudTrail の監査系ログを分析。
2018.12.17

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

こんにちは、吉井です。
ご機嫌いかがでしょうか。

先日の re:Invent 2018 で CloudWatch Logs Insights がリリースされました。
CloudWatch Logs に溜まったデータから欲しい情報をパッと見たい!! と思っている方も多かったと思います。
CloudWatch Logs Insights はそれらの分析や可視化を行うことが可能です。

試してみる前に

突然ですが、弊社には insightwatch (インサイトウォッチ)というプロダクトがございます。
このプロダクトにはセキュリティチェック機能があります。
さらに、クラスメソッドメンバーズにご加入頂いてるお客様には
CIS ベンチマークに準拠したモニタリング設定を簡単に行える CloudFormation テンプレートを提供しております。

AWSを使うときに確認すべき52のセキュリティチェック項目と15分でできる簡単なチェックの方法

監査という観点で考えると、必須であるモニタリング設定が含まれています。
例えば、セキュリティグループが変更されるとメール通知がなされます。
メール本文を見てから、CloudWatch Logs や CloudTrail を確認しますが、
多少の熟練が必要な感は否めません。

試してみた

新しくリリースされた CloudWatch Logs Insights でこれらの分析を容易にしてみます。
CloudFormation テンプレートで提供されている「3.10 セキュリティグループ変更に対するアラーム通知設定」の
通知が来た前提で試してみたいと思います。

まずは AWS マネジメントコンソールから CloudWatch を開きます。
左側メニューから インサイト をクリックし、CloudTrail/DefaultLogGroup を選択します。
クエリ入力欄に以下を貼り付けて クエリの実行 をクリックします。

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "AuthorizeSecurityGroupIngress"
or eventName = "AuthorizeSecurityGroupEgress"
or eventName = "RevokeSecurityGroupIngress"
or eventName = "RevokeSecurityGroupEgress"
or eventName = "CreateSecurityGroup"
or eventName = "DeleteSecurityGroup"

分析結果が表示されました。
画面例では左から、変更が行われた時間、AWS リージョン、変更した端末の IP アドレス、ユーザーエージェント、変更したユーザーが表示されています。
cm-yoshii.ryo というユーザーが東京リージョンのリソースに対して
マネジメントコンソールから何かをしたようです。

さらに左にある三角形をクリックして詳細を展開してみます。
このユーザーはセキュリティグループを削除したことが解ります。

ダッシュボードに保存

毎回毎回クエリ文を貼り付けるのは手間なのでダッシュボードに保存しておきます。
画面上部にある ダッシュボードに追加 ボタンをクリックします。
ダッシュボードの選択(既存が無ければ新規作成)、タイトル名の記入、プレビューの確認をし、ダッシュボードに追加します。
左側メニューの ダッシュボード に今追加したダッシュボードが表示されていると思います。

サンプル

いかがでしょうか。
CloudWatch Logs の分析が容易になったと感じて頂けましたでしょうか。
ついでなので CIS 3.1~3.15までのクエリを記載しておきます。

3.1 許可されていないAPIコールに対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter errorCode = "*UnauthorizedOperation" 
or errorCode = "AccessDenied*"

3.2 MFAなしでのAWSマネージメントコンソールログインに対して、アラーム通知設定されていること

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "ConsoleLogin" 
and additionalEventData.MFAUsed != "Yes"
and responseElements.ConsoleLogin != "Failure"
and userIdentity.principalId != "*@classmethod*"

3.3 rootアカウントの利用に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter userIdentity.type = "Root" 
and eventType != "AwsServiceEvent"

3.4 IAMポリシーの変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventSource = "iam.amazonaws.com"
and (eventName like /^Delete/
or eventName like /^Put/
or eventName like /^Create/
or eventName like /^Attach/
or eventName like /^Detach/)

3.5 CloudTrail設定の変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "CreateTrail"
or eventName = "UpdateTrail"
or eventName = "DeleteTrail"
or eventName = "StartLogging"
or eventName = "StopLogging"

3.6 AWSマネージメントコンソールのログイン失敗に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "ConsoleLogin"
and errorMessage = "Failed authentication")

3.7 KMSマスターキーの無効化またはスケジュール削除に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventSource = "kms.amazonaws.com" 
and (eventName = "DisableKey"
or eventName = "ScheduleKeyDeletion")

3.8 S3バケットポリシー変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventSource = s3.amazonaws.com 
and (eventName = "PutBucketAcl"
or eventName = "PutBucketPolicy"
or eventName = "PutBucketCors"
or eventName = "PutBucketLifecycle"
or eventName = "PutBucketReplication"
or eventName = "DeleteBucketPolicy"
or eventName = "DeleteBucketCors"
or eventName = "DeleteBucketLifecycle"
or eventName = "DeleteBucketReplication")

3.9 AWS Config変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventSource = "config.amazonaws.com"
and (eventName = "StopConfigurationRecorder"
or eventName = "DeleteDeliveryChannel"
or eventName = "PutDeliveryChannel"
or eventName = "PutConfigurationRecorder")

3.10 セキュリティグループ変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "AuthorizeSecurityGroupIngress"
or eventName = "AuthorizeSecurityGroupEgress"
or eventName = "RevokeSecurityGroupIngress"
or eventName = "RevokeSecurityGroupEgress"
or eventName = "CreateSecurityGroup"
or eventName = "DeleteSecurityGroup"

3.11 ネットワークACL変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "CreateNetworkAcl"
or eventName = "CreateNetworkAclEntry"
or eventName = "DeleteNetworkAcl"
or eventName = "DeleteNetworkAclEntry"
or eventName = "ReplaceNetworkAclEntry"
or eventName = "ReplaceNetworkAclAssociation"

3.12 インターネットゲートウェイ変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "CreateCustomerGateway"
or eventName = "DeleteCustomerGateway"
or eventName = "AttachInternetGateway"
or eventName = "CreateInternetGateway"
or eventName = "DeleteInternetGateway"
or eventName = "DetachInternetGateway"

3.13 ルートテーブル変更に対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "CreateRoute"
or eventName = "CreateRouteTable"
or eventName = "ReplaceRoute"
or eventName = "ReplaceRouteTableAssociation"
or eventName = "DeleteRouteTable"
or eventName = "DeleteRoute"
or eventName = "DisassociateRouteTable"

3.14 VPC変更に対してに対するアラーム通知設定

fields @timestamp, awsRegion, sourceIPAddress, userAgent, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = "CreateVpc"
or eventName = "DeleteVpc"
or eventName = "ModifyVpcAttribute"
or eventName = "AcceptVpcPeeringConnection"
or eventName = "CreateVpcPeeringConnection"
or eventName = "DeleteVpcPeeringConnection"
or eventName = "RejectVpcPeeringConnection"
or eventName = "AttachClassicLinkVpc"
or eventName = "DetachClassicLinkVpc"
or eventName = "DisableVpcClassicLink"
or eventName = "EnableVpcClassicLink"

クエリが保存できるようになると良いですね。
アップデートに期待します。

参考

Analyze Log Data with CloudWatch Logs Insights