איסוף יומנים של נתב Nokia

נתמך ב:

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

‫Nokia Service Router הוא נתב רשת שיוצר הודעות syslog לאירועי BGP, לשינויים בסטטוס הממשק, לסשנים של MKA, לגילוי של שכני LLDP, לניתוב IS-IS ולהתאמות של מסנני אבטחה. המנתח מחלץ שדות מיומנים בפורמט syslog באמצעות תבניות grok וממפה אותם למודל הנתונים המאוחד (UDM).

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

חשוב לוודא שיש לכם את הדברים הבאים:

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

קבלת פרטי כניסה ל-Google SecOps בשביל סוכן Bindplane

כדי לאמת את סוכן Bindplane ב-Google SecOps, בוחרים באחת מהשיטות הבאות:

  • פריסות חדשות: משתמשים ב-Chronicle API (אפשרות 1).
  • פריסות קודמות: ממשיכים להשתמש בקובץ האימות להטמעת נתונים (אפשרות 2) עד שה-Ingestion API יופסק ב-20 ביולי 2027.
  1. נכנסים למסוףGoogle Cloud ובוחרים את הפרויקט ב- Google Cloud שמקושר למכונה של Google SecOps.
  2. נכנסים לדף IAM & Admin > Service Accounts.
  3. לוחצים על Create service account.
  4. מזינים את פרטי ההגדרה הבאים:
    • Service account name: מזינים שם לחשבון (לדוגמה, bindplane-ingest).
    • Service account description: מזינים תיאור (לדוגמה, Bindplane agent log ingestion).
  5. לוחצים על Create and continue.
  6. בקטע Grant this service account access to project, לוחצים על Select a role ובוחרים באפשרות Chronicle Editor.
  7. לוחצים על המשך ואז על סיום.
  8. לוחצים על חשבון השירות שיצרתם ואז עוברים לכרטיסייה Keys.
  9. לוחצים על Add key > Create new key.
  10. בוחרים באפשרות JSON ולוחצים על Create. קובץ המפתח יורד למחשב.
  11. שומרים את קובץ המפתח בתור ingestion-auth.json בספריית ה-collector של Bindplane (/opt/observiq-otel-collector/ingestion-auth.json ב-Linux או C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json ב-Windows), או מעדכנים את creds_file_path ב-config.yaml כך שיתאים לנתיב שבו שמרתם אותו.
  12. עוברים אל IAM & Admin > Settings ומעתיקים את הערך של Project number. תצטרכו אותו כדי להגדיר את כלי הייצוא.

אפשרות 2: הורדה של קובץ האימות להטמעת נתונים (מדור קודם)

  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 לפי ההוראות הבאות.

התקנת חלונות

  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/nokia_router:
        protocol: https
        # Region of your instance, for example us, europe, asia-southeast1
        location: <LOCATION>
        # Project number of the Google Cloud project linked to the instance
        project: '<PROJECT_NUMBER>'
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: '<customer_id>'
        endpoint: chronicle.googleapis.com
        log_type: NOKIA_ROUTER
        raw_log_field: body
    
    service:
      pipelines:
        logs/nokia_router_to_chronicle:
          receivers:
            - udplog
          exporters:
            - chronicle/nokia_router
    

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

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

  • הגדרת מקלט:

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

    • ‫creds_file_path: הנתיב המלא לקובץ מפתח JSON של חשבון השירות (אפשרות 1):
      • ‫Linux: /opt/observiq-otel-collector/ingestion-auth.json
      • Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
    • ‫customer_id: מספר הלקוח שהועתק ממסוף Google SecOps
    • ‫location: מחליפים את <LOCATION> באזור של המכונה של Google SecOps (לדוגמה, us,‏ europe או asia-southeast1). המייצא מוסיף את הערך הזה בתחילת chronicle.googleapis.com. רשימה מלאה של נקודות הקצה האזוריות מופיעה במאמר Regional Endpoints.
    • ‫project: מחליפים את <PROJECT_NUMBER> במספר הפרויקט מתוך IAM & Admin > Settings.
    • ‫endpoint: צריך להשאיר את ההגדרה chronicle.googleapis.com.

כלי לייצוא נתונים מ-Legacy ingestion API

  • אם משתמשים בקובץ האימות של ההעלאה מאפשרות 2, מחליפים את הבלוק exporters בבלוק הבא. מגדירים את creds_file_path לנתיב של קובץ האימות להטמעת נתונים. אם המכונה נמצאת מחוץ לארה"ב, מחליפים את malachiteingestion-pa.googleapis.com בנקודת הקצה האזורית (לדוגמה, europe-malachiteingestion-pa.googleapis.com).

    exporters:
      chronicle/nokia_router:
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: '<customer_id>'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: NOKIA_ROUTER
        raw_log_field: body
    

שמירת קובץ התצורה

  • אחרי שמסיימים לערוך, שומרים את הקובץ:
    • ‫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"
        

הגדרת syslog ב-Nokia Service Router

  1. נכנסים למצב הגדרה:

    config# log
    
  2. מגדירים יעד של syslog:

    config>log# syslog 1
    
  3. מגדירים את הפרמטרים של syslog:

    config>log>syslog# address <syslog-server-ip>
    config>log>syslog# port <port-number>
    config>log>syslog# facility local0
    config>log>syslog# level info
    config>log>syslog# log-prefix "Nokia-SR"
    config>log>syslog# description "Syslog to Bindplane"
    
    • מחליפים את <syslog-server-ip> בכתובת ה-IP של סוכן Bindplane ואת <port-number> ביציאה המתאימה (לדוגמה, 514 ל-UDP).
  4. החלת יעד syslog על קובץ יומן:

    config>log# log-id 1
    config>log>log-id# to syslog 1
    
  5. מפעילים את קובץ היומן:

    config>log>log-id# no shutdown
    
  6. שומרים את ההגדרה:

    config>log>log-id# exit
    config>log# save
    

טבלת מיפוי UDM

שדה ביומן מיפוי UDM היגיון
%{SYSLOGTIMESTAMP:date_time} metadata.event_timestamp חולץ מהיומן הגולמי והומר לחותמת זמן.
%{IP:src_ip} principal.ip חולץ מהיומן הגולמי.
%{HOSTNAME:host_name} principal.hostname חולץ מהיומן הגולמי.
%{INT:sequence_id} metadata.product_log_id חולץ מהיומן הגולמי.
%{DATA:router_name} metadata.product_name חולץ מהיומן הגולמי.
%{DATA:application} target.application חולץ מהיומן הגולמי.
%{WORD:severity} security_result.severity ממופה מרמת החומרה של היומן הגולמי על סמך הלוגיקה הבאה:
– CLEARED, ‏ INFO -> INFORMATIONAL
– MINOR -> ERROR
– WARNING -> LOW
– MAJOR -> HIGH
– CRITICAL -> CRITICAL
%{DATA:event_name} metadata.product_event_type חולץ מהיומן הגולמי.
%{INT:event_id} additional.fields.value.string_value הערך הזה מחולץ מהיומן הגולמי ומוצב בתוך additional fields עם המפתח Event Id.
%{GREEDYDATA:message1} משמש לחילוץ שדות שונים על סמך event_name. ההסבר על הלוגיקה של שדות ספציפיים מופיע בהמשך.
Group %{NOTSPACE:group_id} target.group.product_object_id חולץ מ-message1 כש-event_name קשור לאירועי BGP.
%{WORD} %{IP:dest_ip} target.ip המידע מחולץ מ-message1 כש-event_name קשור לאירועי BGP.
%{GREEDYDATA:desc} security_result.description המידע הזה חולץ מmessage1 לתרחישים שונים של event_name.
SAP %{DATA:sap_id} additional.fields.value.string_value הערך נשלף מ-message1 כשהערך של event_name הוא sapStatusChanged, ומוצב ב-additional fields עם המפתח SAP Id.
in service %{INT:service_id} additional.fields.value.string_value הערך הזה מחולץ מ-message1 כשהערך של event_name הוא sapStatusChanged, והוא ממוקם בתוך additional fields עם המפתח Service Id.
\\(customer %{INT:customer_id}\\) additional.fields.value.string_value הערך הזה מחולץ מ-message1 כשהערך של event_name הוא sapStatusChanged, והוא ממוקם בתוך additional fields עם המפתח Customer Id.
admin=%{WORD:admin_status} additional.fields.value.string_value הערך נשלף מ-message1 כשהערך של event_name הוא sapStatusChanged, ומוצב ב-additional fields עם המפתח Admin Status.
oper=%{WORD:operation_status} additional.fields.value.string_value הערך הזה מחולץ מ-message1 כשהערך של event_name הוא sapStatusChanged, והוא ממוקם בתוך additional fields עם המפתח Operation Status.
flags=%{WORD:flag} additional.fields.value.string_value הערך נשלף מ-message1 כשהערך של event_name הוא sapStatusChanged, ומוצב ב-additional fields עם המפתח Flag.
with MI:SCI %{DATA:mi_sci} additional.fields.value.string_value הערך נשלף מ-message1 כשהערך של event_name הוא tmnxMkaSessionEstablished, ומוצב ב-additional fields עם המפתח MI:SCI.
on port %{DATA:port_id} additional.fields.value.string_value הערך נשלף מ-message1 כשהערך של event_name הוא tmnxMkaSessionEstablished, ומוצב ב-additional fields עם המפתח Port Id.
sub-port %{INT:sub_port_id} additional.fields.value.string_value הערך נשלף מ-message1 כשהערך של event_name הוא tmnxMkaSessionEstablished, ומוצב ב-additional fields עם המפתח Sub-port Id.
CA %{INT:ca} additional.fields.value.string_value הערך נשלף מ-message1 כשהערך של event_name הוא tmnxMkaSessionEstablished, ומוצב ב-additional fields עם המפתח CA.
EAPOL-destination %{MAC:dest_mac} target.mac חולץ מ-message1 כשהערך של event_name הוא tmnxMkaSessionEstablished.
local port-id %{DATA:local_port_id} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח local_port_id.
dest-mac-type %{NOTSPACE:mac_type} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח mac_type.
remote system name %{HOSTNAME:dest_host} target.hostname חולץ מ-message1 עבור ערכי event_name ספציפיים.
remote chassis-id %{DATA:dest_mac} target.mac חילוץ מתוך message1 עבור ערכים ספציפיים של event_name.
remote port-id %{DATA:port_id} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח port_id.
remote-index %{INT:remote_index} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח remote_index.
remote management address %{IP:dest_ip} target.ip חילוץ מתוך message1 עבור ערכים ספציפיים של event_name.
advRtr:%{HOSTNAME:dest_host}%{GREEDYDATA}, ip@:%{IP:dest_ip}/%{INT:dest_port} target.hostname, target.ip, target.port חילוץ מתוך message1 עבור ערכים ספציפיים של event_name.
SID:%{INT:sid} network.session_id חילוץ מתוך message1 עבור ערכים ספציפיים של event_name.
level:%{DATA:level} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח level.
mtid:%{INT:mtid} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח mtid.
type:%{WORD:type} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח type.
flags:%{WORD:flag} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח flag.
, algo:%{INT:algo} target.resource.attribute.labels.value הערך חולץ מ-message1 עבור ערכי event_name ספציפיים והוצב בתוך target.resource.attribute.labels עם המפתח algo.
Description:%{GREEDYDATA:desc}. security_result.description חולץ מ-message1 כשהערך של event_name הוא mafEntryMatch.
SrcIP principal.ip הערך חולץ מהשדה kv_data כשהערך של event_name הוא mafEntryMatch.
SrcIP: %{INT:src_port} principal.port הערך חולץ מהשדה kv_data כשהערך של event_name הוא mafEntryMatch.
DstIP target.ip הערך חולץ מהשדה kv_data כשהערך של event_name הוא mafEntryMatch.
DstIP: %{INT:dest_port} target.port הערך חולץ מהשדה kv_data כשהערך של event_name הוא mafEntryMatch.
Protocol network.ip_protocol חולץ מהשדה kv_data כשהערך של event_name הוא mafEntryMatch.
לא רלוונטי metadata.vendor_name הגדרת הערך NOKIA_ROUTER.
לא רלוונטי metadata.event_type נקבע על סמך הנוכחות והשילוב של השדות שחולצו:
– src_ip, dest_ip ו-network קיימים -> NETWORK_CONNECTION
– principal קיים -> STATUS_UPDATE
– אחרת -> GENERIC_EVENT
%{GREEDYDATA:description} metadata.description חולץ מ-message1 כשהערך של event_name הוא tmnxMkaSessionEstablished.
src_ip event.idm.read_only_udm.intermediary.ip מופה מיומן השינויים
src_ip event.idm.read_only_udm.intermediary.asset.ip מופה מיומן השינויים

יומן שינויים

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

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