איסוף יומנים של פונקציות AWS Lambda
במאמר הזה מוסבר איך להטמיע יומנים של פונקציות AWS Lambda ב-Google Security Operations באמצעות Amazon S3.
AWS Lambda הוא שירות מחשוב ללא שרתים שמריץ את הקוד בתגובה לאירועים ומנהל באופן אוטומטי את משאבי המחשוב הבסיסיים. Lambda שולח באופן אוטומטי את כל יומני הפונקציות (יומני פלטפורמה, יומני הרחבות ופלט אפליקציות) אל Amazon CloudWatch Logs, ויוצר קבוצת יומנים לכל פונקציה. השילוב הזה משתמש ב-Amazon Data Firehose כדי להזרים אירועים ביומן של Lambda מ-CloudWatch Logs לקטגוריית S3, ש-Google SecOps מעכלת באמצעות פיד Amazon S3 V2.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מופע של Google SecOps
- גישה עם הרשאות למסוף הניהול של AWS לניהול:
- AWS Lambda (פונקציות, הגדרת רישום ביומן)
- Amazon CloudWatch Logs (קבוצות יומנים, מסנני מינוי)
- Amazon Data Firehose (מקורות נתונים)
- Amazon S3 (קטגוריות)
- AWS IAM (תפקידים, מדיניות, משתמשים)
אימות של קבוצת היומנים ב-CloudWatch Logs עבור פונקציית Lambda
מערכת AWS Lambda יוצרת באופן אוטומטי קבוצת יומנים של CloudWatch Logs לכל פונקציה כשהיא מופעלת בפעם הראשונה. מוסכמת השמות של קבוצות יומנים שמוגדרת כברירת מחדל היא:
/aws/lambda/<function-name>
כדי לבצע אימות:
- ב-AWS Console, עוברים אל CloudWatch > Logs > Log groups.
- חיפוש של
/aws/lambda/. מוודאים שקיימת קבוצת יומנים לכל פונקציית Lambda שרוצים להטמיע את היומנים שלה.
הגדרת קטגוריה של AWS S3
- יוצרים קטגוריה ב-Amazon S3 לפי המדריך למשתמש בנושא יצירת קטגוריה.
- שומרים את השם של ה-bucket ואת האזור לעיון בעתיד (לדוגמה,
lambda-logs-to-secops).
הגדרת תפקיד IAM ל-Amazon Data Firehose
Amazon Data Firehose דורש תפקיד IAM כדי לכתוב יומנים לקטגוריית S3.
יצירת מדיניות 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 > Roles > Create role (ניהול זהויות וגישה > תפקידים > יצירת תפקיד).
- בוחרים באפשרות מדיניות אמון בהתאמה אישית.
מדביקים את מדיניות ההרשאות הבאה:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }לוחצים על הבא.
מחפשים את LambdaLogsFirehoseS3Policy ובוחרים בו.
לוחצים על הבא.
בשדה שם התפקיד מזינים
LambdaLogsFirehoseToS3Role.לוחצים על יצירת תפקיד.
יצירת הזרם של Amazon Data Firehose
- פותחים את מסוף Kinesis בכתובת https://console.aws.amazon.com/kinesis.
- בחלונית הניווט, בוחרים באפשרות Amazon Data Firehose.
- לוחצים על יצירת מקור נתונים של Firehose.
- בקטע Choose source and destination (בחירת מקור ויעד), מציינים את ההגדרות הבאות:
- מקור: בוחרים באפשרות העלאה ישירה.
- יעד: בוחרים באפשרות Amazon S3.
- בשדה Firehose stream name, מזינים
lambda-logs-to-secops. בקטע Transform records (שינוי רשומות), בקטע Decompress source records from Amazon CloudWatch Logs (ביטול הדחיסה של רשומות המקור מ-Amazon CloudWatch Logs):
- בוחרים באפשרות הפעלת ביטול הדחיסה.
- לא בוחרים באפשרות הפעלה של חילוץ הודעות.
בקטע הגדרות יעד:
- קטגוריית S3: בוחרים את קטגוריית S3
lambda-logs-to-secops. - תחילית של מאגר S3 (אופציונלי): מזינים
lambda-logs/. - קידומת פלט שגיאה של S3 bucket (אופציונלי): מזינים
firehose-errors/.
- קטגוריית S3: בוחרים את קטגוריית S3
בקטע הצעות להוספת הפסקה בין פגישות:
- שטח אחסון זמני:
5MiB (ברירת מחדל). - הפסקה בין פגישות:
300שניות (ברירת מחדל).
- שטח אחסון זמני:
בקטע הגדרות מתקדמות:
- הצפנה בצד השרת: אופציונלי. מפעילים אם נדרשת הצפנה.
- רישום שגיאות ביומן: בוחרים באפשרות מופעל (מומלץ).
- הרשאות: בוחרים באפשרות בחירת תפקיד IAM קיים ואז בוחרים את
LambdaLogsFirehoseToS3Role.
לוחצים על יצירת מקור נתונים של Firehose.
מחכים עד שהסטטוס של השידור Status יהיה Active.
הגדרת תפקיד IAM ל-CloudWatch Logs
כדי לשלוח נתוני יומן לזרם Firehose, צריך להקצות תפקיד IAM ל-CloudWatch Logs.
יצירת מדיניות IAM
- עוברים אל IAM > מדיניות > יצירת מדיניות.
- לוחצים על הכרטיסייה JSON.
מדביקים את המדיניות הבאה (מחליפים את
<region>ואת<account-id>באזור ובמזהה החשבון שלכם ב-AWS):{ "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 > Roles > Create role (ניהול זהויות וגישה > תפקידים > יצירת תפקיד).
- בוחרים באפשרות מדיניות אמון בהתאמה אישית.
מדביקים את מדיניות ההרשאה הבאה (מחליפים את
<region>באזור AWS שלכם):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }לוחצים על הבא.
מחפשים את LambdaLogsCWLtoFirehosePolicy ובוחרים בו.
לוחצים על הבא.
בשדה שם התפקיד מזינים
LambdaLogsCWLtoFirehoseRole.לוחצים על יצירת תפקיד.
יצירת מסנן הרשמה ל-CloudWatch Logs
- ב-AWS Console, עוברים אל CloudWatch > Logs > Log groups.
- בוחרים את קבוצת היומנים
/aws/lambda/<function-name>. - בוחרים בכרטיסייה מסנני מינויים.
- לוחצים על Create > Create Amazon Data Firehose subscription filter (יצירה > יצירת מסנן מינוי של Amazon Data Firehose).
- מספקים את פרטי ההגדרה הבאים:
- יעד: בוחרים את זרם Firehose
lambda-logs-to-secops. - Grant permission (הענקת הרשאה): בוחרים את התפקיד
LambdaLogsCWLtoFirehoseRole. - שם מסנן המינוי: מזינים שם תיאורי (לדוגמה,
lambda-logs-to-secops-filter). - פורמט יומן: בוחרים באפשרות אחר.
- תבנית לסינון מינויים: אם רוצים לשלוח את כל אירועי היומן של פונקציית Lambda, משאירים את השדה הזה ריק.
- יעד: בוחרים את זרם Firehose
לוחצים על התחלת השידור.
הגדרת משתמש IAM ל-Google SecOps
Google SecOps צריך משתמש IAM עם גישה ל-S3 bucket כדי להטמיע את היומנים שנמסרו.
- יוצרים משתמש לפי מדריך המשתמש הזה: יצירת משתמש IAM.
- בוחרים את המשתמש שנוצר.
- לוחצים על הכרטיסייה פרטי כניסה לאבטחה.
- בקטע מפתחות גישה, לוחצים על יצירת מפתח גישה.
- בוחרים באפשרות שירות של צד שלישי בתור תרחיש שימוש.
- לוחצים על הבא.
- אופציונלי: מוסיפים תג תיאור.
- לוחצים על Create access key (יצירת מפתח גישה).
- לוחצים על הורדת קובץ CSV כדי לשמור את מפתח הגישה ואת מפתח הגישה הסודי לעיון עתידי.
- לוחצים על סיום.
- לוחצים על הכרטיסייה הרשאות.
- בקטע Permissions policies, לוחצים על Add permissions.
- לוחצים על הוספת הרשאות.
- בוחרים באפשרות צירוף מדיניות ישירות.
- מחפשים את המדיניות AmazonS3FullAccess.
- בוחרים את המדיניות.
- לוחצים על הבא.
- לוחצים על הוספת הרשאות.
הגדרת פיד ב-Google SecOps להטמעה של יומנים של פונקציות AWS Lambda
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- בדף הבא, לוחצים על הגדרת פיד יחיד.
- מזינים שם ייחודי בשם הפיד.
- בוחרים באפשרות Amazon S3 V2 בתור סוג המקור.
- בוחרים באפשרות פונקציה של AWS Lambda בתור סוג היומן.
- לוחצים על הבא ואז על שליחה.
- מציינים ערכים בשדות הבאים:
- S3 URI:
s3://lambda-logs-to-secops/lambda-logs/ - אפשרות למחיקת מקור: בוחרים את אפשרות המחיקה לפי ההעדפה שלכם
- הגיל המקסימלי של הקובץ: כולל קבצים שעברו שינוי במספר הימים האחרון (ברירת המחדל היא 180 ימים)
- מזהה מפתח הגישה: מפתח הגישה של המשתמש עם גישה לקטגוריית S3
- מפתח גישה סודי: מפתח סודי של משתמש עם גישה לקטגוריית S3
- מרחב שמות של נכס: מרחב השמות של הנכס
- תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה
- 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.