איסוף יומנים של 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. נכנסים למסוף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 Settings (הגדרות SIEM) > Profile (פרופיל).
  3. מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.

התקנת הסוכן של Bindplane

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

התקנת חלונות

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

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

התקנה ב-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
    

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

לאפשרויות התקנה נוספות, קראו את מדריך ההתקנה של סוכן Bindplane.

הגדרת סוכן Bindplane להטמעת Syslog ושליחה ל-Google SecOps

  1. ניגשים לקובץ התצורה:

    • מאתרים את הקובץ config.yaml. בדרך כלל, הוא נמצא בספרייה /opt/observiq-otel-collector/ ב-Linux או בספריית ההתקנה ב-Windows.
    • פותחים את הקובץ באמצעות כלי לעריכת טקסט (לדוגמה, nano,‏ vi או Notepad).
  2. עורכים את הקובץ 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 כדי להחיל את השינויים.

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

    sudo systemctl restart observiq-otel-collector
    
  2. כדי להפעיל מחדש את סוכן Bindplane ב-Windows, אפשר להשתמש במסוף Services או להזין את הפקודה הבאה:

    net stop observiq-otel-collector && net start observiq-otel-collector
    

הגדרת העברה של Syslog ב-Imperva Database

  1. נכנסים למסוף הניהול של Imperva SecureSphere.
  2. עוברים אל הגדרה > קבוצות פעולות.
  3. לוחצים על הוספה כדי ליצור קבוצת פעולות חדשה או לערוך קבוצה קיימת.
  4. לוחצים על הוספת פעולה ומזינים את פרטי ההגדרה הבאים:
    • שם: מזינים שם תיאורי (לדוגמה, Google SecOps Syslog).
    • סוג הפעולה: בוחרים באפשרות GW Syslog.
    • מארח: מזינים את כתובת ה-IP של סוכן Bindplane.
    • יציאה: מזינים את מספר היציאה של סוכן Bindplane (ברירת המחדל היא 514).
    • פרוטוקול: בוחרים באפשרות UDP או TCP, בהתאם להגדרות של סוכן Bindplane.
    • רמת הרישום ביומן של Syslog: בוחרים באפשרות ניפוי באגים כדי לקבל רישום מקיף ביומן.
    • Syslog Facility: בוחרים באפשרות LOCAL0 או במתקן המתאים.
    • ממשק פעולה: בוחרים באפשרות יומן שער – אירוע אבטחה – יומן מערכת (syslog) – פורמט JSON (מורחב) לפורמט SYSLOG+JSON, או באפשרות יומן שער – אירוע אבטחה – יומן מערכת (syslog) לפורמט SYSLOG רגיל.
  5. שומרים את הגדרת הפעולה.
  6. עוברים אל Policies > Security Policies או אל Policies > Database Audit Policies.
  7. עורכים את המדיניות הרלוונטית ומוסיפים את קבוצת הפעולות שמכילה את פעולת ה-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.