收集 AWS IAM 記錄

支援的國家/地區:

本文說明如何將 AWS IAM 記錄擷取至 Google Security Operations。剖析器會將原始 JSON 格式的記錄轉換為結構化的統一資料模型 (UDM)。這項功能會擷取相關欄位,例如使用者詳細資料、角色資訊、權限和時間戳記,並將這些欄位對應至相應的 UDM 欄位,以進行一致的安全分析。

事前準備

  • 確認您擁有 Google SecOps 執行個體。
  • 確認您具備 AWS 的特殊權限。

設定 AWS IAM 和 S3

  1. 按照這份使用者指南建立 Amazon S3 值區建立值區
  2. 請儲存 bucket 的「名稱」和「區域」,以供後續使用。
  3. 按照這份使用者指南建立使用者:建立 IAM 使用者
  4. 選取建立的「使用者」
  5. 選取「安全憑證」分頁標籤。
  6. 在「Access Keys」部分中,按一下「Create Access Key」
  7. 選取「第三方服務」做為「用途」
  8. 點選「下一步」
  9. 選用:新增說明標記。
  10. 按一下「建立存取金鑰」
  11. 按一下「下載 CSV 檔案」,儲存「存取金鑰」和「私密存取金鑰」,以供日後使用。
  12. 按一下 [完成]
  13. 選取 [權限] 分頁標籤。
  14. 在「權限政策」部分,按一下「新增權限」
  15. 選取「新增權限」
  16. 選取「直接附加政策」
  17. 搜尋並選取 AmazonS3FullAccess 政策。
  18. 點選「下一步」
  19. 按一下「新增權限」

設定 CloudTrail 以擷取 IAM 記錄

  1. 登入 AWS 管理主控台
  2. 在搜尋列中輸入並選取服務清單中的 CloudTrail
  3. 按一下「建立路徑」
  4. 提供「Trail name」(追蹤記錄名稱),例如 IAMActivityTrail
    • 將追蹤記錄套用至所有區域:選取「是」,即可擷取所有區域的活動。
    • 儲存位置:選取先前建立的 S3 值區,或建立新值區。
    • S3 Bucket:輸入 S3 bucket 的名稱,例如 iam-logs-bucket
    • 選取「建立新的 IAM 角色」 (如果先前未建立)。
    • 管理事件:選取「讀取」和「寫入」,擷取 IAM 資源的讀取和寫入事件。
    • 資料事件:啟用 S3 和 Lambda 資料事件。
  5. 按一下「建立」來建立追蹤記錄。

設定 CloudTrail 將記錄匯出至 S3

  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. 選取「從頭開始撰寫」
  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. 按一下「新增」

在 Google SecOps 中設定資訊提供,擷取 AWS IAM 記錄

  1. 依序前往「SIEM 設定」>「動態饋給」
  2. 按一下「新增」
  3. 在「動態饋給名稱」欄位中,輸入動態饋給的名稱,例如「AWS IAM 記錄」
  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」(URI 為):選取「Directory」(目錄) 或「Directory which includes subdirectories」(包含子目錄的目錄)
    • 來源刪除選項:根據偏好選取刪除選項。

    • 存取金鑰 ID:具有 S3 bucket 存取權的使用者存取金鑰。

    • 存取密鑰:具有 S3 bucket 存取權的使用者私密金鑰。

    • 資產命名空間資產命名空間

    • 擷取標籤:要套用至這個動態饋給事件的標籤。

  8. 點選「下一步」

  9. 在「Finalize」畫面上檢查新的動態饋給設定,然後按一下「Submit」

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 欄位對應,並轉換為 Chronicle 的 USER 實體類型時間戳記格式。
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 專業人員尋求答案。