איסוף יומני 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: יצירת חשבון שירות ל-Chronicle API (מומלץ)
- נכנסים למסוףGoogle Cloud ובוחרים את הפרויקט ב- Google Cloud שמקושר למכונה של Google SecOps.
- נכנסים לדף IAM & Admin > Service Accounts.
- לוחצים על Create service account.
- מזינים את פרטי ההגדרה הבאים:
- Service account name: מזינים שם לחשבון (לדוגמה,
bindplane-ingest). - Service account description: מזינים תיאור (לדוגמה,
Bindplane agent log ingestion).
- Service account name: מזינים שם לחשבון (לדוגמה,
- לוחצים על Create and continue.
- בקטע Grant this service account access to project, לוחצים על Select a role ובוחרים באפשרות Chronicle Editor.
- לוחצים על המשך ואז על סיום.
- לוחצים על חשבון השירות שיצרתם ועוברים לכרטיסייה Keys.
- לוחצים על Add key > Create new key.
- בוחרים באפשרות JSON ולוחצים על Create. קובץ המפתח יורד למחשב.
- שומרים את קובץ המפתח בתור
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כך שיתאים לנתיב שבו שמרתם אותו. - עוברים אל IAM & Admin > Settings ומעתיקים את הערך של Project number. תצטרכו אותו כדי להגדיר את הייצוא.
אפשרות 2: הורדה של קובץ האימות להטמעת נתונים (גרסה קודמת)
- נכנסים למסוף Google SecOps.
- עוברים אל הגדרות > ניהול נתונים > סוכני איסוף. אם אתם משתמשים בפלטפורמת SIEM בלבד, עוברים אל הגדרות > סוכני איסוף.
- מורידים את קובץ האימות להטמעת נתונים.
- שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן הסוכן של Bindplane.
איך מקבלים מספר לקוח ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל הגדרות > ניהול > פרופיל. אם אתם משתמשים בפלטפורמה של SIEM בלבד, עוברים אל הגדרות > פרופיל.
מעתיקים את מספר הלקוח מהקטע פרטי הארגון ושומרים אותו.
התקנת הסוכן של Bindplane
מתקינים את הסוכן של Bindplane במערכת ההפעלה Windows או Linux לפי ההוראות הבאות.
התקנת חלונות
- פותחים את שורת הפקודה או את PowerShell כאדמין.
מריצים את הפקודה הבאה:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietמחכים שההתקנה תסתיים.
כדי לוודא שההתקנה בוצעה, מריצים את הפקודה:
sc query observiq-otel-collectorהשירות אמור להופיע כ-RUNNING.
התקנה ב-Linux
- פותחים טרמינל עם הרשאות root או sudo.
מריצים את הפקודה הבאה:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shמחכים שההתקנה תסתיים.
כדי לוודא שההתקנה בוצעה, מריצים את הפקודה:
sudo systemctl status observiq-otel-collectorהשירות אמור להופיע כפעיל (פועל).
מקורות מידע נוספים בנושא התקנה
לאפשרויות התקנה נוספות ולפתרון בעיות, קראו את מדריך ההתקנה של סוכן Bindplane.
הגדרת סוכן Bindplane להטמעת syslog ושליחה אל Google SecOps
מאתרים את קובץ התצורה
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
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
- Linux:
-
<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: לוחצים על קובץ > שמירה
- Linux: לוחצים על
מפעילים מחדש את הסוכן של Bindplane כדי להחיל את השינויים.
כדי להפעיל מחדש את הסוכן של Bindplane ב-Linux, מריצים את הפקודה הבאה:
sudo systemctl restart observiq-otel-collectorמוודאים שהשירות פועל:
sudo systemctl status observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
sudo journalctl -u observiq-otel-collector -f
כדי להפעיל מחדש את הסוכן של Bindplane ב-Windows, בוחרים באחת מהאפשרויות הבאות:
שורת הפקודה או PowerShell כאדמין:
net stop observiq-otel-collector && net start observiq-otel-collectorמסוף השירותים:
- לוחצים על
Win+R, מקלידיםservices.mscולוחצים על Enter. - מאתרים את observIQ OpenTelemetry Collector.
- לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
מוודאים שהשירות פועל:
sc query observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- לוחצים על
הגדרת העברת syslog של Zeek
Zeek יוצר קובצי יומן בפורמט TSV באופן מקומי. כדי להעביר את היומנים האלה באמצעות syslog לסוכן Bindplane, צריך להגדיר דימון של syslog במארח החיישן של Zeek.
- נכנסים למארח של חיישן Zeek עם הרשאות בסיס או הרשאות sudo.
- מתקינים ומגדירים את
rsyslogאו אתsyslog-ngאם הם עדיין לא מותקנים. יוצרים קובץ תצורה של rsyslog כדי להעביר את היומנים של Zeek:
sudo nano /etc/rsyslog.d/zeek-forward.confכדי להעביר את יומני 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).
- מחליפים את
מפעילים מחדש את rsyslog כדי להחיל את השינויים:
sudo systemctl restart rsyslogכדי לוודא שהודעות 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.