AWS IAM ログを収集する

以下でサポートされています。

このドキュメントでは、AWS IAM ログを Google Security Operations に取り込む方法について説明します。パーサーは、未加工の JSON 形式のログを構造化された統合データモデル(UDM)に変換します。ユーザーの詳細、ロール情報、権限、タイムスタンプなどの関連フィールドを抽出し、対応する UDM フィールドにマッピングして、一貫したセキュリティ分析を行います。

始める前に

  • Google SecOps インスタンスがあることを確認します。
  • AWS への特権アクセス権があることを確認します。

AWS IAM と S3 を構成する

  1. バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
  2. 後で使用するために、バケットの名前リージョンを保存します。
  3. IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
  4. 作成した [ユーザー] を選択します。
  5. [セキュリティ認証情報] タブを選択します。
  6. [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
  7. [ユースケース] として [サードパーティ サービス] を選択します。
  8. [次へ] をクリックします。
  9. 省略可: 説明タグを追加します。
  10. [アクセスキーを作成] をクリックします。
  11. [CSV ファイルをダウンロード] をクリックして、[アクセスキー] と [シークレット アクセスキー] を保存し、後で使用できるようにします。
  12. [完了] をクリックします。
  13. [権限] タブを選択します。
  14. [権限ポリシー] セクションで、[権限を追加] をクリックします。
  15. [権限を追加] を選択します。
  16. [ポリシーを直接アタッチする] を選択します。
  17. AmazonS3FullAccess ポリシーを検索して選択します。
  18. [次へ] をクリックします。
  19. [権限を追加] をクリックします。

IAM ログをキャプチャするように CloudTrail を構成する

  1. AWS Management Console にログインします。
  2. 検索バーに「CloudTrail」と入力し、サービスリストから [CloudTrail] を選択します。
  3. [トレイルを作成] をクリックします。
  4. [Trail name] を指定します(例: IAMActivityTrail)。
    • すべてのリージョンにトレイルを適用する: すべてのリージョンでアクティビティをキャプチャするには、[はい] を選択します。
    • 保存場所: 先ほど作成した S3 バケットを選択するか、新しいバケットを作成します。
    • S3 バケット: S3 バケットの名前(iam-logs-bucket など)を入力します。
    • [新しい IAM ロールを作成する] を選択します(まだ作成していない場合)。
    • 管理イベント: [読み取り] と [書き込み] を選択して、IAM リソースの読み取りイベントと書き込みイベントの両方をキャプチャします。
    • データ イベント: S3 と Lambda のデータ イベントを有効にします。
  5. [作成] をクリックしてトレイルを作成します。

ログを S3 にエクスポートするように CloudTrail を構成する

  1. [Services] > [S3] に移動します。
  2. CloudTrail ログが保存されている S3 バケット(例: iam-logs-bucket)を選択します。
  3. CloudTrail に、バケットにログを書き込むための適切な権限があることを確認します。
  4. 次のポリシーが存在しない場合は追加します。

    {
      "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/*"
        }
      ]
    }
    
  5. S3 バケットでバージョニングを有効にして、ログが複数のバージョンで保存されるようにします。

  6. [プロパティ> バケットのバージョニング> 有効にする] に移動します。

省略可: リアルタイム エクスポート用に Lambda を構成する

  1. AWS Lambda コンソールに移動します。
  2. [関数を作成] をクリックします。
  3. [Author from Scratch] を選択します。
  4. 関数名を ExportIAMLogsToS3 に設定します。
  5. Python 3.x ランタイムを選択します。
  6. 次の権限を持つ関数に 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/*"
        }
      ]
    }
    
  7. 次の 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 トリガーを構成する

  1. Lambda コンソールで、[デザイナー] に移動します。
  2. [トリガーを追加> CloudWatch Logs] を選択します。
  3. IAM ログに関連付けられている CloudWatch Logs ロググループ(例: /aws/cloudtrail/)を選択します。
  4. [追加] をクリックします。

AWS IAM のログを取り込むように Google SecOps でフィードを構成する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [新しく追加] をクリックします。
  3. [フィード名] フィールドに、フィードの名前を入力します(例: AWS IAM Logs)。
  4. [ソースタイプ] として [Amazon S3] を選択します。
  5. [ログタイプ] として [AWS IAM] を選択します。
  6. [次へ] をクリックします。
  7. 次の入力パラメータの値を指定します。

    • リージョン: 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: このフィードのイベントに適用されるラベル。

  8. [次へ] をクリックします。

  9. [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 のプロフェッショナルから回答を得ることができます。