收集 AWS IAM 記錄
支援的國家/地區:
Google SecOps
SIEM
本文說明如何將 AWS IAM 記錄擷取至 Google Security Operations。剖析器會將原始 JSON 格式的記錄轉換為結構化的統一資料模型 (UDM)。這項功能會擷取相關欄位,例如使用者詳細資料、角色資訊、權限和時間戳記,並將這些欄位對應至相應的 UDM 欄位,以進行一致的安全分析。
事前準備
- 確認您擁有 Google SecOps 執行個體。
- 確認您具備 AWS 的特殊權限。
設定 AWS IAM 和 S3
- 按照這份使用者指南建立 Amazon S3 值區:建立值區。
- 請儲存 bucket 的「名稱」和「區域」,以供後續使用。
- 按照這份使用者指南建立使用者:建立 IAM 使用者。
- 選取建立的「使用者」。
- 選取「安全憑證」分頁標籤。
- 在「Access Keys」部分中,按一下「Create Access Key」。
- 選取「第三方服務」做為「用途」。
- 點選「下一步」。
- 選用:新增說明標記。
- 按一下「建立存取金鑰」。
- 按一下「下載 CSV 檔案」,儲存「存取金鑰」和「私密存取金鑰」,以供日後使用。
- 按一下 [完成]。
- 選取 [權限] 分頁標籤。
- 在「權限政策」部分,按一下「新增權限」。
- 選取「新增權限」。
- 選取「直接附加政策」
- 搜尋並選取 AmazonS3FullAccess 政策。
- 點選「下一步」。
- 按一下「新增權限」。
設定 CloudTrail 以擷取 IAM 記錄
- 登入 AWS 管理主控台。
- 在搜尋列中輸入並選取服務清單中的 CloudTrail。
- 按一下「建立路徑」。
- 提供「Trail name」(追蹤記錄名稱),例如
IAMActivityTrail
。- 將追蹤記錄套用至所有區域:選取「是」,即可擷取所有區域的活動。
- 儲存位置:選取先前建立的 S3 值區,或建立新值區。
- S3 Bucket:輸入 S3 bucket 的名稱,例如
iam-logs-bucket
。 - 選取「建立新的 IAM 角色」 (如果先前未建立)。
- 管理事件:選取「讀取」和「寫入」,擷取 IAM 資源的讀取和寫入事件。
- 資料事件:啟用 S3 和 Lambda 資料事件。
- 按一下「建立」來建立追蹤記錄。
設定 CloudTrail 將記錄匯出至 S3
- 前往「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 控制台。
- 按一下「建立函式」。
- 選取「從頭開始撰寫」。
- 將函式名稱設為
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/
。 - 按一下「新增」。
在 Google SecOps 中設定資訊提供,擷取 AWS IAM 記錄
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增」。
- 在「動態饋給名稱」欄位中,輸入動態饋給的名稱,例如「AWS IAM 記錄」。
- 選取「Amazon S3」做為「來源類型」。
- 選取「AWS IAM」做為「記錄類型」。
- 點選「下一步」。
指定下列輸入參數的值:
- 區域: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 存取權的使用者私密金鑰。
資產命名空間:資產命名空間。
擷取標籤:要套用至這個動態饋給事件的標籤。
點選「下一步」。
在「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 專業人員尋求答案。