AWS IAM ログを収集する
このドキュメントでは、AWS IAM ログを Google Security Operations に取り込む方法について説明します。パーサーは、未加工の JSON 形式のログを構造化された統合データモデル(UDM)に変換します。ユーザーの詳細、ロール情報、権限、タイムスタンプなどの関連フィールドを抽出し、対応する UDM フィールドにマッピングして、一貫したセキュリティ分析を行います。
始める前に
- Google SecOps インスタンスがあることを確認します。
- AWS への特権アクセス権があることを確認します。
AWS IAM と S3 を構成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- 後で使用するために、バケットの名前とリージョンを保存します。
- IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成した [ユーザー] を選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックして、[アクセスキー] と [シークレット アクセスキー] を保存し、後で使用できるようにします。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションで、[権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- AmazonS3FullAccess ポリシーを検索して選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
IAM ログをキャプチャするように CloudTrail を構成する
- AWS Management Console にログインします。
- 検索バーに「CloudTrail」と入力し、サービスリストから [CloudTrail] を選択します。
- [トレイルを作成] をクリックします。
- [Trail name] を指定します(例:
IAMActivityTrail
)。- すべてのリージョンにトレイルを適用する: すべてのリージョンでアクティビティをキャプチャするには、[はい] を選択します。
- 保存場所: 先ほど作成した S3 バケットを選択するか、新しいバケットを作成します。
- S3 バケット: S3 バケットの名前(
iam-logs-bucket
など)を入力します。 - [新しい IAM ロールを作成する] を選択します(まだ作成していない場合)。
- 管理イベント: [読み取り] と [書き込み] を選択して、IAM リソースの読み取りイベントと書き込みイベントの両方をキャプチャします。
- データ イベント: S3 と Lambda のデータ イベントを有効にします。
- [作成] をクリックしてトレイルを作成します。
ログを S3 にエクスポートするように CloudTrail を構成する
- [Services] > [S3] に移動します。
- CloudTrail ログが保存されている S3 バケット(例:
iam-logs-bucket
)を選択します。 - CloudTrail に、バケットにログを書き込むための適切な権限があることを確認します。
次のポリシーが存在しない場合は追加します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudTrailS3Access", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*" } ] }
S3 バケットでバージョニングを有効にして、ログが複数のバージョンで保存されるようにします。
[プロパティ> バケットのバージョニング> 有効にする] に移動します。
省略可: リアルタイム エクスポート用に Lambda を構成する
- AWS Lambda コンソールに移動します。
- [関数を作成] をクリックします。
- [Author from Scratch] を選択します。
- 関数名を
ExportIAMLogsToS3
に設定します。 - Python 3.x ランタイムを選択します。
次の権限を持つ関数に IAM ロールを割り当てます。
{ "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:::your-bucket-name/*" } ] }
次の Python コードを使用して、IAM ログを取得し、S3 にアップロードします。
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='your-s3-bucket-name', Key='iam-logs/{log_stream}.gz', Body=compressed_data )
your-s3-bucket-name
は、実際のバケット名に置き換えます。
CloudWatch Logs の Lambda トリガーを構成する
- Lambda コンソールで、[デザイナー] に移動します。
- [トリガーを追加> CloudWatch Logs] を選択します。
- IAM ログに関連付けられている CloudWatch Logs ロググループ(例:
/aws/cloudtrail/
)を選択します。 - [追加] をクリックします。
AWS IAM のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [新しく追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: AWS IAM Logs)。
- [ソースタイプ] として [Amazon S3] を選択します。
- [ログタイプ] として [AWS IAM] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- リージョン: Amazon S3 バケットが配置されているリージョン。
- S3 URI: バケット URI。
s3://your-log-bucket-name/
your-log-bucket-name
は、バケットの実際の名前に置き換えます。
- URI is a: [ディレクトリ] または [サブディレクトリを含むディレクトリ] を選択します。
Source deletion options: 必要に応じて削除オプションを選択します。
アクセスキー ID: s3 バケットにアクセスできるユーザー アクセスキー。
シークレット アクセスキー: s3 バケットにアクセスできるユーザーのシークレット キー。
アセットの名前空間: アセットの名前空間。
Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
Arn | entity.entity.resource.name | USER エンティティ タイプと RESOURCE エンティティ タイプの Arn フィールドから直接マッピングされます。GROUP エンティティ タイプの場合、Group.Arn からマッピングされます。 |
AssumeRolePolicyDocument | entity.entity.resource.attribute.permissions.name | AssumeRolePolicyDocument フィールドから直接マッピングされますが、RESOURCE エンティティ タイプの場合のみです。 |
CreateDate | entity.entity.user.attribute.creation_time | CreateDate フィールドから直接マッピングされ、USER エンティティ タイプの Chronicle のタイムスタンプ形式に変換されます。 |
CreateDate | entity.entity.resource.attribute.creation_time | CreateDate フィールドから直接マッピングされ、RESOURCE エンティティ タイプの Chronicle のタイムスタンプ形式に変換されます。 |
Group.Arn | entity.entity.resource.name | GROUP エンティティ タイプの 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 にハードコードされています。 |
マーカー | entity.entity.group.attribute.labels.value | Marker フィールドから直接マッピングされ、キーは marker にハードコードされます |
PasswordLastUsed | entity.entity.user.last_login_time | PasswordLastUsed フィールドから直接マッピングされ、Chronicle のタイムスタンプ形式に変換されます。 |
パス | 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 | ユーザー属性内の labels フィールドのキーとして使用されます。 |
Tags.Value | entity.entity.user.attribute.labels.value | ユーザー属性内の labels フィールドの値として使用されます。 |
UserID | entity.entity.user.product_object_id | UserID フィールドから直接マッピングされます。 |
ユーザー名 | 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 フィールドから直接マッピングされます。キーは 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、RoleName が存在する場合は RESOURCE、Group.GroupName が存在する場合は GROUP。 |
なし | entity.entity.resource.resource_subtype | USER エンティティ タイプと GROUP エンティティ タイプの場合は User に設定します。 |
なし | 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 のプロフェッショナルから回答を得ることができます。