【初心者向け】AWS CloudTrail 入門!完全ガイド
AWS CloudTrail
☘️ はじめに
本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。
👀 Contents
- CloudTrail とは
- CloudTrail の基本
- 管理イベント
- データイベント
- CloudTrail ログファイル名の形式
- ログのフォーマット
- 監視する主要なログ
- AWS CloudTrail ログのクエリの Athena による分析
- CloudTrail Lake
- 📖 まとめ
CloudTrail とは
CloudTrail は、AWS アカウントのガバナンス、コンプライアンス、運用監査、リスク監査を行うためのサービスです。
アカウントのアクティビティをログ記録し、継続的にモニタリングできます。
【AWS Black Belt Online Seminar】AWS CloudTrail(YouTube)(59:46)
CloudTrail の基本
CloudTrail で記録できるイベントは次のとおりです。
- 管理イベント
- AWS アカウントのリソースで実行される管理およびネットワーク操作の API アクティビティ
- 例:セキュリティグループの設定をいつ誰が変更したか
- デフォルトで記録されるようになっています
- データイベント
- データリクエスト操作の API アクティビティ
- 例:S3 バケットのデータ操作をいつ誰が行ったか
- デフォルトでは記録が「OFF」になっています
- Insights イベント
- 短期間の過剰な API 呼び出しなど、過去の API 使用状況の機械学習によって得られたデータから 管理イベントの異常な API アクティビティを検出
- デフォルトでは記録が「OFF」になっています
これらの管理イベントは、コンソール上から履歴を参照することが可能で、90 日間の履歴は無料となっています。
それ以上保存しなければならない要件がある場合は、別途 S3 や CloudWatch Logs へエクスポートする設定を行っておく必要があります。
CloudTrail のイベント記録の大部分は、「管理イベント」と「データイベント」になります。
Insights イベントについては、AWS ドキュメント を参照してください。
AWS CloudTrail の開始方法のチュートリアル を実施して、理解を深めるのもおすすめです。
管理イベント
管理イベントは、アカウント内のリソースに対して実行されるすべての管理操作と、ほぼすべての非 API アクションが含まれます。
非 API アクションとは、コンソールへのログイン(AwsConsoleSignIn)などです。
データイベント
AWS IAM ロール、Amazon EC2 インスタンス、Amazon S3 バケット、AWS Lambda 関数などのリソースまたはサービス上または内部で実行される操作が含まれます。
これらの操作は、AWS サービスを利用して構築したシステムの多くの場合で大量のアクティビティが発生するイベントのため、デフォルトでは無効になっています。
CloudTrail ログファイル名の形式
ログファイルは次のような名称で出力されます。
AccountID_CloudTrail_RegionName_YYYYMMDDTHHmmZ_UniqueString.FileNameFormat
S3 にエクスポートした場合は、次のようになります。
111122223333_CloudTrail_us-east-2_20150801T0210Z_Mu0KsOhtH1ar15ZZ.json.gz
ログのフォーマット
ConsoleLogin 時の例です。
{
"eventVersion": "1.08",
"userIdentity": {
"type": "IAMUser",
"principalId": "AIDAAAAAAAAAAAAAAAAAA",
"arn": "arn:aws:iam::111111111111:user/Alice",
"accountId": "111111111111",
"userName": "Alice"
},
"eventTime": "2023-04-05T01:14:33Z",
"eventSource": "signin.amazonaws.com",
"eventName": "ConsoleLogin",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "192.0.2.111",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
"requestParameters": null,
"responseElements": {
"ConsoleLogin": "Success"
},
"additionalEventData": {
"LoginTo": "https://ap-northeast-1.console.aws.amazon.com/console/home?xxxxx",
"MobileVersion": "No",
"MFAIdentifier": "arn:aws:iam::111111111111:mfa/Alice",
"MFAUsed": "Yes"
},
"eventID": "814cde86-2626-41ab-9557-6c7299981035",
"readOnly": false,
"eventType": "AwsConsoleSignIn",
"managementEvent": true,
"recipientAccountId": "111111111111",
"eventCategory": "Management",
"tlsDetails": {
"tlsVersion": "TLSv1.2",
"cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
"clientProvidedHostHeader": "ap-northeast-1.signin.aws.amazon.com"
}
}
よく使いそうな主な項目は次のとおりです。詳細はAWS ドキュメントを参照してください。
- eventSource
- リクエストが行われたサービス。この名前は通常、スペースなしのサービス名の短縮形に .amazonaws.com を付けたもの
- cloudformation.amazonaws.com、ec2.amazonaws.com、signin.amazonaws.com など
- リクエストが行われたサービス。この名前は通常、スペースなしのサービス名の短縮形に .amazonaws.com を付けたもの
- eventName
- リクエストされたアクション。そのサービスの API アクションの 1 つです。
- ConsoleLogin、SwitchRole、CreateUser、CreateVpc など
- リクエストされたアクション。そのサービスの API アクションの 1 つです。
- errorCode
- AWS のサービスエラー
- エラーコードとメッセージログの例
- 例えば、
AccessDenied
といった文字列が含まれます。
- errorMessage
- リクエストがエラーを返す場合、エラーの説明
- エラーコードとメッセージログの例
- 認証失敗の場合は、
Failed authentication
が含まれます。
- additionalEventData
- リクエストまたはレスポンスの一部ではないイベントに関する追加のデータ
- 例えば、MFA を利用したかどうかは
MFAUsed
に格納されます。
- eventType
- イベントレコードを生成したイベントのタイプ
- AwsApiCall、AwsServiceEvent、AwsConsoleAction、AwsConsoleSignIn、AwsCloudTrailInsight
監視する主要なログ
Amazon CloudWatch Logs による CloudTrail ログファイルをモニタリングする
CloudTrail イベントの CloudWatch アラームの作成: 例
- ユーザーアカウント
- ルートアカウントの使用を監視
"{$.userIdentity.type=\"Root\" && $.userIdentity.invokedBy NOT EXISTS && $.eventType !=\"AwsServiceEvent\"}
- コンソールへの認証失敗を監視
"{ ($.eventName = ConsoleLogin) && ($.errorMessage = \"Failed authentication\") }"
- 他要素認証 (MFA) を使用していないコンソールサインインを監視
"{ $.eventName = \"ConsoleLogin\" && $.additionalEventData.MFAUsed = \"No\" }"
- IAM ポリシーやポリシーへの変更を監視
"{($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventName=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolicy)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=DeletePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersion)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.eventName=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGroupPolicy)||($.eventName=DetachGroupPolicy)}"
- IAM ユーザの作成を監視
"{($.eventName=CreateUser)||($.eventName=CreateLoginProfile)}"
- IAM アクセスキーの作成を監視
"{$.eventName=CreateAccessKey}"
- SwitchRole エラーの連続発生を監視
"{ $.eventSource = \"signin.amazonaws.com\" && $.eventName = \"SwitchRole\" && $.responseElements.SwitchRole= \"Failure\" }"
- セッションマネージャーでのログインを監視
"{ ($.eventSource = \"s3.amazonaws.com\") && ($.eventName = \"StartSession\" || $.eventName = \"ResumeSession\" || $.eventName = \"TerminateSession\") }"
- ルートアカウントの使用を監視
- 不正アクセス
- CloudTrail の変更を監視
"{ ($.eventName = CreateTrail) || ($.eventName = UpdateTrail) || ($.eventName = DeleteTrail) || ($.eventName = StartLogging) || ($.eventName = StopLogging) }"
- GuardDuty 検出システムの削除
"{ ($.eventSource = \"guardduty.amazonaws.com\") && ($.eventName = \"DeleteDetector\") }"
- KMS キーの無効またはスケジュールされた削除の発生を監視
"{ $.eventSource = kms.amazonaws.com && ($.eventName = \"DisableKey\" || $.eventName = \"ScheduleKeyDeletion\") }"
- 無効または削除された KMS のキー使用時のエラー発生を監視
"{ $.eventSource = kms.amazonaws.com && $.errorCode = \"*Exception\" }"
- 不正な API 呼び出しの発生を監視
"{($.errorCode = "*UnauthorizedOperation" || $.errorCode = "AccessDenied*") && ($.eventName != "Decrypt" || $.userIdentity.invokedBy != "config.amazonaws.com" )}"
- EC2 インスタンスの作成、終了、起動、停止、再起動
"{ ($.eventName = RunInstances) || ($.eventName = RebootInstances) || ($.eventName = StartInstances) || ($.eventName = StopInstances) || ($.eventName = TerminateInstances) }"
- サイズの大きい EC2 インスタンス (4x or 8x-large) の作成、終了、起動、停止、再起動
"{ ($.eventName = RunInstances) && (($.requestParameters.instanceType = *.8xlarge) || ($.requestParameters.instanceType = *.4xlarge)) }"
- CloudTrail の変更を監視
- バケット
- S3 バケットポリシーへの変更を監視
"{ ($.eventSource = \"s3.amazonaws.com\") && ($.eventName = \"PutBucketPolicy\") }"
- S3 パブリックアクセスブロックの削除
"{ ($.eventSource = \"s3.amazonaws.com\") && ($.eventName = \"DeleteAccountPublicAccessBlock\") }"
- S3 バケットポリシーへの変更を監視
- ネットワークコンポーネント
- Amazon Virtual Private Cloud (VPC) の変更を監視
"{ ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ($.eventName = ModifyVpcAttribute) || ($.eventName = AcceptVpcPeeringConnection) || ($.eventName = CreateVpcPeeringConnection) || ($.eventName = DeleteVpcPeeringConnection) || ($.eventName = RejectVpcPeeringConnection) || ($.eventName = AttachClassicLinkVpc) || ($.eventName = DetachClassicLinkVpc) || ($.eventName = DisableVpcClassicLink) || ($.eventName = EnableVpcClassicLink) }"
- ネットワークゲートウェイの変更を監視
"{ ($.eventName = CreateCustomerGateway) || ($.eventName = DeleteCustomerGateway) || ($.eventName = AttachInternetGateway) || ($.eventName = CreateInternetGateway) || ($.eventName = DeleteInternetGateway) || ($.eventName = DetachInternetGateway) }"
- セキュリティグループへの変更を監視
"{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }"
- ネットワークアクセスコントロールリスト (ACL) の変更を監視
"{ ($.eventName = CreateNetworkAcl) || ($.eventName = CreateNetworkAclEntry) || ($.eventName = DeleteNetworkAcl) || ($.eventName = DeleteNetworkAclEntry) || ($.eventName = ReplaceNetworkAclEntry) || ($.eventName = ReplaceNetworkAclAssociation) }"
- Amazon Virtual Private Cloud (VPC) の変更を監視
AWS CloudTrail ログのクエリの Athena による分析
CloudTrail のログを Athena を使って分析できます。
CloudTrail の証跡画面を開き、「Athena テーブルを作成」をクリックします。
対象の S3 バケットを指定します。
これだけで、Athena テーブルが作成されました。
クエリエディタで、SQL を使って分析できます。
例えば、次のような「ログインレポート」を出力する SQL です。
SELECT
eventTime,
eventSource,
eventName,
awsRegion,
sourceIPAddress,
userIdentity.type,
userIdentity.arn
FROM cloudtrail_logs_cloudtrail
WHERE eventName = 'ConsoleLogin'
LIMIT 10;
CloudTrail Lake
こちらも、Athena と同様に SQL で分析できます。
Discussion