איסוף יומנים מאזור 1
גרסת כלי הניתוח: 3.0
במאמר הזה מוסבר איך להטמיע יומנים של Area 1 Email Security (של Cloudflare) ב-Google Security Operations באמצעות AWS S3. הכלי לניתוח מעבד את היומנים בפורמט JSON. הוא מחלץ שדות רלוונטיים ממבנה ה-JSON המקונן, ממפה אותם למודל הנתונים המאוחד (UDM) ומעשיר את הנתונים במידע גיאוגרפי ובפרטי אבטחה כמו גיבוב קבצים מצורפים וסיווג.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מופע של Google SecOps
- מארח עם Windows 2016 ואילך או Linux עם
systemd - אם מריצים מאחורי שרת proxy, היציאות של חומת האש פתוחות
- גישה עם הרשאות ל-Area 1 Email Security (של Cloudflare)
הגדרת AWS IAM וקטגוריית S3
- יוצרים קטגוריה ב-Amazon S3 לפי המדריך למשתמש: יצירת קטגוריה
- נכנסים למסוף AWS.
- עוברים אל S3 > Create bucket.
- מזינים שם לקטגוריה (לדוגמה,
area1-security-logs). - משאירים את הגדרות ברירת המחדל האחרות (או מגדירים הצפנה וניהול גרסאות אם צריך).
- לוחצים על יצירה.
- שומרים את השם והאזור של הקטגוריה לעיון עתידי.
- יוצרים משתמש לפי מדריך המשתמש הזה: יצירת משתמש IAM.
- בוחרים את המשתמש שנוצר.
- לוחצים על הכרטיסייה פרטי כניסה לאבטחה.
- בקטע מפתחות גישה, לוחצים על יצירת מפתח גישה.
- בוחרים באפשרות שירות של צד שלישי בתור תרחיש שימוש.
- לוחצים על הבא.
- אופציונלי: מוסיפים תג תיאור.
- לוחצים על Create access key (יצירת מפתח גישה).
- לוחצים על הורדת קובץ CSV ושומרים את מפתח הגישה ואת מפתח הגישה הסודי לעיון בהמשך.
- לוחצים על סיום.
- לוחצים על הכרטיסייה הרשאות.
- בקטע Permissions policies, לוחצים על Add permissions.
- בוחרים באפשרות צירוף מדיניות ישירות.
- מחפשים את המדיניות AmazonS3FullAccess.
- בוחרים את המדיניות.
- לוחצים על הבא.
- לוחצים על הוספת הרשאות.
קבלת פרטי כניסה ל-API של Area 1
- נכנסים ללוח הבקרה של Area 1 Security (Cloudflare).
- עוברים אל הגדרות > גישה ל-API.
- יוצרים את מפתח ה-API (טוקן).
- מעתיקים את האסימון ושומרים אותו במקום מאובטח.
הגדרת חבילות Python הנדרשות
נכנסים למארח של איסוף היומנים (לדוגמה, AWS VM) ומריצים את הפקודה הבאה כדי להגדיר את פרטי הכניסה של AWS:
pip install boto3 requests aws configure
יצירת הסקריפט Area 1 Log Puller
יוצרים את הקובץ הבא על ידי הקלדת
sudo vi area1_to_s3.py, ואז מעתיקים את הקוד הבא:- משנים את ההגדרות הבאות:
#!/usr/bin/env python3 import os import requests import boto3 import datetime import json # Configuration AREA1_API_TOKEN = os.environ.get("AREA1_API_TOKEN") # Load securely from env AWS_PROFILE = os.environ.get("AWS_PROFILE", None) # Optional, for named profiles S3_BUCKET_NAME = "area1-security-logs" LOG_TYPE = "events" # Time range end_time = datetime.datetime.utcnow() start_time = end_time - datetime.timedelta(days=1) def fetch_area1_logs(): url = f"https://api.area1security.com/v1/{LOG_TYPE}" headers = { "Authorization": f"Bearer {AREA1_API_TOKEN}", "Accept": "application/json" } params = { "startDate": start_time.strftime("%Y-%m-%dT%H:%M:%SZ"), "endDate": end_time.strftime("%Y-%m-%dT%H:%M:%SZ") } response = requests.get(url, headers=headers, params=params) response.raise_for_status() return response.json() def upload_to_s3(data): filename = f"area1_{LOG_TYPE}_{start_time.strftime('%Y%m%d')}.json" session = boto3.Session(profile_name=AWS_PROFILE) if AWS_PROFILE else boto3.Session() s3 = session.client("s3") s3.put_object( Bucket=S3_BUCKET_NAME, Key=f"logs/{filename}", Body=json.dumps(data).encode("utf-8"), ContentType="application/json" ) print(f"[✓] Uploaded {filename} to s3://{S3_BUCKET_NAME}/logs/") if __name__ == "__main__": logs = fetch_area1_logs() upload_to_s3(logs)שמירה ויציאה
vi: לוחצים עלescואז מקלידים:wq.
אחסון משתני הסביבה
יוצרים קובץ מאובטח לאחסון משתני סביבה ב-
/etc/area1.env(או ב-/home/user/.area1.env)export AREA1_API_TOKEN="your_actual_area1_api_token" export AWS_PROFILE="<your_aws_programmatic_username>"מוודאים שהקובץ מאובטח:
chmod 600 /etc/area1.env
הרצה ובדיקה של הסקריפט
מריצים את הסקריפט הבא:
python3 area1_to_s3.pyהפרטים שיוצגו:
Uploaded area1_events_20250701.json to s3://area1-security-logs/logs/
אוטומציה באמצעות Cron
יוצרים סקריפט Wrapper ל-Cron על ידי הרצת
sudo vi /usr/local/bin/run_area1.shואז מעתיקים את הקוד הבא:#!/usr/bin/env bash set -euo pipefail source /etc/area1.env /usr/bin/python3 /opt/scripts/area1_to_s3.pyהופכים את הקובץ לקובץ הפעלה:
chmod +x /usr/local/bin/run_area1.shמוגדר לפעול מדי יום בשעה 01:00 UTC:
crontab -e 0 1 * * * /usr/local/bin/run_area1.sh >> /var/log/area1_to_s3.log 2>&1
הגדרת פידים
יש שתי נקודות כניסה שונות להגדרת פידים בפלטפורמת Google SecOps:
- הגדרות SIEM > פידים
- מרכז התוכן > חבילות תוכן
הגדרת פידים מתוך 'הגדרות SIEM' > 'פידים'
כדי להגדיר פיד:
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- בדף הבא, לוחצים על הגדרת פיד יחיד.
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Area1 Logs). - בוחרים באפשרות Amazon S3 בתור סוג המקור.
- בוחרים באפשרות Area1 Security בתור סוג היומן.
- לוחצים על הבא.
מציינים ערכים לפרמטרים הבאים של הקלט:
- אזור: האזור שבו נמצאת קטגוריית Amazon S3.
- S3 URI: ה-URI של הקטגוריה (הפורמט צריך להיות:
s3://<your-log-bucket-name>). צריך להחליף את הערכים הבאים:-
your-log-bucket-name: שם הקטגוריה.
-
- URI is a: בוחרים באפשרות Directory which includes subdirectories.
- אפשרויות למחיקת מקורות: בוחרים את אפשרות המחיקה בהתאם להעדפות.
- מזהה מפתח הגישה: מפתח הגישה של המשתמש עם גישה לקטגוריית S3.
- מפתח גישה סודי: מפתח סודי של משתמש עם גישה לקטגוריית S3.
לוחצים על הבא.
בודקים את ההגדרות של הפיד החדש במסך סיום ולוחצים על שליחה.
הגדרת פידים ממרכז התוכן
מציינים ערכים בשדות הבאים:
אזור: האזור שבו נמצאת קטגוריית Amazon S3.
- S3 URI: ה-URI של הקטגוריה (הפורמט צריך להיות:
s3://<your-log-bucket-name>). צריך להחליף את הערכים הבאים:-
your-log-bucket-name: שם הקטגוריה.
-
- URI is a: בוחרים באפשרות Directory which includes subdirectories.
- אפשרויות למחיקת מקורות: בוחרים את אפשרות המחיקה בהתאם להעדפות.
- מזהה מפתח הגישה: מפתח הגישה של המשתמש עם גישה לקטגוריית S3.
- Secret Access Key (מפתח גישה סודי): המפתח הסודי של המשתמש עם גישה לדלי S3.§
- S3 URI: ה-URI של הקטגוריה (הפורמט צריך להיות:
אפשרויות מתקדמות
- שם הפיד: ערך שמאכלס מראש את השדה ומזהה את הפיד.
- סוג המקור: השיטה שבה נעשה שימוש כדי לאסוף יומנים ב-Google SecOps.
- מרחב שמות של נכס: מרחב השמות שמשויך לפיד.
- תוויות להעברה: תוויות שמוחלות על כל האירועים מהפיד הזה.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| alert_id | security_result.rule_id | הערך נלקח מהשדה alert_id. |
| alert_reasons | security_result.description | הערך נלקח מהשדה alert_reasons. |
| attachments.att_size | security_result.about.file.size | הערך נלקח מהשדה attachments.att_size ומומר למספר שלם לא מסומן. |
| attachments.disposition | security_result.about.user.attribute.labels.value | הערך נלקח מהשדה attachments.disposition. |
| attachments.extension | security_result.about.file.mime_type | הערך נלקח מהשדה attachments.extension. |
| attachments.md5 | security_result.about.file.md5 | הערך נלקח מהשדה attachments.md5. |
| attachments.name | security_result.about.file.full_path | הערך נלקח מהשדה attachments.name. |
| attachments.sha1 | security_result.about.file.sha1 | הערך נלקח מהשדה attachments.sha1. |
| attachments.sha256 | security_result.about.file.sha256 | הערך נלקח מהשדה attachments.sha256. |
| attachments.ssdeep | security_result.about.file.ssdeep | הערך נלקח מהשדה attachments.ssdeep. |
| delivery_mode | security_result.detection_fields.value | הערך נלקח מהשדה delivery_mode. |
| envelope_from | principal.user.email_addresses, network.email.from | הערך נלקח מהשדה envelope_from. |
| envelope_to | network.email.to, target.user.email_addresses | הערך נלקח מהשדה envelope_to. |
| final_disposition | security_result.category_details | הערך נלקח מהשדה final_disposition. |
| message_id | metadata.product_log_id | הערך נלקח מהשדה message_id אחרי הסרת התווים '<' ו-'>'. |
| replyto | network.email.bounce_address | הערך נלקח מהשדה replyto. |
| smtp_helo_server_ip | principal.ip | הערך נלקח מהשדה smtp_helo_server_ip. |
| smtp_helo_server_ip_as_name | principal.location.name | הערך נלקח מהשדה smtp_helo_server_ip_as_name. |
| smtp_helo_server_ip_as_number | principal.asset_id | הערך נלקח מהשדה smtp_helo_server_ip_as_number ומוסף לו הקידומת asset_id:. |
| smtp_helo_server_ip_geo | principal.location.country_or_region, principal.location.state, principal.location.city | הערך מחולץ מהשדה smtp_helo_server_ip_geo באמצעות תבנית Grok. |
| smtp_helo_server_name | principal.administrative_domain | הערך נלקח מהשדה smtp_helo_server_name. |
| מקור | metadata.vendor_name | הערך נלקח מהשדה source. אם השדה ריק, הערך שמוגדר הוא area1security. |
| נושא | network.email.subject | הערך נלקח מהשדה subject. |
| פעם | metadata.event_timestamp | הערך נלקח מהשדה time ומומר לחותמת זמן. |
| metadata.event_type | הערך הוא EMAIL_TRANSACTION. |
|
| metadata.product_name | הערך הוא AREA1. |
|
| metadata.log_type | הערך הוא AREA1. |
|
| security_result.about.user.attribute.labels.key | הערך הוא disposition. |
|
| security_result.category | הערך הוא SOFTWARE_MALICIOUS. |
|
| security_result.detection_fields.key | הערך הוא delivery_mode. |
|
envelope_to.0" instead of "replyto |
network.email.to |
מופה מיומן השינויים |
יומן שינויים
צפייה ביומן השינויים של מנתח התוכן הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.