收集 AWS Lambda 函式記錄
本文說明如何使用 Amazon S3,將 AWS Lambda 函式記錄檔擷取至 Google Security Operations。
AWS Lambda 是一項無伺服器運算服務,可執行程式碼以因應事件,並自動管理基礎運算資源。Lambda 會自動將所有函式記錄 (平台記錄、擴充功能記錄和應用程式輸出內容) 傳送至 Amazon CloudWatch Logs,並為每個函式建立記錄群組。這項整合功能會使用 Amazon Data Firehose,將 CloudWatch Logs 中的 Lambda 記錄事件串流至 S3 值區,然後 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 儲存空間
- 按照這份使用者指南建立 Amazon S3 bucket:建立 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」>「角色」>「建立角色」。
- 選取「自訂信任政策」。
貼上下列信任政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }點選「下一步」。
搜尋並選取「LambdaLogsFirehoseS3Policy」LambdaLogsFirehoseS3Policy。
點選「下一步」。
在「角色名稱」欄位中輸入
LambdaLogsFirehoseToS3Role。按一下「建立角色」。
建立 Amazon Data Firehose 串流
- 前往 https://console.aws.amazon.com/kinesis 開啟 Kinesis 控制台。
- 在導覽窗格中,選取「Amazon Data Firehose」。
- 按一下「建立 Firehose 串流」。
- 在「選擇來源和目的地」下方,提供下列設定:
- 來源:選取「直接 PUT」。
- 目的地:選取「Amazon S3」。
- 在「Firehose stream name」(Firehose 串流名稱) 欄位中輸入
lambda-logs-to-secops。 在「轉換記錄」下方的「從 Amazon CloudWatch Logs 解壓縮來源記錄」部分中:
- 選取「開啟解壓縮功能」。
- 請「不要」選取「開啟訊息擷取功能」。
在「目的地設定」下方:
- S3 儲存貯體:選取 S3 儲存貯體
lambda-logs-to-secops。 - S3 bucket prefix (選用):輸入
lambda-logs/。 - S3 值區錯誤輸出前置字串 (選用):輸入
firehose-errors/。
- S3 儲存貯體:選取 S3 儲存貯體
在「緩衝區提示」下方:
- 緩衝區大小:
5MiB (預設)。 - 緩衝區間隔:
300秒 (預設)。
- 緩衝區大小:
在「進階設定」下方,完成下列操作:
- 伺服器端加密:選用。如需加密,請啟用這項設定。
- 錯誤記錄:選取「已啟用」 (建議)。
- 權限:選取「選擇現有的 IAM 角色」,然後選取
LambdaLogsFirehoseToS3Role。
按一下「建立 Firehose 串流」。
等待串流「狀態」顯示為「有效」。
設定 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」>「角色」>「建立角色」。
- 選取「自訂信任政策」。
貼上下列信任政策 (將
<region>替換成您的 AWS 區域):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }點選「下一步」。
搜尋並選取「LambdaLogsCWLtoFirehosePolicy」LambdaLogsCWLtoFirehosePolicy。
點選「下一步」。
在「角色名稱」欄位中輸入
LambdaLogsCWLtoFirehoseRole。按一下「建立角色」。
建立 CloudWatch Logs 訂閱篩選器
- 在 AWS 控制台中,依序前往「CloudWatch」>「Logs」>「Log groups」。
- 選取記錄群組
/aws/lambda/<function-name>。 - 選取「訂閱篩選條件」分頁標籤。
- 依序點選「建立」> 建立 Amazon Data Firehose 訂閱篩選器。
- 請提供下列設定詳細資料:
- 目的地:選取 Firehose 串流
lambda-logs-to-secops。 - 授予權限:選取
LambdaLogsCWLtoFirehoseRole角色。 - 訂閱篩選器名稱:輸入描述性名稱 (例如
lambda-logs-to-secops-filter)。 - 記錄格式:選取「其他」。
- 訂閱篩選模式:留空即可傳送所有 Lambda 函式記錄事件。
- 目的地:選取 Firehose 串流
按一下「開始串流播放」。
為 Google SecOps 設定 IAM 使用者
Google SecOps 需要具備 S3 值區存取權的 IAM 使用者,才能擷取傳送的記錄。
- 請按照這份使用者指南建立使用者:建立 IAM 使用者。
- 選取建立的「使用者」。
- 選取「安全憑證」分頁標籤。
- 在「Access Keys」部分中,按一下「Create Access Key」。
- 選取「第三方服務」做為「用途」。
- 按一下「下一步」。
- 新增說明標記 (如有需要)。
- 按一下「建立存取金鑰」。
- 按一下「Download .csv file」(下載 .csv 檔案),儲存「Access Key」(存取金鑰) 和「Secret Access Key」(私密存取金鑰),以供日後參考。
- 按一下 [完成]。
- 選取「權限」分頁標籤。
- 在「權限政策」部分中,按一下「新增權限」。
- 選取「新增權限」。
- 選取「直接附加政策」。
- 搜尋「AmazonS3FullAccess」AmazonS3FullAccess政策。
- 選取政策。
- 點選「下一步」。
- 按一下「Add permissions」。
在 Google SecOps 中設定動態饋給,擷取 AWS Lambda 函式記錄
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 輸入動態饋給名稱的專屬名稱。
- 選取「Amazon S3 V2」做為「來源類型」。
- 選取「AWS Lambda Function」(AWS Lambda 函式) 做為「Log type」(記錄類型)。
- 依序點按「繼續」和「提交」。
- 為下列欄位指定值:
- S3 URI:
s3://lambda-logs-to-secops/lambda-logs/ - 來源刪除選項:根據偏好設定選取刪除選項
- 檔案存在時間上限:包含在過去天數內修改的檔案 (預設為 180 天)
- 存取金鑰 ID:具有 S3 值區存取權的使用者存取金鑰
- 存取密鑰:具有 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 專業人員尋求答案。