איסוף יומנים של פונקציות AWS Lambda
גרסת המנתח: 2.0
במאמר הזה מוסבר איך להטמיע יומנים של פונקציות AWS Lambda ב-Google Security Operations באמצעות Amazon S3.
AWS Lambda הוא שירות מחשוב ללא שרת (serverless) שמריץ את הקוד שלכם בתגובה לאירועים ומנהל באופן אוטומטי את משאבי המחשוב הבסיסיים. Lambda שולחת באופן אוטומטי את כל יומני הפונקציות (יומני פלטפורמה, יומני תוספים ופלט של אפליקציות) ל-Amazon CloudWatch Logs, ויוצרת קבוצת יומנים לכל פונקציה. בשילוב הזה, Amazon Data Firehose משמש להעברת אירועים ביומן של Lambda בסטרימינג מ-CloudWatch Logs לקטגוריה של S3, ואז Google SecOps מטמיע אותם באמצעות פיד של Amazon S3 V2.
לפני שמתחילים
חשוב לוודא שיש לכם את הדברים הבאים:
- מכונה של Google SecOps
- גישה עם הרשאות ניהול ל-AWS Management Console עם הרשאות לניהול:
- AWS Lambda (פונקציות, הגדרות רישום ביומן)
- Amazon CloudWatch Logs (קבוצות של יומנים, מסנני מינויים)
- Amazon Data Firehose (מקורות נתונים להעברה)
- Amazon S3 (קטגוריות)
- AWS IAM (תפקידים, כללי מדיניות, משתמשים)
אימות קבוצת היומנים של CloudWatch Logs לפונקציית Lambda
בפעם הראשונה שמופעלת פונקציה, AWS Lambda יוצרת באופן אוטומטי קבוצת יומנים ב-CloudWatch Logs. מוסכמת ברירת המחדל למתן שמות לקבוצות של יומנים היא:
/aws/lambda/<function-name>
כדי לבצע אימות:
- במסוף AWS, נכנסים אל CloudWatch > Logs > Log groups.
- חיפוש של
/aws/lambda/. מוודאים שקיימת קבוצת יומנים לכל פונקציית Lambda שאת היומנים שלה רוצים להטמיע.
הגדרת קטגוריית AWS S3
- יוצרים קטגוריה של Amazon S3 לפי המדריך למשתמש: יצירת קטגוריה.
- שומרים את שם הקטגוריה ואת האזור שלה לעיון בעתיד (לדוגמה,
lambda-logs-to-secops).
הגדרת תפקיד IAM ל-Amazon Data Firehose
Amazon Data Firehose דורש תפקיד IAM כדי לכתוב יומנים לקטגוריית S3.
יצירת מדיניות IAM
- ב-AWS Console, עוברים אל 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.לוחצים על Create policy.
יצירת תפקיד IAM
- עוברים אל IAM > Roles > Create role.
- בוחרים באפשרות מדיניות אמון בהתאמה אישית.
מדביקים את מדיניות האמון הבאה:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }לוחצים על הבא.
מחפשים את LambdaLogsFirehoseS3Policy ובוחרים בה.
לוחצים על הבא.
בשדה Role name, מזינים את הערך
LambdaLogsFirehoseToS3Role.לוחצים על יצירת תפקיד.
יצירת מקור הנתונים של Amazon Data Firehose
- פותחים את מסוף Kinesis בכתובת https://console.aws.amazon.com/kinesis.
- בחלונית הניווט, בוחרים באפשרות Amazon Data Firehose.
- לוחצים על Create Firehose stream (יצירת מקור נתונים של Firehose).
- בקטע 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:
- לוחצים על הפעלת דחיסה.
- לא בוחרים באפשרות הפעלת חילוץ הודעות.
בקטע הגדרות יעד:
- קטגוריית S3: בוחרים את קטגוריית S3
lambda-logs-to-secops. - S3 bucket prefix (אופציונלי): מזינים
lambda-logs/. - S3 bucket error output prefix (אופציונלי): מזינים
firehose-errors/.
- קטגוריית S3: בוחרים את קטגוריית S3
בקטע הצעות לזמן הפסקה:
- שטח אחסון זמני:
5MiB (ברירת מחדל). - מרווח זמן בין פגישות:
300שניות (ברירת מחדל).
- שטח אחסון זמני:
בקטע הגדרות מתקדמות:
- הצפנה בצד השרת: אופציונלי. צריך להפעיל אם נדרשת הצפנה.
- רישום שגיאות ביומן: בוחרים באפשרות מופעל (מומלץ).
- Permissions: בוחרים באפשרות Choose existing IAM role ואז בוחרים את
LambdaLogsFirehoseToS3Role.
לוחצים על Create Firehose stream (יצירת מקור נתונים של Firehose).
מחכים עד שהסטטוס של השידור יהיה פעיל.
הגדרת תפקיד IAM ליומני CloudWatch
כדי לשלוח נתוני יומנים לסטרימינג של Firehose, צריך תפקיד IAM ב-CloudWatch Logs.
יצירת מדיניות IAM
- עוברים אל IAM > Policies > Create policy.
- לוחצים על הכרטיסייה 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.לוחצים על Create policy.
יצירת תפקיד IAM
- עוברים אל IAM > Roles > Create role.
- בוחרים באפשרות מדיניות אמון בהתאמה אישית.
מדביקים את מדיניות האמון הבאה (מחליפים את
<region>באזור שלכם ב-AWS):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }לוחצים על הבא.
מחפשים את LambdaLogsCWLtoFirehosePolicy ובוחרים בה.
לוחצים על הבא.
בשדה Role name, מזינים את הערך
LambdaLogsCWLtoFirehoseRole.לוחצים על יצירת תפקיד.
יצירת מסנן מינויים ב-CloudWatch Logs
- במסוף AWS, נכנסים אל CloudWatch > Logs > Log groups.
- בוחרים את קבוצת היומנים
/aws/lambda/<function-name>. - לוחצים על הכרטיסייה מסנני מינויים.
- לוחצים על Create > Create Amazon Data Firehose subscription filter.
- מזינים את פרטי ההגדרה הבאים:
- יעד: בוחרים את מקור הנתונים של Firehose
lambda-logs-to-secops. - מתן הרשאה: בוחרים את התפקיד
LambdaLogsCWLtoFirehoseRole. - שם מסנן המינוי: מזינים שם תיאורי (לדוגמה,
lambda-logs-to-secops-filter). - פורמט היומן: בוחרים באפשרות אחר.
- Subscription filter pattern: משאירים את השדה ריק כדי לשלוח את כל אירועי היומן של פונקציית Lambda.
- יעד: בוחרים את מקור הנתונים של Firehose
לוחצים על התחלת השידור.
הגדרת משתמש IAM ל-Google SecOps
כדי להטמיע את היומנים שנשלחו, Google SecOps צריך משתמש IAM עם גישה לקטגוריית S3.
- יוצרים משתמש לפי המדריך למשתמש: יצירת משתמש IAM.
- בוחרים את המשתמש שנוצר.
- לוחצים על הכרטיסייה פרטי כניסה מאובטחים.
- לוחצים על Create Access Key בקטע Access Keys.
- בקטע תרחיש לדוגמה, בוחרים באפשרות שירות של צד שלישי.
- לוחצים על הבא.
- אופציונלי: מוסיפים תג תיאור.
- לוחצים על יצירת מפתח גישה.
- לוחצים על Download .csv file כדי לשמור את Access Key ואת Secret Access Key לשימוש עתידי.
- לוחצים על סיום.
- לוחצים על הכרטיסייה הרשאות.
- בקטע מדיניות הרשאות, לוחצים על הוספת הרשאות.
- לוחצים על הוספת הרשאות.
- בוחרים באפשרות Attach policies directly.
- מחפשים את המדיניות AmazonS3FullAccess.
- בוחרים את המדיניות.
- לוחצים על הבא.
- לוחצים על הוספת הרשאות.
הגדרת פיד ב-Google SecOps כדי להטמיע יומנים של פונקציות AWS Lambda
- עוברים אל הגדרות > ניהול נתונים > פידים. אם אתם משתמשים בפלטפורמה של SIEM בלבד, עוברים אל הגדרות > פידים.
- לוחצים על הוספת פיד חדש.
- בדף הבא, לוחצים על הגדרת פיד יחיד.
- מזינים שם ייחודי בשדה שם הפיד.
- בוחרים באפשרות Amazon S3 V2 בתור סוג המקור.
- בוחרים באפשרות AWS Lambda Function בתור Log type.
- לוחצים על הבא ואז על שליחה.
- מציינים ערכים בשדות הבאים:
- S3 URI:
s3://lambda-logs-to-secops/lambda-logs/ - אפשרות מחיקת מקור: בוחרים את אפשרות המחיקה לפי ההעדפה שלכם.
- גיל הקובץ המקסימלי: כולל קבצים ששונו במספר הימים האחרונים (ברירת המחדל היא 180 ימים)
- מזהה מפתח הגישה: מפתח גישה של משתמש עם גישה לקטגוריית S3
- מפתח גישה סודי: מפתח סודי של משתמש עם גישה לקטגוריית S3
- מרחב השמות של הנכס: מרחב השמות של הנכס
- תוויות הטמעה: התווית שתתווסף לאירועים מהפיד הזה
- S3 URI:
- לוחצים על הבא ואז על שליחה.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | Logic (פונקציה לוגית) |
|---|---|---|
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.