GuardDuty の AnomalousBehavior 系検出を深掘る
概要
GuardDuty は機械学習によって CloudTrail の API 実行履歴を分析し普段の動作のベースラインを構築します。このベースラインと比較して逸脱したと判断された API コールは AnomalousBehavior 系の検出結果タイプとして検出されます。
AnomalousBehavior 系の JSON 形式の検出結果では service.additionalInfo に重要な情報が含まれていますが公開情報があまりないのが現状です。検出結果のスキーマでも service.additionalInfo にどのような情報が含まれるか具体な情報は定義されていません。
本記事では、AnomalousBehavior 系の検出がどのような情報を持っていて、JSON 形式の検出結果に対してどのように調査・分析できるかを紹介します。なお、これらの情報をドキュメントに明記してほしい旨は、すでに AWS にフィードバック済です。
スコープ
本記事では以下の検出結果タイプについて扱います。RDS Protection と EKS Protection の AnomalousBehavior 系検出についてはスコープ外とします。
// IAM の検出結果タイプ
CredentialAccess:IAMUser/AnomalousBehavior
DefenseEvasion:IAMUser/AnomalousBehavior
Discovery:IAMUser/AnomalousBehavior
Exfiltration:IAMUser/AnomalousBehavior
Impact:IAMUser/AnomalousBehavior
InitialAccess:IAMUser/AnomalousBehavior
Persistence:IAMUser/AnomalousBehavior
PrivilegeEscalation:IAMUser/AnomalousBehavior
// S3 Protection の検出結果タイプ
Discovery:S3/AnomalousBehavior
Exfiltration:S3/AnomalousBehavior
Impact:S3/AnomalousBehavior.Delete
Impact:S3/AnomalousBehavior.Permission
Impact:S3/AnomalousBehavior.Write
調査の進め方
基本方針
- 検出結果タイプに関するドキュメントを確認する。
- 検出結果の詳細を深掘る。
- 該当の API コールが ユーザーの意図した操作かどうか を確認する。 場合によっては、ユーザーの操作に関係なく、AWS サービスが裏側で自動的に API コールしている場合もある。
- より詳細を調べたい場合は、以下の情報を合わせて確認する。
- 検出されたアクティビティの期間における CloudTrail イベントログ(
service.eventFirstSeenとservice.eventLastSeenの間)
- 検出されたアクティビティの期間における CloudTrail イベントログ(
深掘る際に注目する項目
JSON 形式の GuardDuty の検出結果には、以下のような情報が含まれます。分析や対策を検討する際には特に service.additionalInfo に注目するのがポイントです。
-
resource.accessKeyDetails.userName
不審な API コールの実行ユーザー名 -
resource.accessKeyDetails.userType
ユーザーのタイプ (IAM ユーザー / AWS Service など) -
service.additionalInfo
ベースライン情報および逸脱した行動の詳細- anomalousAPIs: 不審と判断された API 呼び出し(API コールの成否を含む)
- profiledBehavior: ベースラインとして、普段実行されている API や UserAgent の情報
- unusualBehavior: ベースラインから逸脱していると判断された要素
- service.eventFirstSeen / service.eventLastSeen : 不審なアクティビティが初めて確認された時刻、および最後に確認された時刻
AnomalousBehavior 系検出結果の分析例
具体的に GuardDuty が出力する検出結果 JSON における service.additionalInfo の例を見てみましょう。以下のような service.additionalInfo が含まれている場合、次のように読み解くことができます。
When
-
期間:
service.eventFirstSeenからservice.eventLastSeenまでの間
Where
- AWS アカウント: 検出が発生したアカウント
- リージョン: 検出が発生したリージョン
Who
-
ユーザー:
resource.accessKeyDetails.userName
What
-
コールした API:
service.additionalInfo.anomalousAPIs
ここでは該当 API のコール結果 (例:success) も含まれる
->
BatchGetBuilds と DescribeAlarms の API コールが成功した
Why
-
なぜ検出されたのか:
service.additionalInfo.unusualBehavior
GuardDuty によって「ベースラインから外れている」と判断された要素が表示される-
isUnusualUserIdentity: ベースラインから逸脱した(普段操作されない)ユーザーか -
unusualAPIsAccountProfiling: アカウントのベースラインから逸脱した(普段コールされない API) API -
unusualASNsAccountProfiling: アカウントのベースラインから逸脱した ISP(ASN) -
unusualUserNamesAccountProfiling: アカウントのベースラインから逸脱したユーザー名
-
->
BatchGetBuilds と DescribeAlarms API が ISP Softbank BB Corp から example_user によって実行された動作がベースラインから逸脱したため
{
"anomalies": {
"anomalousAPIs": "codebuild.amazonaws.com:[BatchGetBuilds:success] , monitoring.amazonaws.com:[DescribeAlarms:success] , ..."
},
"profiledBehavior": {
"frequentProfiledAPIsAccountProfiling": "GetBucketAcl , DescribeAccountAttributes , ...",
"frequentProfiledUserAgentsAccountProfiling": "AWS Service",
"frequentProfiledUserNamesAccountProfiling": "cloudtrail.amazonaws.com , AWSServiceRoleForTrustedAdvisor",
"frequentProfiledUserTypesAccountProfiling": "AWS_SERVICE , ASSUMED_ROLE",
...
},
"type": "default",
"unusualBehavior": {
"isUnusualUserIdentity": "true",
"unusualAPIsAccountProfiling": "BatchGetBuilds , DescribeAlarms , ...",
"unusualASNsAccountProfiling": "asnNumber: 17676 asnOrg: Softbank BB Corp.",
"unusualUserNamesAccountProfiling": "example_user"
},
"userAgent": {
"fullUserAgent": "AWS Internal",
"userAgentCategory": "AWS Internal"
}
}
参考情報
マネジメントコンソールから見た場合、service.additionalInfo の情報がどのようなパラメータとして表示されるかの記載:
マネジメントコンソールから、AnomalousBehavior の検出を調査する方法:
Discussion