CloudWatch Logs Insights で監査ログの分析をしてみる #reinvent
こんにちは、吉井です。
ご機嫌いかがでしょうか。
先日の re:Invent 2018 で CloudWatch Logs Insights がリリースされました。
CloudWatch Logs に溜まったデータから欲しい情報をパッと見たい!! と思っている方も多かったと思います。
CloudWatch Logs Insights はそれらの分析や可視化を行うことが可能です。
試してみる前に
突然ですが、弊社には insightwatch (インサイトウォッチ)というプロダクトがございます。
このプロダクトにはセキュリティチェック機能があります。
さらに、クラスメソッドメンバーズにご加入頂いてるお客様には
CIS ベンチマークに準拠したモニタリング設定を簡単に行える CloudFormation テンプレートを提供しております。
監査という観点で考えると、必須であるモニタリング設定が含まれています。
例えば、セキュリティグループが変更されるとメール通知がなされます。
メール本文を見てから、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"
クエリが保存できるようになると良いですね。
アップデートに期待します。