收集 AWS Lambda 函式記錄
剖析器版本:2.0
本文說明如何使用 Amazon S3,將 AWS Lambda 函式記錄擷取至 Google Security Operations。
AWS Lambda 是一項無伺服器運算服務,可根據事件執行程式碼,並自動管理底層運算資源。Lambda 會自動將所有函式記錄 (平台記錄、擴充功能記錄和應用程式輸出內容) 傳送至 Amazon CloudWatch Logs,並為每個函式建立記錄群組。這項整合功能會使用 Amazon Data Firehose,將 Lambda 記錄事件從 CloudWatch Logs 串流至 S3 bucket,然後 Google SecOps 會使用 Amazon S3 V2 動態饋給擷取這些事件。
事前準備
請確認您符合下列必要條件:
- Google SecOps 執行個體
- AWS 管理主控台的特殊權限,可管理:
- AWS Lambda (函式、記錄設定)
- Amazon CloudWatch Logs (記錄群組、訂閱篩選器)
- Amazon Data Firehose (傳遞串流)
- Amazon S3 (儲存貯體)
- AWS IAM (角色、政策、使用者)
驗證 Lambda 函式的 CloudWatch Logs 記錄群組
AWS Lambda 會在首次叫用函式時,自動為每個函式建立 CloudWatch Logs 記錄群組。預設記錄群組命名慣例如下:
/aws/lambda/<function-name>
驗證方法:
- 在 AWS 控制台中,依序前往「CloudWatch」>「Logs」>「Log groups」。
- 搜尋
/aws/lambda/。 確認要擷取記錄的每個 Lambda 函式都有記錄群組。
設定 AWS S3 儲存貯體
- 按照這份使用手冊建立 bucket,建立 Amazon S3 bucket。
- 儲存 bucket 的「名稱」和「區域」,以供日後參考 (例如
lambda-logs-to-secops)。
設定 Amazon Data Firehose 的 IAM 角色
Amazon Data Firehose 需要 IAM 角色,才能將記錄寫入 S3 bucket。
建立 IAM 政策
- 在 AWS 控制台,依序前往「IAM」>「Policies」>「Create policy」。
- 選取「JSON」分頁標籤。
貼上下列政策 (將
lambda-logs-to-secops替換為實際值區名稱):{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Delivery", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::lambda-logs-to-secops", "arn:aws:s3:::lambda-logs-to-secops/*" ] }, { "Sid": "CloudWatchLogging", "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/kinesisfirehose/lambda-logs-to-secops:log-stream:*" } ] }點選「下一步」。
在「Policy name」(政策名稱) 欄位中輸入
LambdaLogsFirehoseS3Policy。點選「建立政策」。
建立 IAM 角色
- 依序前往「IAM」>「角色」>「建立角色」。
- 選取「Custom trust policy」。
貼上下列信任政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }點選「下一步」。
搜尋並選取「LambdaLogsFirehoseS3Policy」LambdaLogsFirehoseS3Policy。
點選「下一步」。
在「Role name」(角色名稱) 欄位中輸入
LambdaLogsFirehoseToS3Role。按一下「建立角色」。
建立 Amazon Data Firehose 串流
- 前往 https://console.aws.amazon.com/kinesis 開啟 Kinesis 控制台。
- 在導覽窗格中,選取「Amazon Data Firehose」。
- 按一下「Create Firehose stream」。
- 在「Choose source and destination」(選擇來源和目的地) 下方,提供下列設定:
- 來源:選取「Direct PUT」。
- Destination:選取「Amazon S3」。
- 在「Firehose stream name」欄位中輸入
lambda-logs-to-secops。 在「Transform records」(轉換記錄) 下方的「Decompress source records from Amazon CloudWatch Logs」(解壓縮 Amazon CloudWatch Logs 的來源記錄) 部分:
- 選取「開啟解壓縮功能」。
- 請勿選取「開啟訊息擷取功能」。
在「目的地設定」下方:
- S3 bucket:選取 S3 bucket
lambda-logs-to-secops。 - S3 bucket prefix (選填):輸入
lambda-logs/。 - S3 bucket error output prefix (選填):輸入
firehose-errors/。
- S3 bucket:選取 S3 bucket
在「Buffer hints」下方:
- 緩衝區空間:
5MiB (預設)。 - 緩衝間隔:
300秒 (預設)。
- 緩衝區空間:
在「進階設定」下方:
- 伺服器端加密:選用。如需加密,請啟用。
- 錯誤記錄:選取「已啟用」(建議)。
- 「Permissions」(權限):選取「Choose existing IAM role」(選擇現有的 IAM 角色),然後選取
LambdaLogsFirehoseToS3Role。
按一下「Create Firehose stream」。
等待串流「狀態」顯示為「執行中」。
為 CloudWatch Logs 設定 IAM 角色
CloudWatch Logs 需要 IAM 角色,才能將記錄資料傳送至 Firehose 串流。
建立 IAM 政策
- 依序前往「IAM」>「Policies」>「Create policy」。
- 選取「JSON」分頁標籤。
貼上以下政策 (將
<region>和<account-id>替換為您的 AWS 區域和帳戶 ID):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<region>:<account-id>:deliverystream/lambda-logs-to-secops" } ] }點選「下一步」。
在「Policy name」(政策名稱) 欄位中輸入
LambdaLogsCWLtoFirehosePolicy。點選「建立政策」。
建立 IAM 角色
- 依序前往「IAM」>「角色」>「建立角色」。
- 選取「Custom trust policy」。
貼上以下信任政策 (將
<region>替換為您的 AWS 區域):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }點選「下一步」。
搜尋並選取「LambdaLogsCWLtoFirehosePolicy」LambdaLogsCWLtoFirehosePolicy。
點選「下一步」。
在「Role name」(角色名稱) 欄位中輸入
LambdaLogsCWLtoFirehoseRole。按一下「建立角色」。
建立 CloudWatch Logs 訂閱篩選器
- 在 AWS 控制台中,依序前往「CloudWatch」>「Logs」>「Log groups」。
- 選取記錄群組
/aws/lambda/<function-name>。 - 選取「訂閱項目篩選器」分頁標籤。
- 依序點選「Create」>「Create Amazon Data Firehose subscription filter」。
- 提供下列設定詳細資料:
- Destination:選取 Firehose 串流
lambda-logs-to-secops。 - 授予權限:選取「
LambdaLogsCWLtoFirehoseRole」角色。 - 訂閱項目篩選器名稱:輸入描述性名稱 (例如
lambda-logs-to-secops-filter)。 - 記錄格式:選取「其他」。
- 訂閱篩選器模式:留空即可傳送所有 Lambda 函式記錄事件。
- Destination:選取 Firehose 串流
按一下「開始串流播放」。
為 Google SecOps 設定 IAM 使用者
Google SecOps 需要具備 S3 bucket 存取權的 IAM 使用者,才能擷取傳送的記錄。
- 按照這份使用手冊建立使用者:建立 IAM 使用者。
- 選取建立的使用者。
- 選取「安全憑證」分頁標籤。
- 在「Access Keys」部分,按一下「Create Access Key」。
- 在「用途」部分選取「第三方服務」。
- 點選「下一步」。
- 選用:新增說明標記。
- 按一下「Create access key」。
- 按一下「Download .csv file」,儲存「Access Key」和「Secret Access Key」,以供日後參考。
- 按一下「完成」。
- 選取「權限」分頁標籤。
- 在「權限政策」部分,按一下「新增權限」。
- 選取「新增權限」。
- 選取「Attach policies directly」。
- 搜尋 AmazonS3FullAccess 政策。
- 選取政策。
- 點選「下一步」。
- 按一下「Add permissions」。
在 Google SecOps 設定動態饋給,以便擷取 AWS Lambda 函式記錄
- 依序前往「設定」>「資料管理」>「動態饋給」。如果使用的是 SIEM 專用平台,請依序前往「設定」>「動態饋給」。
- 按一下「新增動態饋給」。
- 在下一頁,點按「設定單一動態饋給」。
- 在「動態饋給名稱」中輸入不重複的名稱。
- 在「來源類型」部分,選取「Amazon S3 V2」。
- 選取「AWS Lambda Function」做為「Log type」。
- 依序點按「繼續」和「提交」。
- 為下列欄位指定值:
- S3 URI:
s3://lambda-logs-to-secops/lambda-logs/ - 來源刪除選項:根據偏好選取刪除選項
- 檔案存在時間上限:納入過去幾天內修改過的檔案 (預設為 180 天)
- 存取金鑰 ID:可存取 S3 bucket 的使用者存取金鑰
- 私密存取金鑰:可存取 S3 bucket 的使用者私密金鑰
- 資產命名空間:資產命名空間
- 擷取標籤:要套用至這個動態饋給事件的標籤
- S3 URI:
- 依序點按「繼續」和「提交」。
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
Activity_id_label |
additional.fields |
已合併 |
Arrays_label |
additional.fields |
已合併 |
Name_label |
additional.fields |
已合併 |
Type_1_label |
additional.fields |
已合併 |
Type_id_label |
additional.fields |
已合併 |
Type_label |
additional.fields |
已合併 |
Uid_label |
additional.fields |
已合併 |
Uid_label_1 |
additional.fields |
已合併 |
Value_label |
additional.fields |
已合併 |
__type_label |
additional.fields |
已合併 |
attempts_label |
additional.fields |
已合併 |
class_name_label |
additional.fields |
已合併 |
contentType_label |
additional.fields |
已合併 |
env_label |
additional.fields |
已合併 |
extendedRequestId_label |
additional.fields |
已合併 |
feature_name_label |
additional.fields |
已合併 |
line_number_label |
additional.fields |
已合併 |
logType_label |
additional.fields |
已合併 |
product_name_label |
additional.fields |
已合併 |
requestid_label |
additional.fields |
已合併 |
sourceAccount_label |
additional.fields |
已合併 |
stack_label |
additional.fields |
已合併 |
totalRetryDelay_label |
additional.fields |
已合併 |
vendor_name_label |
additional.fields |
已合併 |
version_label |
additional.fields |
已合併 |
has_principal |
extensions.auth.type |
對應:true → AUTHTYPE_UNSPECIFIED |
description |
metadata.description |
直接對應 |
file_desc |
metadata.description |
直接對應 |
Time |
metadata.event_timestamp |
剖析為 UNIX |
time |
metadata.event_timestamp |
剖析為 yyyy-MM-ddTHH:mm:ss.SSSZ |
has_principal |
metadata.event_type |
對應:true → USER_LOGIN、true → NETWORK_HTTP、true → NETWORK_CONNECTION、`true... |
has_principal_user |
metadata.event_type |
對應:true → USER_RESOURCE_ACCESS |
Api.Operation |
metadata.product_event_type |
直接對應 |
name |
metadata.product_event_type |
直接對應 |
Api.Request.Uid |
metadata.product_log_id |
直接對應 |
id |
metadata.product_log_id |
直接對應 |
meta_data.requestId |
metadata.product_log_id |
直接對應 |
Metadata.Version |
metadata.product_version |
直接對應 |
version |
metadata.product_version |
直接對應 |
meta_data.httpStatusCode |
network.http.response_code |
直接對應 |
Http_request.User_agent |
network.http.user_agent |
直接對應 |
Actor.Invoked_by |
principal.administrative_domain |
直接對應 |
Src_endpoint.Domain |
principal.asset.hostname |
直接對應 |
Src_endpoint.Domain |
principal.hostname |
直接對應 |
Cloud.Region |
principal.resource.attribute.cloud.availability_zone |
直接對應 |
Actor.User.Name |
principal.user.userid |
直接對應 |
Status |
security_result.action_details |
直接對應 |
Category_name |
security_result.category_details |
已合併 |
error |
security_result.description |
直接對應 |
errorMessage |
security_result.description |
直接對應 |
Metadata_uid_label |
security_result.detection_fields |
已合併 |
category_uid_label |
security_result.detection_fields |
已合併 |
class_uid_label |
security_result.detection_fields |
已合併 |
errorType_label |
security_result.detection_fields |
已合併 |
event_code_label |
security_result.detection_fields |
已合併 |
fault_label |
security_result.detection_fields |
已合併 |
functionName_label |
security_result.detection_fields |
已合併 |
severity_id_label |
security_result.detection_fields |
已合併 |
sourceArn_label |
security_result.detection_fields |
已合併 |
type_name_label |
security_result.detection_fields |
已合併 |
type_uid_label |
security_result.detection_fields |
已合併 |
user_type_label |
security_result.detection_fields |
已合併 |
Severity |
security_result.severity |
對應:Informational → INFORMATIONAL |
severity |
security_result.severity |
對應:INFO → INFORMATIONAL |
msg |
security_result.summary |
直接對應 |
Api.Service.Name |
target.application |
直接對應 |
service |
target.application |
直接對應 |
size |
target.file.size |
直接對應 |
filename |
target.process.file.full_path |
直接對應 |
Activity_name |
target.resource.name |
直接對應 |
targetVar |
target.resource.name |
直接對應 |
| 不適用 | extensions.auth.type |
常數:AUTHTYPE_UNSPECIFIED |
| 不適用 | metadata.event_type |
常數:USER_UNCATEGORIZED |
| 不適用 | metadata.product_name |
常數:AWS_Lambda_Function |
| 不適用 | metadata.vendor_name |
常數:AWS_Lambda_Function |
| 不適用 | principal.resource.attribute.cloud.environment |
常數:AMAZON_WEB_SERVICES |
| 不適用 | security_result.severity |
常數:INFORMATIONAL |
變更記錄
還有其他問題嗎?向社群成員和 Google SecOps 專家尋求解答。