איסוף יומני TSV של Zeek (לשעבר Bro)

נתמך ב:

במסמך הזה מוסבר איך להטמיע יומני TSV של Zeek (לשעבר Bro) ב-Google Security Operations באמצעות סוכן Bindplane.

‫Zeek (לשעבר Bro) היא פלטפורמה לניטור אבטחת רשת שמנתחת באופן פסיבי את התנועה ברשת ויוצרת קובצי יומן מפורטים שמופרדים בטאבים. הקבצים האלה כוללים חיבורים, שאילתות DNS, טרנזקציות HTTP, סשנים של SSL/TLS וניתוח קבצים. כברירת מחדל, חיישני Zeek יוצרים קובצי יומן בפורמט TSV בנתיב /opt/zeek/logs/ או /usr/local/zeek/logs/.

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

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

  • מכונה של Google SecOps
  • ‫Windows Server 2016 ואילך, או מארח Linux עם systemd
  • קישוריות רשת בין סוכן Bindplane לבין המארח של חיישן Zeek
  • אם אתם משתמשים בשרת proxy, ודאו שהיציאות של חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane.
  • גישה עם הרשאות למארח של חיישן Zeek עם הרשאות לקריאת קובצי יומן
  • גישה לקובצי יומן של Zeek TSV במערכת הקבצים של החיישן (בדרך כלל ב-/opt/zeek/logs/ או ב-/usr/local/zeek/logs/)

קבלת פרטי כניסה ל-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 בספריית Bindplane collector (/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 בלבד, עוברים אל הגדרות > סוכני איסוף.
  3. מורידים את קובץ האימות להטמעת נתונים.
  4. שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן הסוכן של Bindplane.

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

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל הגדרות > ניהול > פרופיל. אם אתם משתמשים בפלטפורמה של 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/bro_tsv:
        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: BRO_TSV
        raw_log_field: body
        ingestion_labels:
          env: production
    
    service:
      pipelines:
        logs/bro_to_chronicle:
          receivers:
            - udplog
          exporters:
            - chronicle/bro_tsv
    

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

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

  • הגדרת המקלט:

    • ‫udplog: סוג המקלט לפי הפרוטוקול:
      • ‫udplog ל-UDP syslog
      • ‫tcplog ל-syslog של TCP
    • ‫0.0.0.0: כתובת ה-IP להאזנה:
      • ‫0.0.0.0 כדי להאזין בכל הממשקים (מומלץ)
      • כתובת IP ספציפית להאזנה בממשק אחד
    • ‫514: מספר היציאה להאזנה (לדוגמה, 514,‏ 1514,‏ 6514)
  • הגדרת הייצוא:

    • ‫bro_tsv: שם תיאורי של הייצואן
    • ‫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>: מספר הלקוח מהשלב הקודם
    • ‫location: מחליפים את <LOCATION> באזור של המכונה של Google SecOps (לדוגמה, us,‏ europe או asia-southeast1). המייצא מוסיף את הערך הזה בתחילת chronicle.googleapis.com. לרשימה המלאה, ראו נקודות קצה אזוריות.
    • ‫project: מחליפים את <PROJECT_NUMBER> במספר הפרויקט שמופיע בקטע IAM & Admin > Settings.
    • ‫endpoint: משאירים את הערך chronicle.googleapis.com.
    • ‫BRO_TSV: סוג היומן בדיוק כמו שהוא מופיע ב-Chronicle
    • ‫ingestion_labels: תוויות אופציונליות בפורמט YAML (לדוגמה, env: production)
  • הגדרת צינור עיבוד הנתונים:

    • ‫bro_to_chronicle: שם תיאורי של צינור עיבוד הנתונים

מייצא API להטמעה מדור קודם

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

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

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

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

‫Zeek יוצר קובצי יומן בפורמט TSV באופן מקומי. כדי להעביר את היומנים האלה באמצעות syslog לסוכן Bindplane, צריך להגדיר דימון של syslog במארח החיישן של Zeek.

  1. נכנסים למארח של חיישן Zeek עם הרשאות בסיס או הרשאות sudo.
  2. מתקינים ומגדירים את rsyslog או את syslog-ng אם הם עדיין לא מותקנים.
  3. יוצרים קובץ תצורה של rsyslog כדי להעביר את היומנים של Zeek:

    sudo nano /etc/rsyslog.d/zeek-forward.conf
    
  4. כדי להעביר את יומני Zeek לסוכן Bindplane, מוסיפים את ההגדרות הבאות:

    module(load="imfile")
    input(type="imfile"
        File="/opt/zeek/logs/current/*.log"
        Tag="zeek:"
        Severity="info"
        Facility="local6")
    local6.* @<BINDPLANE_AGENT_IP>:514
    
    • מחליפים את <BINDPLANE_AGENT_IP> בכתובת ה-IP של המארח של סוכן Bindplane.
    • מחליפים את /opt/zeek/logs/current/*.log בנתיב האמיתי לקובצי היומן של Zeek, אם הוא שונה.
    • צריך להשתמש ב-@@ במקום ב-@ להעברת TCP (חייב להתאים לסוג המקלט של סוכן Bindplane).
  5. מפעילים מחדש את rsyslog כדי להחיל את השינויים:

    sudo systemctl restart rsyslog
    
  6. כדי לוודא שהודעות syslog מתקבלות, בודקים את יומני הסוכן של Bindplane.

טבלת מיפוי UDM

שדה ביומן מיפוי UDM Logic (פונקציה לוגית)
rtt, operation, tunnel_type, action, cmd, arg, rows additional.fields מוזג מ-additional_rtt, ‏ additional_op, ‏ additional_tt, ‏ additional_action, ‏ additional_cmd, ‏ additional_arg, ‏ additional_rows
extensions.auth.type מגדירים את הערך "AUTHTYPE_UNSPECIFIED"
conn_state, action, error, desc metadata.description מוגדר לתיאור conn_state עבור bro_conn, פעולה עבור bro_smb_files,‏ "KERBEROS: %{error}" עבור bro_kerberos, תיאור עבור AsymPayloadFlow, קבוע עבור אחרים
bro_type, qerror, next_protocol, protocol metadata.event_type מוגדר כ-GENERIC_EVENT כברירת מחדל, NETWORK_DNS עבור dns, ‏ NETWORK_CONNECTION עבור conn/ntlm/smb_mapping/dce_rpc/tunnel/mysql/ssh/udp/tcp, ‏ NETWORK_DHCP עבור dhcp, ‏ NETWORK_HTTP עבור http/ssl אם next_protocol http, ‏ NETWORK_UNCATEGORIZED עבור smb_files/files/x509, ‏ USER_LOGIN עבור radius, ‏ NETWORK_FTP עבור ftp, ‏ NETWORK_UNCATEGORIZED אם qerror query_not_present
bro_type, prod_event metadata.product_event_type ערך מ-bro_type אם הוא לא ריק, אחרת מ-prod_event
uid, id metadata.product_log_id ערך מ-uid אם הוא זמין, אחרת מ-id
metadata.product_name הגדרת הכינוי "אחי"
metadata.vendor_name הגדרה ל-"Zeek"
service_proto, source network.application_protocol ממופה מ-service_proto ל-conn, ממופה מהמקור לקבצים, קבוע לאחרים
שם המארח network.dhcp.client_hostname הערך הועתק ישירות
lease_time network.dhcp.lease_time_seconds הומר למספר שלם חיובי
dhcp_info network.dhcp.type צריך להגדיר את הערך "ACK" אם =~ "ACK", את הערך "RELEASE" אם =~ "RELEASE", את הערך "INFORM" אם =~ "INFORM", את הערך "DISCOVER" אם =~ "DISCOVER", את הערך "OFFER" אם =~ "OFFER", את הערך "REQUEST" אם =~ "REQUEST"
assigned_ip network.dhcp.yiaddr הערך הועתק ישירות
כיוון network.direction הערך הועתק ישירות
answer_list network.dns.answers הערך הועתק ישירות
trans_id network.dns.id הומר למספר שלם חיובי
q network.dns.questions מוזג מ-q
rcode network.dns.response_code מומר ל-uinteger אם לא "-"
פקודה network.ftp.command הערך הועתק ישירות
method network.http.method הערך הועתק ישירות
מקור ההפניה (referrer) network.http.referral_url הערך הועתק ישירות
status_code network.http.response_code ההמרה למספר שלם
user_agent network.http.user_agent הערך הועתק ישירות
פרוטוקול, פרוטו, proto, protocol network.ip_protocol ערך מ-proto ל-conn, ‏"UDP" ל-udp, ‏"TCP" ל-tcp
id_resp_bytes, received_bytes network.received_bytes הומר ל-uinteger מ-id_resp_bytes עבור conn, ‏received_bytes עבור files
id_orig_bytes network.sent_bytes הומר למספר שלם חיובי
uid network.session_id הערך הועתק ישירות
צופן network.tls.cipher הערך הועתק ישירות
client_issuer network.tls.client.certificate.issuer הערך הועתק ישירות
client_subject network.tls.client.certificate.subject הערך הועתק ישירות
לקוח network.tls.client.certificate.version הערך הועתק ישירות
ja3 network.tls.client.ja3 הערך הועתק ישירות
עקומה network.tls.curve הערך הועתק ישירות
נוצר network.tls.established הערך הועתק ישירות
next_protocol network.tls.next_protocol הערך הועתק ישירות
הופעלו מחדש network.tls.resumed הערך הועתק ישירות
issuer, certificate.issuer network.tls.server.certificate.issuer ערך מהמנפיק ל-SSL, ‏ certificate.issuer ל-x509
certificate.not_valid_after network.tls.server.certificate.not_after ההמרה בוצעה באמצעות מסנן תאריכים
certificate.not_valid_before network.tls.server.certificate.not_before ההמרה בוצעה באמצעות מסנן תאריכים
certificate.serial network.tls.server.certificate.serial הערך הועתק ישירות
subject, ‏ certificate.subject network.tls.server.certificate.subject ערך מהנושא ל-SSL, ‏certificate.subject ל-x509
certificate.version network.tls.server.certificate.version הומרה למחרוזת
ja3s network.tls.server.ja3s הערך הועתק ישירות
גרסה network.tls.version הערך הועתק ישירות
דומיין principal.administrative_domain הערך הועתק ישירות
file_size principal.file.size הומר למספר שלם חיובי
client_host, _system_name, _HostName principal.hostname ערך מ-client_host עבור kerberos, ‏_system_name עבור x509, ‏_HostName אם חולץ
id.orig_h principal.ip Merged from id.orig_h
mac principal.mac הערך הועתק ישירות
id.orig_p principal.port הערך מומר למספר שלם, הערך מ-id.orig_p או הפוך ל-conn אם לא local_orig
user_email principal.user.email_addresses מוזג מ-user_email
user, username, user_name principal.user.userid ערך מהמשתמש עבור ftp, שם משתמש עבור radius, שם משתמש עבור kerberos
qclass q.class הומר למספר שלם חיובי
qname, q.name q.name ערך מ-qname או מ-q.name
qtype q.type הומר למספר שלם חיובי
result, auth_success security_result מוזג מ-security_result עם הפעולה BLOCK עבור radius נכשל, ALLOW/BLOCK/UNKNOWN עבור ssh
uri target.administrative_domain חולץ מ-URI באמצעות grok
full_file_path, fuid target.file.full_path ערך מ-full_file_path עבור smb_files, ‏fuid עבור קבצים
md5 target.file.md5 הערך הועתק ישירות
mime_type target.file.mime_type הערך הועתק ישירות
sha1 target.file.sha1 הערך הועתק ישירות
size, file_size target.file.size הומר ל-uinteger מ-size עבור smb_files, ‏file_size עבור files
server_host, host, CN, server target.hostname ערך מ-server_host ל-kerberos, מארח ל-http, ‏CN ל-x509, שרת ל-ssh
id.resp_h target.ip Merged from id.resp_h
host_key, host_key_alg, kex_alg, mac_alg, compression_alg, cipher_alg, auth_attempts target.labels מוזג מאובייקטים שונים של תוויות
id.resp_p target.port הומר למספר שלם, ערך מ-id.resp_p או הפוך ל-conn אם לא local_orig
path, named_pipe target.resource.name ערך מהנתיב של smb_mapping, ‏named_pipe של dce_rpc
share_type target.resource.type ערך מ-share_type עבור smb_mapping, ‏"PIPE" עבור dce_rpc
url target.url משורשר מהמארח ומה-URI

יומן שינויים

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

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