AWS IAM ログを収集する
このドキュメントでは、AWS IAM ログを Google Security Operations に取り込む方法について説明します。パーサーは、未加工の JSON 形式のログを構造化された Unified Data Model(UDM)に変換します。ユーザーの詳細、ロール情報、権限、タイムスタンプなどの関連フィールドを抽出し、対応する UDM フィールドにマッピングして、一貫したセキュリティ分析を行います。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス
- AWS コンソールへの特権アクセス
- IAM ユーザー、ロール、ポリシーを作成する権限
統合方法を選択する
Google SecOps は、AWS IAM データを取り込むための 2 つの方法をサポートしています。
方法 A: CloudTrail + Amazon S3(アクティビティ ログ)
- 収集される情報: IAM アクティビティ ログ(誰がどの操作を行ったか)
- データソース: AWS CloudTrail イベント
- レイテンシ: 数分(ポーリング ベース)
- ユースケース: 過去の監査証跡、コンプライアンス レポート
- フィードのソースタイプ: Amazon S3 V2
方法 B: サードパーティ API(構成スナップショット)
- 収集されるデータ: IAM 構成データ(ユーザー、グループ、ロール、ポリシー)
- データソース: AWS IAM API の直接呼び出し
- レイテンシ: ほぼリアルタイム(定期的なポーリング)
- ユースケース: リアルタイムの IAM 構成モニタリング、アクセス レビュー
- フィードのソースタイプ: サードパーティ API
方法 A: CloudTrail と Amazon S3 の統合
この方法では、AWS CloudTrail を使用して IAM アクティビティをキャプチャし、ログを Amazon S3 に保存します。Google SecOps はこのログを取り込みます。
Amazon S3 バケットを作成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- 後で参照できるように、バケットの名前とリージョンを保存します(例:
iam-activity-logs-bucket)。
CloudTrail の S3 バケット ポリシーを構成する
CloudTrail には、S3 バケットにログを書き込む権限が必要です。
- Amazon S3 コンソールで、バケットを選択します。
- [権限> バケット ポリシー] に移動します。
[編集] をクリックして、次のポリシーを追加します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudTrailAclCheck", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::iam-activity-logs-bucket" }, { "Sid": "CloudTrailWrite", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::iam-activity-logs-bucket/AWSLogs/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }iam-activity-logs-bucketは、実際のバケット名に置き換えます。
[変更を保存] をクリックします。
IAM アクティビティをキャプチャするように CloudTrail を構成する
- AWS Management Console にログインします。
- 検索バーに「CloudTrail」と入力し、サービスリストから [CloudTrail] を選択します。
- [トレイルを作成] をクリックします。
- 次の構成の詳細を指定します。
- トレイル名: わかりやすい名前を入力します(例:
IAMActivityTrail)。 - すべてのリージョンにトレイルを適用する: すべてのリージョンでアクティビティをキャプチャするには、[はい] を選択します。
- 保存場所: [既存の S3 バケットを使用する] を選択し、前に作成したバケットを選択します。
- ログファイルの接頭辞(省略可): 接頭辞(例:
iam-logs/)を入力します。 - ログファイルの SSE-KMS 暗号化: 省略可。有効になっている場合は、KMS 鍵を作成または選択します。
- トレイル名: わかりやすい名前を入力します(例:
- [次へ] をクリックします。
- イベントの選択を構成します。
- 管理イベント: IAM リソースの読み取りイベントと書き込みイベントの両方をキャプチャするには、[読み取り] と [書き込み] を選択します。
- データイベント: 省略可。必要に応じて、S3 と Lambda のデータイベントを有効にします。
- 分析情報イベント: 省略可。通常とは異なるアクティビティの検出を有効にします。
- [次へ] をクリックします。
- 構成を確認し、[トレイルを作成] をクリックします。
省略可: S3 バケットのバージョニングを有効にする(推奨)
- Amazon S3 コンソールで、バケットを選択します。
- [プロパティ> バケットのバージョニング] に移動します。
- [編集] をクリックします。
- [有効にする] を選択します。
- [変更を保存] をクリックします。
Google SecOps S3 アクセス用の IAM ユーザーを作成する
- IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成したユーザーを選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックし、[アクセスキー] と [シークレット アクセスキー] を保存して、今後の参照に備えます。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションで [権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- 新しいタブで [ポリシーを作成] をクリックします。
- [ポリシー エディタ] で、[JSON] タブを選択します。
次のポリシーを入力します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::iam-activity-logs-bucket", "arn:aws:s3:::iam-activity-logs-bucket/*" ] } ] }iam-activity-logs-bucketは、実際のバケット名に置き換えます。
[次へ] をクリックします。
ポリシーに
chronicle-s3-read-policyという名前を付けます。[ポリシーを作成] をクリックします。
ユーザー作成タブに戻り、ポリシーのリストを更新します。
chronicle-s3-read-policyを検索して選択します。[次へ] をクリックします。
[権限を追加] をクリックします。
省略可: リアルタイム エクスポート用の Lambda 関数を作成する
CloudTrail ログを S3 にほぼリアルタイムでエクスポートする必要がある場合:
- AWS コンソールで、[Lambda] > [Functions] > [Create function] に移動します。
- [Author from scratch] をクリックします。
次の構成情報を提供してください。
設定 値 名前 ExportIAMLogsToS3ランタイム Python 3.13 アーキテクチャ x86_64 実行ロール 基本的な Lambda 権限を持つ新しいロールを作成する [関数を作成] をクリックします。
関数を作成したら、[コード] タブを開き、スタブを削除して次のコードを入力します。
import boto3 import gzip from io import BytesIO s3 = boto3.client('s3') logs = boto3.client('logs') def lambda_handler(event, context): log_group = event['logGroup'] log_stream = event['logStream'] log_events = logs.get_log_events( logGroupName=log_group, logStreamName=log_stream, startFromHead=True ) log_data = "\n".join([event['message'] for event in log_events['events']]) # Compress and upload to S3 compressed_data = gzip.compress(log_data.encode('utf-8')) s3.put_object( Bucket='iam-activity-logs-bucket', Key=f'iam-logs/{log_stream}.gz', Body=compressed_data ) return { 'statusCode': 200, 'body': 'Logs exported successfully' }iam-activity-logs-bucketは、使用するバケット名に置き換えてください。
[デプロイ] をクリックして、関数コードを保存します。
省略可: Lambda 実行ロールの権限を構成する
- 同じ関数で、[構成] タブを選択します。
- 左側のメニューから [権限] を選択します。
- [実行ロール] の名前をクリックして、IAM コンソールで開きます。
- [権限を追加> ポリシーをアタッチ] をクリックします。
- 新しいタブで [ポリシーを作成] をクリックします。
[JSON] タブを選択し、次のポリシーを貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:GetLogEvents", "logs:FilterLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::iam-activity-logs-bucket/*" } ] }iam-activity-logs-bucketは、使用するバケット名に置き換えてください。
[次へ] をクリックします。
ポリシーに
lambda-iam-logs-export-policyという名前を付けます。[ポリシーを作成] をクリックします。
ロールタブに戻り、更新します。
lambda-iam-logs-export-policyを検索して選択します。[権限を追加] をクリックします。
省略可: Lambda タイムアウトを構成する
- Lambda 関数の [構成] タブを開いたままにします。
- 左側のメニューから [全般設定] を選択します。
- [編集] をクリックします。
- [Timeout] を [5 minutes (300 seconds)] に変更します。
- [保存] をクリックします。
省略可: CloudWatch Logs の Lambda トリガーを構成する
- Lambda 関数で、上部の [関数の概要] セクションを選択します。
- [トリガーを追加] をクリックします。
- [トリガー構成] プルダウンで、[CloudWatch Logs] を選択します。
- 次の構成の詳細を指定します。
- ロググループ: CloudTrail に関連付けられている CloudWatch Logs ロググループを選択または入力します(例:
/aws/cloudtrail/)。 - フィルタ名: わかりやすい名前を入力します(例:
IAM-events-filter)。 - フィルタ パターン: すべてのイベントをキャプチャする場合は空白のままにします。特定のパターンを入力することもできます。
- ロググループ: CloudTrail に関連付けられている CloudWatch Logs ロググループを選択または入力します(例:
- [追加] をクリックします。
フィードを設定する
Google SecOps プラットフォームでフィードを設定するには、次の 2 つのエントリ ポイントがあります。
- [SIEM 設定] > [フィード] > [新しいフィードを追加]
- Content Hub > Content Packs > Get Started
AWS IAM フィードの設定方法
- [Amazon Cloud Platform] パックをクリックします。
- AWS IAM ログタイプを見つけます。
次のフィールドで値を指定します。
- ソースタイプ: サードパーティ API
- ユーザー名: 認証に使用するユーザー名
- シークレット: 認証に使用するシークレット
詳細オプション
- フィード名: フィードを識別する値が事前入力されています。
- アセットの名前空間: フィードに関連付けられた名前空間。
- Ingestion Labels: このフィードのすべてのイベントに適用されるラベル。
[フィードを作成] をクリックします。
このプロダクト ファミリー内のさまざまなログタイプに対して複数のフィードを構成する方法については、プロダクト別にフィードを構成するをご覧ください。
SIEM 設定の使用
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで [単一のフィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
AWS IAM CloudTrail Logs)。 - [ソースタイプ] として [Amazon S3 V2] を選択します。
- [ログタイプ] として [AWS IAM] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
S3 URI:
s3://iam-activity-logs-bucket/iam-activity-logs-bucketは、実際のバケット名に置き換えます。
Source deletion option: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
- 成功時: 転送が成功した後、すべてのファイルと空のディレクトリを削除します(費用最適化のため)。
ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます。デフォルトは 180 日です。
アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
アセットの名前空間: アセットの名前空間。
Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
方法 B: サードパーティ API の統合
このメソッドは、AWS IAM API 呼び出しを直接使用して、現在の IAM 構成データ(ユーザー、グループ、ロール、ポリシー)を収集します。
Google SecOps の IP 範囲を取得する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- ページの上部に表示された IP 範囲をメモします。
- または、Feed Management API を使用して IP 範囲をプログラムで取得します。
必要な権限を持つ IAM ユーザーを作成する
オプション A: AWS マネージド ポリシーを使用する(推奨)
- IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成したユーザーを選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックし、[アクセスキー] と [シークレット アクセスキー] を保存して、今後の参照に備えます。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションで [権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- IAMReadOnlyAccess(AWS マネージド ポリシー)を検索します。
- ポリシーを選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
重要: IAMReadOnlyAccess ポリシーには、必要なすべての権限が含まれています。
iam:GetUseriam:ListUsersiam:GetGroupiam:ListGroupsiam:GetPolicyiam:ListPoliciesiam:GetRoleiam:ListRolesiam:ListAttachedUserPoliciesiam:ListAttachedGroupPoliciesiam:ListAttachedRolePoliciesiam:GetAccountSummary
オプション B: カスタム ポリシーを作成する(最小権限)
セキュリティ ポリシーでマネージド ポリシーではなく最小権限が必要な場合:
- AWS コンソールで、[IAM] > [ポリシー] > [ポリシーの作成] > [JSON] タブに移動します。
次のポリシーを貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:GetUser", "iam:ListUsers", "iam:GetGroup", "iam:ListGroups", "iam:GetPolicy", "iam:ListPolicies", "iam:GetRole", "iam:ListRoles", "iam:ListAttachedUserPolicies", "iam:ListAttachedGroupPolicies", "iam:ListAttachedRolePolicies", "iam:GetAccountSummary" ], "Resource": "*" } ] }[次へ] をクリックします。
ポリシーに
chronicle-iam-api-read-policyという名前を付けます。[ポリシーを作成] をクリックします。
IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
作成したユーザーを選択します。
[セキュリティ認証情報] タブを選択します。
[アクセスキー] セクションで [アクセスキーを作成] をクリックします。
[ユースケース] として [サードパーティ サービス] を選択します。
[次へ] をクリックします。
省略可: 説明タグを追加します。
[アクセスキーを作成] をクリックします。
[CSV ファイルをダウンロード] をクリックし、[アクセスキー] と [シークレット アクセスキー] を保存して、今後の参照に備えます。
[完了] をクリックします。
[権限] タブを選択します。
[権限ポリシー] セクションで [権限を追加] をクリックします。
[権限を追加] を選択します。
[ポリシーを直接アタッチする] を選択します。
chronicle-iam-api-read-policyを検索して選択します。[次へ] をクリックします。
[権限を追加] をクリックします。
IAM 構成データを取り込むように Google SecOps でフィードを構成する
コンテンツ ハブを使用する(推奨)
- [コンテンツ ハブ] > [コンテンツ パック] > [開始] に移動します。
- [Amazon Cloud Platform] パックをクリックします。
- AWS IAM ログタイプを見つけます。
- [ソースタイプ] プルダウンから [サードパーティ API] を選択します。
- 次の構成の詳細を指定します。
- ユーザー名: 前の手順で作成した IAM ユーザーのアクセスキー ID。
- Secret: 前に作成した IAM ユーザーのシークレット アクセスキー。
- Feed Name: フィードを識別する事前入力された値(
AWS IAM API Configurationなど)。 - アセットの名前空間: フィードに関連付けられた名前空間。
- Ingestion Labels: このフィードのすべてのイベントに適用されるラベル。
- [フィードを作成] をクリックします。
このプロダクト ファミリー内のさまざまなログタイプに対して複数のフィードを構成する方法については、プロダクト別にフィードを構成するをご覧ください。
SIEM 設定の使用
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで [単一のフィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
AWS IAM API Configuration)。 - [ソースタイプ] として [サードパーティ API] を選択します。
- [ログタイプ] として [AWS IAM] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- ユーザー名: 前の手順で作成した IAM ユーザーのアクセスキー ID。
- Secret: 前に作成した IAM ユーザーのシークレット アクセスキー。
- リージョン: AWS リージョン(
us-east-1など)。
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
Arn |
entity.entity.resource.name |
ARN フィールドから直接マッピングされます。さまざまなエンティティ タイプに適用されます。GROUP エンティティ タイプの場合、Group.Arn からマッピングされます。 |
AssumeRolePolicyDocument |
entity.entity.resource.attribute.permissions.name |
AssumeRolePolicyDocument フィールドから直接マッピングされますが、RESOURCE エンティティ タイプの場合のみです。 |
CreateDate |
entity.entity.user.attribute.creation_time |
CreateDate フィールドから直接マッピングされ、Chronicle のタイムスタンプ形式に変換されます。 |
CreateDate |
entity.entity.resource.attribute.creation_time |
CreateDate フィールドから直接マッピングされ、Chronicle のタイムスタンプ形式に変換されます。 |
Group.Arn |
entity.entity.resource.name |
Group.Arn フィールドから直接マッピングされます。 |
Group.CreateDate |
entity.entity.group.attribute.creation_time |
Group.CreateDate フィールドから直接マッピングされ、Chronicle のタイムスタンプ形式に変換されます。 |
Group.GroupID |
entity.entity.group.product_object_id |
Group.GroupID フィールドから直接マッピングされます。 |
Group.GroupName |
entity.entity.group.group_display_name |
Group.GroupName フィールドから直接マッピングされます。 |
Group.GroupName |
entity.entity.group.email_addresses |
Group.GroupName フィールドから直接マッピングされます。 |
Group.Path |
entity.entity.group.attribute.labels.value |
Group.Path フィールドから直接マッピングされます。キーは path にハードコードされています。 |
IsTruncated |
entity.entity.group.attribute.labels.value |
IsTruncated フィールドから直接マッピングされ、文字列に変換されます。キーは is_truncated にハードコードされています。 |
Marker |
entity.entity.group.attribute.labels.value |
Marker フィールドから直接マッピングされます。キーは marker にハードコードされています。 |
PasswordLastUsed |
entity.entity.user.last_login_time |
PasswordLastUsed フィールドから直接マッピングされ、Chronicle のタイムスタンプ形式に変換されます。 |
Path |
entity.entity.user.attribute.labels.value |
USER エンティティ タイプの Path フィールドから直接マッピングされます。キーはパスにハードコードされています。 |
Path |
entity.entity.resource.attribute.labels.value |
RESOURCE エンティティ タイプの Path フィールドから直接マッピングされます。キーは path にハードコードされています。 |
PermissionsBoundary.PermissionsBoundaryArn |
entity.entity.resource.attribute.labels.value |
PermissionsBoundary.PermissionsBoundaryArn フィールドから直接マッピングされます。キーは permissions_boundary_arn にハードコードされています。 |
PermissionsBoundary.PermissionsBoundaryType |
entity.entity.resource.attribute.labels.value |
PermissionsBoundary.PermissionsBoundaryType フィールドから直接マッピングされます。キーは permissions_boundary_type にハードコードされています。 |
RoleID |
entity.entity.resource.product_object_id |
RoleID フィールドから直接マッピングされます。 |
RoleLastUsed.LastUsedDate |
entity.entity.resource.attribute.labels.value |
RoleLastUsed.LastUsedDate フィールドから直接マッピングされます。キーは role_last_used_date にハードコードされています。 |
RoleLastUsed.Region |
entity.entity.location.name |
RoleLastUsed.Region フィールドから直接マッピングされます。 |
RoleName |
entity.entity.resource.attribute.roles.name |
RoleName フィールドから直接マッピングされます。 |
Tags.Key |
entity.entity.user.attribute.labels.key |
ユーザー エンティティのラベルのキーとして使用されます。 |
Tags.Value |
entity.entity.user.attribute.labels.value |
ユーザー エンティティのラベルの値として使用されます。 |
UserID |
entity.entity.user.product_object_id |
UserID フィールドから直接マッピングされます。 |
UserName |
entity.entity.user.userid |
UserName フィールドから直接マッピングされます。 |
Users.Arn |
relations.entity.resource.name |
ユーザー関係内の Users.Arn フィールドから直接マッピングされます。 |
Users.CreateDate |
relations.entity.user.attribute.creation_time |
ユーザー リレーション内の Users.CreateDate フィールドから直接マッピングされ、Chronicle のタイムスタンプ形式に変換されます。 |
Users.PasswordLastUsed |
relations.entity.user.last_login_time |
ユーザー関係内の Users.PasswordLastUsed フィールドから直接マッピングされ、Chronicle のタイムスタンプ形式に変換されます。 |
Users.Path |
relations.entity.user.attribute.labels.value |
ユーザー関係内の Users.Path フィールドから直接マッピングされます。キーはパスにハードコードされています。 |
Users.PermissionsBoundary.PermissionsBoundaryArn |
relations.entity.resource.attribute.labels.value |
ユーザー リレーション内の Users.PermissionsBoundary.PermissionsBoundaryArn フィールドから直接マッピングされます。キーは permissions_boundary_arn にハードコードされています。 |
Users.PermissionsBoundary.PermissionsBoundaryType |
relations.entity.resource.attribute.labels.value |
ユーザー関係内の Users.PermissionsBoundary.PermissionsBoundaryType フィールドから直接マッピングされます。キーは permissions_boundary_type にハードコードされています。 |
Users.UserID |
relations.entity.user.product_object_id |
ユーザー関係内の Users.UserID フィールドから直接マッピングされます。 |
Users.UserName |
relations.entity.user.userid |
ユーザー関係内の Users.UserName フィールドから直接マッピングされます。 |
| なし | entity.metadata.collected_timestamp |
イベントの取り込みタイムスタンプが入力されます。 |
| なし | entity.metadata.vendor_name |
AWS にハードコードされています。 |
| なし | entity.metadata.product_name |
AWS IAM にハードコードされています。 |
| なし | entity.metadata.entity_type |
特定のフィールドの有無に基づいて決定されます。UserID が存在する場合は USER、RoleID が存在する場合は RESOURCE、Group.GroupName が存在する場合は GROUP。 |
| なし | entity.entity.resource.resource_subtype |
USER エンティティ タイプの場合は User に、RESOURCE エンティティ タイプの場合は Role に設定します。 |
| なし | entity.entity.resource.resource_type |
RESOURCE エンティティ タイプの場合は ACCESS_POLICY に設定します。 |
| なし | entity.entity.resource.attribute.cloud.environment |
AMAZON_WEB_SERVICES にハードコードされています。 |
| なし | relations.entity_type |
ユーザー関係では USER にハードコードされています。 |
| なし | relations.relationship |
ユーザー グループの関係では MEMBER にハードコードされています。 |
| なし | relations.direction |
UNIDIRECTIONAL にハードコードされています。 |
| なし | relations.entity.resource.resource_subtype |
ユーザー関係用に User にハードコードされています。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。