איסוף יומנים של DNS בהתאמה אישית
גרסת כלי הניתוח: 1.0
במאמר הזה מוסבר איך להטמיע יומני DNS מותאמים אישית ב-Google Security Operations באמצעות Google Cloud Storage V2.
DNS מותאם אישית הוא סוג יומן כללי ליומנים של שרתי DNS מהטמעות DNS מותאמות אישית או לא נתמכות. הוא מתעד נתונים של שאילתות ותשובות DNS, כולל דומיינים, סוגי רשומות ופרטי לקוח. מכיוון שהיומנים האלה מגיעים ממקורות DNS לא סטנדרטיים, צריך לייצא אותם לקטגוריה של Google Cloud Storage (GCS), ואז להגדיר פיד של Google SecOps כדי להטמיע אותם.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מופע של Google SecOps
- פרויקט בענן של Google Cloud שמופעל בו Cloud Storage API
- הרשאות ליצירה ולניהול של מאגרי GCS
- הרשאות לניהול מדיניות IAM בקטגוריות GCS
- שרת או שירות DNS שמפיקים יומנים בפורמט נתמך (מומלץ להשתמש בפורמט JSON)
- הרשאת אדמין לשרת ה-DNS כדי להגדיר ייצוא של יומנים
יצירת קטגוריה של Google Cloud Storage
- נכנסים אל מסוף Google Cloud.
- בוחרים פרויקט או יוצרים פרויקט חדש.
- בתפריט הניווט, עוברים אל Cloud Storage > Buckets.
- לוחצים על Create bucket.
מספקים את פרטי ההגדרה הבאים:
הגדרה ערך Name your bucket (שם הקטגוריה) מזינים שם ייחודי גלובלית (לדוגמה, custom-dns-logs)סוג המיקום בוחרים לפי הצרכים (אזור, שני אזורים, מספר אזורים) Location בוחרים את המיקום הכי קרוב למופע של Google SecOps (לדוגמה, us-central1)סוג אחסון (storage class) רגיל (מומלץ ליומנים שמתבצעת אליהם גישה לעיתים קרובות) בקרת גישה אחיד (מומלץ) כלים להגנה אופציונלי: הפעלת ניהול גרסאות של אובייקטים או מדיניות שמירת נתונים לוחצים על יצירה.
הגדרת ייצוא אוטומטי של יומני DNS ל-GCS
השיטה לייצוא יומני DNS תלויה בהטמעה של שרת ה-DNS. בוחרים את הגישה שהכי מתאימה לסביבה שלכם.
אפשרות 1: יעד ב-Cloud Logging (לשרתי DNS ב-GCE)
אם שרת ה-DNS שלכם פועל במכונה וירטואלית ב-Google Compute Engine והיומנים נרשמים ב-Cloud Logging, אתם יכולים ליצור אובייקט מסוג sink כדי לייצא את יומני ה-DNS ישירות ל-GCS.
- במסוף GCP, עוברים אל Logging > Log Router.
- לוחצים על Create Sink.
מספקים את פרטי ההגדרה הבאים:
הגדרה ערך שם יעד custom-dns-to-gcsיעד Sink קטגוריה של Cloud Storage Bucket custom-dns-logsמסנן הכללה מסנן שתואם לרשומות ביומן ה-DNS (לדוגמה, resource.type="gce_instance" AND logName="projects/YOUR_PROJECT_ID/logs/dns")לוחצים על Create Sink.
אפשרות 2: Cloud Scheduler עם Cloud Build (לשרתי DNS מקומיים)
משתמשים ב-Cloud Build שמופעל על ידי Cloud Scheduler כדי להריץ משימת ייצוא בקונטיינר שאוספת יומני DNS משרת מרוחק וכותבת אותם ל-GCS.
יוצרים חשבון שירות למשימת הייצוא:
- במסוף GCP, עוברים אל IAM & Admin > Service Accounts.
- לוחצים על יצירת חשבון שירות.
- מספקים את פרטי ההגדרה הבאים:
- שם חשבון השירות: מזינים
dns-log-export-sa - תיאור חשבון השירות: מזינים
Service account for automated DNS log export to GCS
- שם חשבון השירות: מזינים
- לוחצים על יצירה והמשך.
- מוסיפים את התפקידים הבאים:
- אדמין של אובייקט אחסון (לכתיבת קבצים ב-GCS)
- עריכה ב-Cloud Build (להרצת משימות של Cloud Build)
- לוחצים על סיום.
יוצרים קובץ תצורת build של Cloud Build (
cloudbuild.yaml):steps: - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | # Collect DNS logs from your server # Replace with the actual command for your environment # Example: pull logs via syslog-ng, rsync from remote server, or query DNS log API curl -s -H "Authorization: Bearer $${API_TOKEN}" \ "https://your-dns-server.example.com/api/logs?format=json" \ -o /workspace/dns_logs.json # Upload to GCS gcloud storage cp /workspace/dns_logs.json \ gs://${_BUCKET_NAME}/dns/dns_logs_$(date -u +%Y%m%d_%H%M%S).json substitutions: _BUCKET_NAME: 'custom-dns-logs'יוצרים משימה של Cloud Scheduler כדי להפעיל את הבנייה:
- במסוף GCP, עוברים אל Cloud Scheduler.
- לוחצים על Create Job (יצירת משימה).
מספקים את פרטי ההגדרה הבאים:
הגדרה ערך שם dns-log-export-hourlyאזור בוחרים את אותו אזור שבו נמצא מאגר GCS תדירות 0 * * * *(כל שעה)אזור זמן UTC (מומלץ) סוג הטירגוט HTTP כתובת URL https://cloudbuild.googleapis.com/v1/projects/YOUR_PROJECT_ID/buildsשיטת HTTP POST כותרת אימות הוספת טוקן OAuth חשבון שירות dns-log-export-sa@YOUR_PROJECT_ID.iam.gserviceaccount.comלוחצים על יצירה.
אפשרות 3: Storage Transfer Service (למערכות קבצים מקומיות)
אם יומני ה-DNS נכתבים למערכת קבצים מקומית, צריך להשתמש ב-Storage Transfer Service עם Transfer Agent כדי להעביר אותם ל-GCS.
- ב-GCP Console, עוברים אל Storage Transfer Service.
- לוחצים על Transfer.
- בוחרים באפשרות POSIX filesystem כמקור.
- פועלים לפי ההוראות כדי להתקין את הסוכן להעברת נתונים בשרת ה-DNS או במחשב עם גישה לקובצי היומן של ה-DNS.
מגדירים את עבודת ההעברה:
הגדרה ערך ספריית קובצי המקור הנתיב לספרייה של קובץ היומן של ה-DNS קטגוריית יעד custom-dns-logsנתיב ליעד dns/תזמון הגדרת לוח זמנים חוזר (לדוגמה, כל שעה) לוחצים על יצירה.
אחזור חשבון השירות של Google SecOps
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- לוחצים על Configure a single feed (הגדרת פיד יחיד).
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Custom DNS Logs). - בוחרים באפשרות Google Cloud Storage V2 בתור סוג המקור.
- בוחרים באפשרות DNS בהתאמה אישית בתור סוג היומן.
- לוחצים על קבלת חשבון שירות.
תוצג כתובת האימייל בחשבון שירות ייחודי, לדוגמה:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comמעתיקים את כתובת האימייל הזו לשימוש בשלב הבא.
הענקת הרשאות IAM לחשבון השירות של Google SecOps
לחשבון השירות של Google SecOps צריך להיות התפקיד צפייה באובייקט אחסון בקטגוריה של GCS.
- עוברים אל Cloud Storage > Buckets (קטגוריות).
- לוחצים על שם הקטגוריה (לדוגמה,
custom-dns-logs). - עוברים לכרטיסייה Permissions.
- לוחצים על הענקת גישה.
- מספקים את פרטי ההגדרה הבאים:
- Add principals (הוספת ישויות מורשות): מדביקים את כתובת האימייל בחשבון של חשבון השירות של Google SecOps (לדוגמה,
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com). - הקצאת תפקידים: בוחרים באפשרות צפייה באובייקט אחסון.
- Add principals (הוספת ישויות מורשות): מדביקים את כתובת האימייל בחשבון של חשבון השירות של Google SecOps (לדוגמה,
לוחצים על Save.
הגדרת הפיד של Google SecOps
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- לוחצים על Configure a single feed (הגדרת פיד יחיד).
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Custom DNS Logs). - בוחרים באפשרות Google Cloud Storage V2 בתור סוג המקור.
- בוחרים באפשרות DNS בהתאמה אישית בתור סוג היומן.
- לוחצים על הבא.
מציינים ערכים לפרמטרים הבאים של הקלט:
URI של קטגוריית אחסון: מזינים את ה-URI של קטגוריית GCS:
gs://custom-dns-logs/dns/- מחליפים את
custom-dns-logsבשם של קטגוריית GCS. - מחליפים את
dnsבנתיב הקידומת שהגדרתם.
- מחליפים את
אפשרות למחיקת המקור: בוחרים את אפשרות המחיקה לפי ההעדפה שלכם:
- אף פעם: לא נמחקים קבצים אחרי ההעברה (מומלץ לבדיקות).
מחיקת קבצים שהועברו וספריות ריקות: מחיקת קבצים וספריות ריקות אחרי שההעברה מסתיימת בהצלחה.
הגיל המקסימלי של הקובץ: כולל קבצים ששונו במספר הימים האחרון (ברירת המחדל היא 180 ימים).
מרחב השמות של הנכס: מרחב השמות של הנכס.
תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה.
לוחצים על הבא.
בודקים את ההגדרות של הפיד החדש במסך סיום ולוחצים על שליחה.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
receiveTimestamp |
metadata.event_timestamp |
ניתוח הכתובות שברשימה: RFC 3339 |
message |
metadata.event_type |
מיפוי: "dns_query" → NETWORK_DNS |
jsonPayload.msg |
metadata.product_event_type |
מיפוי ישיר |
insertId |
metadata.product_log_id |
מיפוי ישיר |
message |
metadata.product_name |
מיפוי: "dns_query" → Custom DNS |
message |
metadata.vendor_name |
מיפוי: "dns_query" → CUSTOM |
message |
network.application_protocol |
מיפוי: "dns_query" → DNS |
dns_answers |
network.dns.answers |
ממוזג |
message |
network.dns.answers |
מיפוי: "dns_query" → dns_answers |
dns_question |
network.dns.questions |
ממוזג |
message |
network.dns.questions |
מיפוי: "dns_query" → dns_question |
dns.response_code |
network.dns.response_code |
שם שונה/מיפוי |
message |
principal.hostname |
מיפוי: "dns_query" → jsonPayload.dns_query.server |
jsonPayload.dns_query.server |
principal.ip |
ממוזג |
message |
principal.ip |
מיפוי: "dns_query" → jsonPayload.dns_query.server |
message |
security_result |
מיפוי: "dns_query" → security_result |
logName |
security_result.category_details |
ממוזג |
message |
security_result.category_details |
מיפוי: "dns_query" → logName |
message |
security_result.severity |
מיפוי: "dns_query" ← INFORMATIONAL, "dns_query" ← MEDIUM, "dns_query" ← HIGH |
labels.application |
target.application |
מיפוי ישיר |
message |
target.hostname |
מיפוי: "dns_query" → jsonPayload.dns_query.server |
jsonPayload.dns_query.server |
target.ip |
ממוזג |
message |
target.ip |
מיפוי: "dns_query" → jsonPayload.dns_query.server |
component_label |
target.labels |
ממוזג |
instance_group_label |
target.labels |
ממוזג |
message |
target.labels |
מיפוי: "dns_query" ← component_label, "dns_query" ← instance_group_label |
labels.region |
target.location.country_or_region |
מיפוי ישיר |
resource.labels.zone |
target.resource.attribute.cloud.availability_zone |
מיפוי ישיר |
message |
target.resource.attribute.cloud.environment |
מיפוי: "dns_query" → GOOGLE_CLOUD_PLATFORM |
resource.labels.project_id |
target.resource.attribute.cloud.project.id |
מיפוי ישיר |
message |
target.resource.resource_type |
מיפוי: "dns_query" → VIRTUAL_MACHINE |
| לא רלוונטי | metadata.event_type |
קבוע: NETWORK_DNS |
| לא רלוונטי | metadata.product_name |
קבוע: Custom DNS |
| לא רלוונטי | metadata.vendor_name |
קבוע: CUSTOM |
| לא רלוונטי | network.application_protocol |
קבוע: DNS |
| לא רלוונטי | principal.hostname |
קבוע: jsonPayload.dns_query.server |
| לא רלוונטי | security_result.severity |
קבוע: INFORMATIONAL |
| לא רלוונטי | target.hostname |
קבוע: jsonPayload.dns_query.server |
| לא רלוונטי | target.resource.attribute.cloud.environment |
קבוע: GOOGLE_CLOUD_PLATFORM |
| לא רלוונטי | target.resource.resource_type |
קבוע: VIRTUAL_MACHINE |
יומן שינויים
צפייה ביומן השינויים של מנתח התוכן הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.