איסוף יומני NGINX

נתמך ב:

במאמר הזה מוסבר איך להטמיע יומני NGINX ב-Google Security Operations באמצעות סוכן Bindplane.

‫NGINX הוא שרת אינטרנט ופרוקסי הפוך שמפיק הודעות syslog לאירועי גישה ל-HTTP, לאירועי שגיאה, לפעילות אימות ולפרטי תהליך. הכלי לניתוח מחלץ שדות מפורמטים שונים של יומנים (syslog, ‏ JSON, יומני גישה) באמצעות דפוסי grok וממפה אותם למודל הנתונים המאוחד (UDM).

לפני שמתחילים

חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:

  • מופע של Google SecOps
  • ‫Windows Server 2016 ואילך, או מארח Linux עם systemd
  • קישוריות רשת בין סוכן Bindplane לבין שרת NGINX
  • אם מריצים את הסוכן מאחורי שרת proxy, מוודאים שיציאות חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane
  • הרשאת אדמין למארח NGINX

קבלת קובץ אימות להטמעת נתונים ב-Google SecOps

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל SIEM Settings > Collection Agents (הגדרות SIEM > סוכני איסוף).
  3. מורידים את קובץ האימות להטמעת נתונים.
  4. שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן סוכן Bindplane.

איך מקבלים את מספר הלקוח ב-Google SecOps

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל SIEM Settings > Profile (הגדרות SIEM > פרופיל).
  3. מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.

התקנת סוכן Bindplane

מתקינים את סוכן Bindplane במערכת ההפעלה Windows או Linux לפי ההוראות הבאות.

התקנת Windows

  1. פותחים את שורת הפקודה או את PowerShell כאדמין.
  2. מריצים את הפקודה הבאה:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. מחכים שההתקנה תסתיים.

  4. כדי לוודא שההתקנה בוצעה, מריצים את הפקודה:

    sc query observiq-otel-collector
    

    השירות אמור להופיע עם הערך RUNNING.

התקנה של Linux

  1. פותחים טרמינל עם הרשאות root או sudo.
  2. מריצים את הפקודה הבאה:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. מחכים שההתקנה תסתיים.

  4. כדי לוודא שההתקנה בוצעה, מריצים את הפקודה:

    sudo systemctl status observiq-otel-collector
    

    השירות צריך להופיע כפעיל (פועל).

מקורות מידע נוספים להתקנה

אפשרויות התקנה נוספות ופתרון בעיות מפורטים במדריך להתקנת סוכן Bindplane.

הגדרה של סוכן Bindplane להטמעה של syslog ושליחה אל Google SecOps

איתור קובץ התצורה

  • ‫Linux:

    sudo nano /opt/observiq-otel-collector/config.yaml
    
  • ‫Windows:

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

עריכת קובץ התצורה

  • מחליפים את כל התוכן של config.yaml בהגדרה הבאה:

    receivers:
        udplog:
            listen_address: "0.0.0.0:514"
    
    exporters:
        chronicle/nginx:
            compression: gzip
            creds_file_path: '/etc/bindplane-agent/ingestion-auth.json'
            customer_id: '<customer_id>'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: NGINX
            raw_log_field: body
    
    service:
        pipelines:
            logs/nginx_to_chronicle:
                receivers:
                    - udplog
                exporters:
                    - chronicle/nginx
    

פרמטרים להגדרה

מחליפים את ה-placeholders הבאים:

  • הגדרת מקלט:

    • ‫listen_address: כתובת ה-IP והיציאה להאזנה:
      • ‫0.0.0.0 כדי להאזין בכל הממשקים (מומלץ)
      • יציאה 514 היא יציאת syslog רגילה (נדרשת הרשאת root ב-Linux; אפשר להשתמש ביציאה 1514 ללא הרשאת root)
  • הגדרות של הכלי לייצוא:

    • ‫creds_file_path: הנתיב המלא לקובץ האימות להטמעת נתונים:
      • ‫Linux: /etc/bindplane-agent/ingestion-auth.json
      • ‫Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
    • ‫customer_id: מספר הלקוח שהועתק ממסוף Google SecOps
    • endpoint: Regional endpoint URL:
      • ארה"ב: malachiteingestion-pa.googleapis.com
      • אירופה: europe-malachiteingestion-pa.googleapis.com
      • אסיה: asia-southeast1-malachiteingestion-pa.googleapis.com
      • רשימה מלאה מופיעה במאמר בנושא נקודות קצה אזוריות.

שמירת קובץ ההגדרות

  • אחרי שמסיימים לערוך, שומרים את הקובץ:
    • ‫Linux: מקישים על Ctrl+O, אחר כך על Enter ואז על Ctrl+X
    • ‫Windows: לוחצים על קובץ > שמירה.

מפעילים מחדש את סוכן Bindplane כדי להחיל את השינויים.

  • כדי להפעיל מחדש את סוכן Bindplane ב-Linux, מריצים את הפקודה הבאה:

    sudo systemctl restart observiq-otel-collector
    
    1. מוודאים שהשירות פועל:

      sudo systemctl status observiq-otel-collector
      
    2. בודקים אם יש שגיאות ביומנים:

      sudo journalctl -u observiq-otel-collector -f
      
  • כדי להפעיל מחדש את סוכן Bindplane ב-Windows, בוחרים באחת מהאפשרויות הבאות:

    • שורת פקודה או PowerShell כאדמין:

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • מסוף השירותים:

      1. מקישים על Win+R, מקלידים services.msc ומקישים על Enter.
      2. מחפשים את observIQ OpenTelemetry Collector.
      3. לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
      4. מוודאים שהשירות פועל:

        sc query observiq-otel-collector
        
      5. בודקים אם יש שגיאות ביומנים:

        type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
        

הגדרת NGINX להעברת יומנים אל Bindplane

  1. פותחים את קובץ ההגדרות של NGINX (לדוגמה, /etc/nginx/nginx.conf):

    sudo vi /etc/nginx/nginx.conf
    
  2. עורכים את ההגדרה ומחליפים את הערכים <BINDPLANE_SERVER> ו-<BINDPLANE_PORT> בערכים שלכם:

    http {
        access_log syslog:server=<BINDPLANE_SERVER>:<BINDPLANE_PORT>,facility=local7,tag=nginx_access;
        error_log syslog:server=<BINDPLANE_SERVER>:<BINDPLANE_PORT>,facility=local7,tag=nginx_error;
    }
    
  3. מפעילים מחדש את NGINX כדי להחיל את השינויים:

    sudo systemctl reload nginx
    

טבלת מיפוי UDM

שדה היומן מיפוי UDM לוגיקה
_Internal_WorkspaceResourceId target.resource.product_object_id מיפוי ישיר
Computer principal.asset.hostname מיפוי ישיר
Facility additional.fields[facility] מיפוי ישיר
HostName principal.asset.hostname ממופה ישירות אם src_ip לא מופיע
ProcessName principal.application מיפוי ישיר
SeverityLevel security_result.severity ממופה לערך INFORMATIONAL אם הערך הוא info
SourceSystem principal.asset.platform ממופה ל-LINUX אם הערך תואם ל-Linux
SyslogMessage כמה שדות הניתוח מתבצע באמצעות grok כדי לחלץ את time, method, target_path, protocol, response_code, referral_url, user_agent, target_ip, target_host ו-cache
TenantId additional.fields[TenantId] מיפוי ישיר
acct principal.user.user_id ממופה ישירות אם הוא לא ריק או ?
addr principal.asset.ip מיפוי ישיר
audit_epoch metadata.event_timestamp הומר לחותמת זמן בפורמט UNIX. ננו-שניות מחולצות מהודעת היומן המקורית.
cache additional.fields[cache] מיפוי ישיר
collection_time.nanos metadata.event_timestamp.nanos משמש לציון ננו-שניות של חותמת הזמן של האירוע, אם זמין
collection_time.seconds metadata.event_timestamp.seconds משמש לציון השניות בחותמת הזמן של האירוע, אם יש כאלה
data כמה שדות מקור הנתונים העיקרי, שמנותח באופן שונה בהתאם לפורמט היומן (Syslog,‏ JSON או אחר)
exe target.process.command_line ממופה ישירות אחרי הסרת לוכסנים הפוכים ומרכאות
hostname principal.asset.hostname או principal.asset.ip אם זה כתובת IP, ממופה ל-principal.asset.ip. אחרת, ממופה לכתובת principal.asset.hostname
msg metadata.description ממופה ישירות כתיאור
node target.asset.hostname מיפוי ישיר
pid target.process.pid מיפוי ישיר
protocol network.application_protocol ממופה ל-HTTP אם הערך תואם ל-HTTP
referral_url network.http.referral_url ממופה ישירות אם הוא לא ריק או -
res security_result.action_details מיפוי ישיר
response_code network.http.response_code ממופה ישירות ומומר למספר שלם
ses network.session_id מיפוי ישיר
src_ip principal.asset.ip מיפוי ישיר
target_host target.asset.hostname מיפוי ישיר
target_ip target.asset.ip ממופים ישירות, אחרי המרה של הייצוג של המחרוזת למערך JSON ואז חילוץ של כתובות IP בודדות
target_path target.url מיפוי ישיר
time metadata.event_timestamp הניתוח בוצע כדי לחלץ את חותמת הזמן באמצעות הפורמט dd/MMM/yyyy:HH:mm:ss Z
user_agent network.http.user_agent ממופה ישירות אם הוא לא ריק או -
metadata.event_type הערך שמוגדר בהתחלה הוא GENERIC_EVENT, אבל יכול להיות שהוא ישתנה בהמשך בהתאם לערכים בשדות אחרים כמו terminal ו-protocol. אם דפוס ה-grok הראשי לא תואם, ברירת המחדל היא USER_UNCATEGORIZED. הערך הוא NETWORK_HTTP אם protocol הוא HTTP ו-target_ip קיים, ו-STATUS_UPDATE אם protocol הוא HTTP אבל target_ip לא קיים
metadata.log_type ההגדרה היא NGINX
metadata.product_name ההגדרה היא NGINX
metadata.vendor_name ההגדרה היא NGINX
network.ip_protocol הערך שמוגדר הוא TCP אם terminal הוא sshd או ssh, או אם אין התאמה לדפוס ה-grok הראשי
principal.asset_id הערך הוא GCP.GCE:0001 אם terminal הוא sshd או ssh. מוגדר ל-GCP.GCE:0002 אם תבנית ה-grok הראשית לא תואמת
extensions.auth.type הערך הוא MACHINE אם terminal הוא sshd או ssh
log_hostname event.idm.read_only_udm.principal.asset.hostname מופה מיומן השינויים
ip_part event.idm.read_only_udm.intermediary.ip מופה מיומן השינויים
domain_part event.idm.read_only_udm.intermediary.administrative_domain מופה מיומן השינויים
location_part event.idm.read_only_udm.intermediary.location.name מופה מיומן השינויים
labels.compute_googleapis_com/resource_name event.idm.read_only_udm.target.hostname מופה מיומן השינויים
resource.labels.instance_id event.idm.read_only_udm.target.resource.product_object_id מופה מיומן השינויים
resource.labels.project_id event.idm.read_only_udm.target.resource_ancestors.name מופה מיומן השינויים
resource.labels.zone event.idm.read_only_udm.target.resource.attribute.cloud.availability_zone מופה מיומן השינויים
resource.type event.idm.read_only_udm.target.resource.resource_type מופה מיומן השינויים
insertId event.idm.read_only_udm.metadata.product_log_id מופה מיומן השינויים
jsonPayload.latency event.idm.read_only_udm.additional.fields מופה מיומן השינויים
remoteIp event.idm.read_only_udm.target.ip מופה מיומן השינויים
jsonPayload.requestMethod event.idm.read_only_udm.network.http.method מופה מיומן השינויים
jsonPayload.requestSize event.idm.read_only_udm.network.sent_bytes מופה מיומן השינויים
jsonPayload.requestUrl event.idm.read_only_udm.network.http.referral_url מופה מיומן השינויים
jsonPayload.responseSize event.idm.read_only_udm.network.received_bytes מופה מיומן השינויים
jsonPayload.serverIp event.idm.read_only_udm.target.ip מופה מיומן השינויים
jsonPayload.status event.idm.read_only_udm.network.http.response_code מופה מיומן השינויים
jsonPayload.userAgent event.idm.read_only_udm.network.http.user_agent מופה מיומן השינויים
jsonPayload.userAgent event.idm.read_only_udm.network.http.parsed_user_agent מופה מיומן השינויים
labels event.idm.read_only_udm.additional.fields מופה מיומן השינויים
terminal event.idm.read_only_udm.additional.fields מופה מיומן השינויים
logName event.idm.read_only_udm.additional.fields מופה מיומן השינויים
resource.labels event.idm.read_only_udm.target.resource.attribute.labels מופה מיומן השינויים
resource.type event.idm.read_only_udm.target.resource.attribute.labels מופה מיומן השינויים
resource.name event.idm.read_only_udm.target.resource.name מופה מיומן השינויים
timestamp event.idm.read_only_udm.metadata.event_timestamp מופה מיומן השינויים
user_agent event.idm.read_only_udm.network.http.parsed_user_agent מופה מיומן השינויים

שנה רישום

צפייה ביומן השינויים של כלי הניתוח הזה

הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.