收集 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. 在「Permissions policies」(權限政策) 區段中,按一下「Add permissions」(新增權限)
  15. 選取「新增權限」
  16. 選取「直接附加政策」
  17. 搜尋並選取 AmazonS3FullAccess 政策。
  18. 點選「下一步」
  19. 按一下「Add permissions」。

設定 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 平台中,有兩種不同的進入點可設定動態饋給:

  • 依序點選「SIEM 設定」>「動態饋給」>「新增」
  • 依序點選「內容中心」「內容包」「開始使用」

如何設定 AWS IAM 動態饋給

  1. 按一下「Amazon Cloud Platform」套件。
  2. 找出 AWS IAM 記錄類型。
  3. 在下列欄位中指定值。

    • 來源類型:第三方 API
    • 使用者名稱:用於驗證的使用者名稱
    • 密鑰:用於驗證的密鑰

    進階選項

    • 動態饋給名稱:系統預先填入的值,用於識別動態饋給。
    • 資產命名空間:與動態饋給相關聯的命名空間。
    • 擷取標籤:套用至這個動態饋給所有事件的標籤。
  4. 點選「建立動態饋給」

如要進一步瞭解如何為這個產品系列中的不同記錄類型設定多個動態饋給,請參閱「依產品設定動態饋給」。

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 專業人員尋求答案。