איסוף יומנים של Imperva Database
במסמך הזה מוסבר איך להטמיע יומנים של מסד נתונים של Imperva ב-Google Security Operations באמצעות סוכן Bindplane.
המנתח מחלץ שדות מיומנים בפורמט syslog של Imperva Database. הוא משתמש ב-grok או ב-kv כדי לנתח את הודעת היומן, ואז ממפה את הערכים האלה למודל הנתונים המאוחד (UDM). בנוסף, הוא מגדיר ערכי ברירת מחדל של מטא-נתונים למקור ולסוג האירוע. Imperva Database Security מספק יכולות מקיפות של מעקב, ביקורת והגנה על פעילות במסד הנתונים.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מכונה של Google SecOps
- מארח עם Windows 2016 ואילך או Linux עם
systemd - אם השרת פועל מאחורי שרת proxy, צריך לוודא שהיציאות של חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane.
- גישה עם הרשאות למסוף הניהול של Imperva SecureSphere
קבלת פרטי כניסה ל-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 Settings (הגדרות SIEM) > Profile (פרופיל).
- מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.
התקנת הסוכן של Bindplane
מתקינים את הסוכן של Bindplane במערכת ההפעלה Windows או Linux לפי ההוראות הבאות.
התקנת חלונות
- פותחים את שורת הפקודה או את PowerShell כאדמין.
מריצים את הפקודה הבאה:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
התקנה ב-Linux
- פותחים טרמינל עם הרשאות root או sudo.
מריצים את הפקודה הבאה:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
מקורות מידע נוספים להתקנה
לאפשרויות התקנה נוספות, קראו את מדריך ההתקנה של סוכן Bindplane.
הגדרת סוכן Bindplane להטמעת Syslog ושליחה ל-Google SecOps
ניגשים לקובץ התצורה:
- מאתרים את הקובץ
config.yaml. בדרך כלל, הוא נמצא בספרייה/opt/observiq-otel-collector/ב-Linux או בספריית ההתקנה ב-Windows. - פותחים את הקובץ באמצעות כלי לעריכת טקסט (לדוגמה,
nano,viאו Notepad).
- מאתרים את הקובץ
עורכים את הקובץ
config.yamlבאופן הבא:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: 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 # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <CUSTOMER_ID> endpoint: chronicle.googleapis.com # Add optional ingestion labels for better organization log_type: 'IMPERVA_DB' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels- מחליפים את היציאה ואת כתובת ה-IP לפי הצורך בתשתית שלכם.
- מחליפים את
<LOCATION>באזור של מכונת Google SecOps (לדוגמה,us,europeאוasia-southeast1). המייצא מוסיף את הערך הזה בתחילתchronicle.googleapis.com. - מחליפים את
<PROJECT_NUMBER>במספר הפרויקט שמופיע בקטע IAM & Admin > Settings. - מחליפים את
<CUSTOMER_ID>במספר הלקוח בפועל. - מעדכנים את
/path/to/ingestion-authentication-file.jsonלנתיב הקובץ שבו נשמר קובץ המפתח של חשבון השירות (אפשרות 1) בשלב 1.
מייצא API להטמעה מדור קודם
אם משתמשים בקובץ האימות של ההעלאה מאפשרות 2, מחליפים את הבלוק
exportersבבלוק הבא. מגדירים אתcreds_file_pathלנתיב לקובץ האימות של ההעברה, ואם המופע שלכם נמצא מחוץ לארה"ב, מחליפים אתmalachiteingestion-pa.googleapis.comבנקודת הקצה האזורית (לדוגמה,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'IMPERVA_DB' raw_log_field: body ingestion_labels:
מפעילים מחדש את סוכן Bindplane כדי להחיל את השינויים.
כדי להפעיל מחדש את הסוכן של Bindplane ב-Linux, מריצים את הפקודה הבאה:
sudo systemctl restart observiq-otel-collectorכדי להפעיל מחדש את סוכן Bindplane ב-Windows, אפשר להשתמש במסוף Services או להזין את הפקודה הבאה:
net stop observiq-otel-collector && net start observiq-otel-collector
הגדרת העברה של Syslog ב-Imperva Database
- נכנסים למסוף הניהול של Imperva SecureSphere.
- עוברים אל הגדרה > קבוצות פעולות.
- לוחצים על הוספה כדי ליצור קבוצת פעולות חדשה או לערוך קבוצה קיימת.
- לוחצים על הוספת פעולה ומזינים את פרטי ההגדרה הבאים:
- שם: מזינים שם תיאורי (לדוגמה,
Google SecOps Syslog). - סוג הפעולה: בוחרים באפשרות GW Syslog.
- מארח: מזינים את כתובת ה-IP של סוכן Bindplane.
- יציאה: מזינים את מספר היציאה של סוכן Bindplane (ברירת המחדל היא 514).
- פרוטוקול: בוחרים באפשרות UDP או TCP, בהתאם להגדרות של סוכן Bindplane.
- רמת הרישום ביומן של Syslog: בוחרים באפשרות ניפוי באגים כדי לקבל רישום מקיף ביומן.
- Syslog Facility: בוחרים באפשרות LOCAL0 או במתקן המתאים.
- ממשק פעולה: בוחרים באפשרות יומן שער – אירוע אבטחה – יומן מערכת (syslog) – פורמט JSON (מורחב) לפורמט SYSLOG+JSON, או באפשרות יומן שער – אירוע אבטחה – יומן מערכת (syslog) לפורמט SYSLOG רגיל.
- שם: מזינים שם תיאורי (לדוגמה,
- שומרים את הגדרת הפעולה.
- עוברים אל Policies > Security Policies או אל Policies > Database Audit Policies.
- עורכים את המדיניות הרלוונטית ומוסיפים את קבוצת הפעולות שמכילה את פעולת ה-syslog כדי לוודא שהאירועים מועברים אל Google SecOps.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| acct | principal.user.userid | אם הערך של acct הוא admin, המיפוי הוא ל-target.user.userid, אחרת המיפוי הוא ל-principal.user.userid. לפני המיפוי, צריך להסיר את המירכאות והרווחים מ-acct. |
| פעולה | security_result.action_details | הערך של השדה action מהיומן הגולמי |
| alertSev | security_result.severity | אם הערך של alertSev הוא Informative, המיפוי הוא INFORMATIONAL. אחרת, המיפוי הוא הערך של alertSev באותיות רישיות |
| אפליקציה | principal.application | אם application הוא "pam_unix(sudo:session)" או ש-description מכיל את "pam_unix", ממפים כ-"pam_unix". אם message מכיל את " run-parts", ממפים כ-"run-parts". אם message מכיל את "audispd", ממפים כ-"audispd". אם השדה message מכיל את הערך FSS audit, צריך למפות אותו כ-FSS audit. אחרת, ממפים כשדה application מהיומן הגולמי |
| application-name | target.application | הערך של השדה application-name מהיומן הגולמי |
| audit-policy | security_result.category_details | הערך של השדה audit-policy מהיומן הגולמי |
| bind-variables | additional.fields.bind_variables_label.value.string_value | הערך של השדה bind-variables מהיומן הגולמי |
| קטגוריה | security_result.category_details | הערך של השדה category מתוך היומן הגולמי |
| פקודה | target.process.command_line | אם השדה exe לא ריק, ממפים אותו בתור השדה exe מהיומן הגולמי. אחרת, מיפוי כשדה COMMAND מיומן גולמי |
| createTime | לא ממופים | |
| db-schema-pair | additional.fields.DB Name_{index}.value.string_value, additional.fields.Schema Name_{index}.value.string_value |
לכל אובייקט db-schema-pair ביומן הגולמי, מחלצים את השדות db-name ו-schema-name וממפים אותם ל-DB Name_{index} ול-Schema Name_{index} בהתאמה ב-UDM, כאשר index הוא האינדקס של האובייקט במערך. |
| db-user | principal.user.userid | אם השדה db-user לא ריק, ממפים אותו בתור השדה db-user מהיומן הגולמי. Else if os-user is not empty and db-user is empty then map as os-user field from raw log |
| dbName | target.resource.name | הערך של השדה dbName מתוך היומן הגולמי |
| dest-ip | target.ip, target.asset.ip | הערך של השדה dest-ip מתוך היומן הגולמי |
| dest-port | target.port | הערך של השדה dest-port מתוך היומן הגולמי |
| description | metadata.description | אם description מכיל את המחרוזת user:, מחלצים את מזהה המשתמש מ-description וממפים אותו ל-userid. אם userid לא ריק ו-description מכיל את המילה "Invalid" או "invalid", צריך להחליף את "Invalid user" ב-"Invalid". אם הערך של application הוא "sshd", צריך להסיר את " from" ואת " by" מהערך של description. אחרת, מיפוי כשדה description מיומן גולמי |
| dst | target.ip, target.asset.ip | הערך של השדה dst מתוך היומן הגולמי |
| dstIP | target.ip, target.asset.ip | הערך של השדה dstIP מהיומן הגולמי |
| dstPort | target.port | הערך של השדה dstPort מתוך היומן הגולמי |
| event-type | metadata.product_event_type | הערך של השדה event-type מתוך היומן הגולמי |
| eventType | metadata.product_event_type, metadata.event_type | אם eventType לא ריק וגם srcIP ו-dstIP לא ריקים, ממפים את eventType ל-metadata.product_event_type וממפים את NETWORK_CONNECTION ל-metadata.event_type |
| evntDesc | security_result.description | הערך של השדה evntDesc מהיומן הגולמי |
| exe | target.process.command_line | הערך של השדה exe מתוך היומן הגולמי |
| מאת | network.email.from | מסירים את "<" ו-">" מהשדה from וממפים אותו לשדה network.email.from |
| קבוצה | target.user.group_identifiers | הערך של השדה group מהיומן הגולמי |
| gw-ip | intermediary.ip, intermediary.asset.ip | הערך של השדה gw-ip מתוך היומן הגולמי |
| מארח | target.hostname, target.asset.hostname | הערך של השדה host מתוך היומן הגולמי |
| שם מארח | principal.hostname, principal.asset.hostname | הערך של השדה host-name מהיומן הגולמי |
| שם המארח | principal.hostname, principal.asset.hostname | הערך של השדה hostname מהיומן הגולמי |
| ip | target.ip, target.asset.ip | הערך של השדה ip מהיומן הגולמי |
| mx-ip | intermediary.ip, intermediary.asset.ip | הערך של השדה mx-ip מתוך היומן הגולמי |
| objects-list | additional.fields.Object_{index}.value.string_value |
לכל אובייקט objects-list ביומן הגולמי, מחלצים את האובייקט וממפים אותו ל-Object_{index} ב-UDM, כאשר index הוא האינדקס של האובייקט במערך. |
| פעולה | about.labels.Operation.value | הערך של השדה Operation מהיומן הגולמי |
Operation type |
about.labels.Operation Type.value |
הערך של השדה Operation type מתוך היומן הגולמי |
| os-user | principal.user.userid, additional.fields.OS User.value.string_value |
אם os-user לא ריק ו-db-user ריק, המיפוי מתבצע כשדה os-user מיומן יומן גולמי. אחרת, מיפוי כשדה OS User מיומן גולמי |
| שאילתה שנותחה | target.process.command_line | הערך של השדה Parsed Query מהיומן הגולמי |
| parsed-query | additional.fields.Parsed Query.value.string_value |
הערך של השדה parsed-query מהיומן הגולמי |
| pid | target.process.pid | הערך של השדה pid מהיומן הגולמי |
| policy-id | security_result.detection_fields.Policy_ID_{index}.value |
לכל אובייקט policy-id ביומן הגולמי, מחלצים את המדיניות וממפים אותה ל-Policy_ID_{index} ב-UDM, כאשר index הוא האינדקס של האובייקט במערך. |
| policyName | security_result.detection_fields.policyName_label.value | הערך של השדה policyName מהיומן הגולמי |
| יציאה | target.port | הערך של השדה port מהיומן הגולמי |
| בעל הרשאות | about.labels.Privileged.value | אם Privileged הוא True, המיפוי הוא True, אחרת המיפוי הוא False |
| proto | network.ip_protocol | הערך של השדה proto מתוך היומן הגולמי |
| פרוטוקול | network.ip_protocol | אם הערך של protocol הוא "TCP" או "UDP", ממפים אותו בתור השדה protocol מהיומן הגולמי |
| PWD | target.file.full_path | הערך של השדה PWD מתוך היומן הגולמי |
Raw Data |
target.resource.attribute.labels.raw_Data.value | הערך של השדה Raw Data מתוך היומן הגולמי |
| raw-query | additional.fields.Raw Query.value.string_value |
הערך של השדה raw-query מהיומן הגולמי |
| ruleName | security_result.rule_name | הערך של השדה ruleName מתוך היומן הגולמי |
| server-group | additional.fields.serve_group_label.value.string_value | הערך של השדה server-group מתוך היומן הגולמי |
| service-name | additional.fields.service_name_label.value.string_value | הערך של השדה service-name מתוך היומן הגולמי |
Service Type |
additional.fields.Service Type.value.string_value |
הערך של השדה Service Type מהיומן הגולמי |
| size | network.received_bytes | הערך של השדה size מהיומן הגולמי |
Stored Proc |
about.labels.Stored_Proc.value | אם Stored Proc נכון, ממפים כ-True, אחרת ממפים כ-False |
Table Group |
target.group.group_display_name | הערך של השדה Table Group מתוך היומן הגולמי |
| חותמת זמן | metadata.event_timestamp | הערך של השדה timestamp מתוך היומן הגולמי |
| הם במצב | network.email.to | מסירים את "<" ו-">" מהשדה to וממפים אותו לשדה network.email.to |
| משתמש | principal.user.userid, target.user.userid | אם USER לא ריק ו-USER הוא 'אדמין', צריך למפות אותו כשדה USER מיומן גולמי אל target.user.userid. Else if USER is not empty then map as USER field from raw log to principal.user.userid |
| אימות משתמשים | security_result.detection_fields.user_authenticated.value | הערך של השדה user-authenticated מתוך היומן הגולמי |
| user-group | additional.fields.user_group_label.value.string_value | הערך של השדה user-group מהיומן הגולמי |
| שם משתמש | principal.user.user_display_name | הערך של השדה username מתוך היומן הגולמי |
| usrName | principal.user.userid | הערך של השדה usrName מהיומן הגולמי |
| extensions.auth.mechanism | מקודד באופן קשיח ל-"USERNAME_PASSWORD" אם description מכיל את "authentication failure" או "check pass; user unknown" או "Invalid user" או "invalid user" או אם error לא ריק |
|
| extensions.auth.type | הערך שמוחזר הוא AUTHTYPE_UNSPECIFIED אם has_principal הוא true, has_target הוא true ו-event-type הוא Login. |
|
| metadata.event_type | הערך PROCESS_OPEN מוגדר באופן קשיח אם השדה PWD לא ריק. מקודד באופן קשיח ל-"PROCESS_OPEN" אם message מכיל את "starting" או אם application הוא "pman" או "CROND" או "run-parts" ו-event_type ריק. מקודד באופן קשיח ל-"NETWORK_CONNECTION" אם description הוא "Syslog connection established" או "Syslog connection broken" או "Syslog connection failed". הערך שמוגדר כברירת מחדל הוא EMAIL_UNCATEGORIZED אם application הוא postfix/qmgr, postfix/local או postfix/pickup. מקודד באופן קשיח ל-"EMAIL_TRANSACTION" אם application הוא "postfix/local" או "postfix/pickup" ו-status הוא "sent (delivered to mailbox)". מקודד באופן קשיח ל-"NETWORK_HTTP" אם application הוא "sshd" ו-description לא מכיל את "check pass; user unknown" ו-description לא מכיל את "authentication failure" ו-description לא מכיל את "invalid". מקודד באופן קשיח ל-"USER_LOGIN" אם description מכיל את "authentication failure" או "check pass; user unknown" או "Invalid user" או "invalid user" או אם error לא ריק. אם הערך של file_path לא ריק, הערך שמוגדר הוא FILE_SYNC. מקודד באופן קשיח ל-"PROCESS_UNCATEGORIZED" אם message מכיל את "reconfigure" ו-application הוא "pman". מקודד באופן קשיח ל-"PROCESS_TERMINATION" אם message מכיל את "exit code 1" ו-application הוא "pman". הערך מוצפן כ-'NETWORK_CONNECTION' אם eventType לא ריק וגם srcIP ו-dstIP לא ריקים. מקודד באופן קשיח לערך "USER_LOGIN" אם הערך של has_principal הוא "true", הערך של has_target הוא "true" והערך של event-type הוא "Login". הערך מקודד באופן קשיח ל-"NETWORK_CONNECTION" אם has_principal הוא "true" ו-has_target הוא "true" ו-protocol לא ריק. מקודד באופן קשיח ל-"STATUS_UPDATE" אם הערך של has_principal הוא "true". מקודד באופן קשיח ל-"GENERIC_EVENT" אם event_type ריק או "GENERIC_EVENT" |
|
| metadata.log_type | הערך שמוגדר הוא IMPERVA_DB | |
| metadata.product_name | קוד קשיח ל-"IMPERVA DB" | |
| metadata.vendor_name | קוד קשיח ל-"IMPERVA DB" | |
| security_result.action | מקודד כ-"ALLOW" אם description לא מכיל את "authentication failure" או "check pass; user unknown" או "Invalid user" או "invalid user" ו-error ריק. מוגדר כ-BLOCK אם description מכיל את הערכים authentication failure, check pass; user unknown, Invalid user, invalid user או אם error לא ריק |
|
| security_result.rule_id | אם description מכיל את "alert_score" או את "new_alert_score", צריך לחלץ את ruleid מ-description ולמפות אותו ל-security_result.rule_id |
|
version |
metadata.product_version |
מופה מיומן השינויים |
source-ip |
principal.ip |
מופה מיומן השינויים |
source-port |
principal.port |
מופה מיומן השינויים |
server-group", "service-name", "user-group", "raw-query", "parsed-query", "bind-variables", "sql-error", "db-schema-pair.db-name", "db-schema-pair.schema-name", and "objects-list |
additional.fields |
מופה מיומן השינויים |
source-application |
principal.application |
מופה מיומן השינויים |
event-id |
metadata.product_log_id |
מופה מיומן השינויים |
application-user |
principal.user.user_display_name |
מופה מיומן השינויים |
mx-ip", "gw-ip |
intermediary.ip |
מופה מיומן השינויים |
policy-id" and "user-authenticated |
security_result.detection_fields |
מופה מיומן השינויים |
srcPort |
principal.port |
מופה מיומן השינויים |
srcIP |
principal.ip |
מופה מיומן השינויים |
event_name |
metadata.product_event_type |
מופה מיומן השינויים |
יומן שינויים
צפייה ביומן השינויים של כלי הניתוח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.