איסוף יומנים של Ivanti Connect Secure‏ (Pulse Secure)

נתמך ב:

במסמך הזה מוסבר איך להטמיע יומני Ivanti Connect Secure (Pulse Secure) ב-Google Security Operations באמצעות סוכן Bindplane.

‫Ivanti Connect Secure (לשעבר Pulse Secure) הוא פתרון SSL VPN שמספק גישה מאובטחת מרחוק לאפליקציות, למשאבים ולרשתות של הארגון. הוא תומך באימות רב-שלבי, בבדיקת תאימות של נקודות קצה ובמדיניות גישה מפורטת לעובדים ולשותפים מרחוק.

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

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

  • מכונה של Google SecOps
  • ‫Windows Server 2016 ואילך, או מארח Linux עם systemd
  • אם אתם משתמשים בשרת proxy, ודאו שהיציאות של חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane.
  • גישה עם הרשאות למסוף Admin של Ivanti Connect Secure (Pulse Secure)‎

קבלת פרטי כניסה ל-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/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
        creds_file_path: '/path/to/ingestion-authentication-file.json'
        customer_id: 'YOUR_CUSTOMER_ID'
        endpoint: chronicle.googleapis.com
        log_type: 'PULSE_SECURE_VPN'
        raw_log_field: body
        ingestion_labels:
    
    service:
      pipelines:
        logs/source0__chronicle_w_labels-0:
          receivers:
            - udplog
          exporters:
            - chronicle/chronicle_w_labels
    

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

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

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

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

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

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

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

    exporters:
      chronicle/chronicle_w_labels:
        compression: gzip
        creds_file_path: '/path/to/ingestion-authentication-file.json'
        customer_id: 'YOUR_CUSTOMER_ID'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: 'PULSE_SECURE_VPN'
        raw_log_field: body
        ingestion_labels:
    

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

  • אחרי שמסיימים לערוך, שומרים את הקובץ:
    • 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 ב-Ivanti Connect Secure‏ (Pulse Secure)

  1. נכנסים למסוף Admin של Ivanti Connect Secure (לשעבר Pulse Secure).
  2. עוברים אל System > Log/Monitoring.
  3. לוחצים על הכרטיסייה הגדרות.
  4. בקטע של הגדרת שרת ה-syslog, מזינים את הפרטים הבאים:
    • ‫Server name/IP: מזינים את כתובת ה-IP או את ה-FQDN של המארח של סוכן Bindplane.
    • ‫Facility: בוחרים באפשרות LOCAL0 (או במתקן המועדף מ-LOCAL0 עד LOCAL7).
    • סוג: בוחרים באפשרות UDP.
    • מסנן: בוחרים באפשרות רגיל.
    • ‫Source Interface: בוחרים באפשרות Global (או בממשק הספציפי שיכול להגיע לסוכן Bindplane).
  5. לוחצים על הוספה.
  6. לוחצים על שמירת השינויים.
  7. כדי להפעיל דיווח ב-syslog לכל קטגוריית יומן, מבצעים את הפעולות הבאות בכל כרטיסיית יומן מקומי:

    1. לוחצים על הכרטיסייה Events, מסמנים את התיבה של שרת ה-syslog ולוחצים על Save Changes.
    2. לוחצים על הכרטיסייה User Access, מסמנים את תיבת הסימון של שרת ה-syslog ולוחצים על Save Changes.
    3. לוחצים על הכרטיסייה Admin Access (גישת אדמין), מסמנים את התיבה של שרת ה-syslog ולוחצים על Save Changes (שמירת השינויים).
  8. כדי לוודא שהודעות syslog נשלחות, בודקים את יומני הסוכן של Bindplane.

טבלת מיפוי UDM

שדה ביומן מיפוי UDM Logic (פונקציה לוגית)
פעולה security_result.action_details ממופה ישירות משדה הפעולה.
אפליקציה principal.application ממופה ישירות מהשדה של האפליקציה.
bytes_read network.received_bytes ממופה ישירות מהשדה bytes_read ומומר למספר שלם ללא סימן.
bytes_written network.sent_bytes ממופה ישירות מהשדה bytes_written ומומר למספר שלם ללא סימן.
client_host principal.hostname, principal.asset.hostname ממופה ישירות מהשדה client_host.
cmd principal.process.command_line ממופה ישירות מהשדה cmd.
connection_status security_result.detection_fields.value.string_value ממופה ישירות מהשדה connection_status.
data_time metadata.event_timestamp.seconds מנותח מהשדה data_time באמצעות פורמטים שונים של חותמות זמן (MM-dd-yyyy HH:mm:ss Z, ‏ RFC 3339, ‏ ISO8601, ‏ MMM d HH:mm:ss, ‏ MMM d HH:mm:ss).
devname principal.hostname, principal.asset.hostname ממופה ישירות מהשדה devname.
dstip target.ip, target.asset.ip ממופה ישירות מהשדה dstip.
dstport target.port ממופה ישירות מהשדה dstport ומומר למספר שלם.
dstcountry target.location.country_or_region ממופה ישירות מהשדה dstcountry אם הוא לא "שמור" או ריק.
משך זמן network.session_duration.seconds ממופה ישירות משדה משך המסגרת ומומר למספר שלם.
dvc ‫intermediary.hostname או intermediary.ip אם אפשר להמיר את השדה dvc לכתובת IP, הוא ממופה ל-intermediary.ip. אחרת, הוא ממופה ל-intermediary.hostname.
dvc_hostname ‫intermediary.hostname, ‏ principal.hostname, ‏ principal.asset.hostname או intermediary.ip, ‏ principal.ip, ‏ principal.asset.ip אם אפשר להמיר את השדה dvc_hostname לכתובת IP, הוא ממופה לשדות ה-IP המתאימים. אחרת, הוא ממופה לשדות המתאימים של שם המארח.
event_type metadata.product_event_type ממופה ישירות מהשדה event_type.
failure_reason security_result.description ממופה ישירות מהשדה failure_reason. אם ההודעה מכילה את המילים "because host", הטקסט "host" מתווסף לפני סיבת הכישלון.
has_principal event.idm.read_only_udm.principal (presence) הערך מוגדר כ-"true" אם שדות ראשיים כלשהם מאוכלסים, אחרת הוא מוגדר כ-"false". נגזר מהלוגיקה של המנתח.
has_target event.idm.read_only_udm.target (presence) צריך להגדיר את הערך "true" אם שדות היעד מאוכלסים, או "false" אם הם לא מאוכלסים. נגזר מהלוגיקה של המנתח.
has_target_user event.idm.read_only_udm.target.user.userid (נוכחות) הערך מוגדר כ-"true" אם השדה target.user.userid מאוכלס, אחרת הוא מוגדר כ-"false". נגזר מהלוגיקה של המנתח.
host_ip ‫principal.ip, ‏ principal.asset.ip ממופה ישירות מהשדה host_ip.
host_mac principal.mac ממופה ישירות מהשדה host_mac, ומחליף מקפים בנקודתיים.
http_method network.http.method ממופה ישירות מהשדה http_method.
http_response network.http.response_code ממופה ישירות מהשדה http_response ומומר למספר שלם.
info_desc about.labels.value ממופה ישירות מהשדה info_desc.
ip_new target.ip, target.asset.ip ממופה ישירות מהשדה ip_new.
רמה security_result.severity, security_result.severity_details השדה security_result.severity נגזר משדה הרמה ("error"/"warning" -> HIGH, "notice" -> MEDIUM, "information"/"info" -> LOW). הערך הגולמי של הרמה ממופה גם ל-security_result.severity_details.
logid metadata.product_log_id ממופה ישירות מהשדה logid.
locip ‫principal.ip, ‏ principal.asset.ip ממופה ישירות מהשדה locip.
הודעה metadata.description משמש לחילוץ שדות שונים באמצעות מסנני grok ו-kv. אם ההודעה מכילה את הערך EventID, היא מעובדת כיומן אירועים של Windows.
message_info metadata.description ממופה ישירות ל-metadata.description אם לא נעשה בו שימוש אחר בתבניות grok ספציפיות יותר.
msg metadata.product_event_type, metadata.description אם השדה msg קיים, סוג המוצר מחולץ וממופה ל-metadata.product_event_type, ושאר ההודעה ממופה ל-metadata.description.
msg_hostname principal.hostname, principal.asset.hostname ממופה ישירות מהשדה msg_hostname.
msg_ip ‫principal.ip, ‏ principal.asset.ip ממופה ישירות מהשדה msg_ip.
msg_user_agent network.http.user_agent, network.http.parsed_user_agent, metadata.product_version מחרוזת סוכן המשתמש ממופה ל-network.http.user_agent, סוכן המשתמש המנותח ממופה ל-network.http.parsed_user_agent, וגרסת המוצר (אם קיימת) ממופה ל-metadata.product_version.
network_duration network.session_duration.seconds ממופה ישירות מהשדה network_duration ומומר למספר שלם.
policyid security_result.rule_id ממופה ישירות מהשדה policyid.
policyname security_result.rule_name ממופה ישירות מהשדה policyname.
policytype security_result.rule_type ממופה ישירות מהשדה policytype.
priority_code about.labels.value ממופה ישירות מהשדה priority_code ומשמש גם להפקת about.labels.value למפתח "Severity" (ראו לוגיקה).
prod_name metadata.product_name ממופה ישירות מהשדה prod_name.
product_type metadata.product_event_type ממופה ישירות מהשדה product_type.
product_version metadata.product_version ממופה ישירות מהשדה product_version.
proto network.ip_protocol ממופה ל-network.ip_protocol אחרי המרה לשם של פרוטוקול IP באמצעות חיפוש.
pwd principal.process.file.full_path ממופה ישירות מהשדה pwd.
מקבץ שרתי משחק (Realm) principal.group.attribute.labels.value ממופה ישירות מהשדה realm.
rcvdbyte network.received_bytes ממופה ישירות מהשדה rcvdbyte ומומר למספר שלם ללא סימן.
remip target.ip ממופה ישירות מהשדה remip.
resource_name target.resource.name ממופה ישירות מהשדה resource_name אחרי הסרת רווחים לבנים ומקפים בתחילת הטקסט או בסופו.
resource_status security_result.description ממופה ישירות מהשדה resource_status.
resource_user_group principal.user.group_identifiers ממופה ישירות מהשדה resource_user_group.
resource_user_name principal.user.userid ממופה ישירות מהשדה resource_user_name.
roles principal.user.group_identifiers ממופה ישירות מהשדה "תפקידים".
sentbyte network.sent_bytes ממופה ישירות מהשדה sentbyte ומומר למספר שלם ללא סימן.
session_id network.session_id ממופה ישירות מהשדה session_id.
sessionid network.session_id ממופה ישירות מהשדה sessionid.
srcip ‫principal.ip, ‏ principal.asset.ip ממופה ישירות מהשדה srcip.
srcport principal.port ממופה ישירות מהשדה srcport ומומר למספר שלם.
srccountry principal.location.country_or_region ממופה ישירות מהשדה srccountry אם הוא לא "שמור" או ריק.
סוג משנה metadata.product_event_type משמש בשילוב עם סוג כדי ליצור את metadata.product_event_type.
target_file target.file.full_path ממופה ישירות מהשדה target_file.
target_host target.hostname, target.asset.hostname ממופה ישירות מהשדה target_host.
target_ip target.ip, target.asset.ip ממופה ישירות מהשדה target_ip.
target_port target.port ממופה ישירות מהשדה target_port ומומר למספר שלם.
target_url target.url ממופה ישירות מהשדה target_url.
פעם metadata.event_timestamp.seconds מנותח משדה הזמן באמצעות הפורמט "yyyy-MM-dd HH:mm:ss".
סוג metadata.product_event_type משמש בשילוב עם סוג משנה כדי ליצור את metadata.product_event_type.
u_event_source_ip ‫principal.ip, ‏ principal.asset.ip או target.ip אם target_ip או target_host קיימים, u_event_source_ip ממופה ל-principal.ip ול-principal.asset.ip. אחרת, אם target_ip,‏ target_host ו-target_url ריקים, u_event_source_ip ממופה ל-target.ip.
u_observer_ip observer.ip ממופה ישירות מהשדה u_observer_ip.
u_prin_ip ‫principal.ip, ‏ principal.asset.ip ממופה ישירות מהשדה u_prin_ip.
משתמש target.user.userid ממופה ישירות מהשדה של המשתמש.
user_agent network.http.user_agent, network.http.parsed_user_agent מחרוזת סוכן המשתמש ממופה ל-network.http.user_agent, וסוכן המשתמש המנותח ממופה ל-network.http.parsed_user_agent.
user_group_identifier target.user.group_identifiers או principal.user.group_identifiers ברוב המקרים, ממופה ל-target.user.group_identifiers. ממופה ל-principal.user.group_identifiers באירועים של שינוי IP‏ (USER_UNCATEGORIZED) והגבלות על תחום.
user_ip ‫principal.ip, ‏ principal.asset.ip ממופה ישירות מהשדה user_ip. אם השדה ריק והשדה u_event_source_ip לא ריק, הוא מקבל את הערך של u_event_source_ip.
שם משתמש principal.user.userid או target.user.userid ברוב המקרים, ממופה ל-principal.user.userid. ממופה ל-target.user.userid בתרחישים ספציפיים (למשל, כש-detect_user_logout_failed הוא False ו-detect_policy_change_failed הוא False).
username_removed target.user.userid ממופה ישירות מהשדה username_removed.
vd principal.administrative_domain ממופה ישירות מהשדה vd.
client_ip event.idm.read_only_udm.principal.ip מופה מיומן השינויים
client_ip event.idm.read_only_udm.principal.asset.ip מופה מיומן השינויים
req_host event.idm.read_only_udm.target.hostname מופה מיומן השינויים
req_host event.idm.read_only_udm.target.asset.hostname מופה מיומן השינויים
target_url event.idm.read_only_udm.target.url מופה מיומן השינויים
http_method event.idm.read_only_udm.network.http.method מופה מיומן השינויים
referrer_url event.idm.read_only_udm.network.http.referral_url מופה מיומן השינויים
sr_action event.idm.read_only_udm.security_result.action מופה מיומן השינויים
http_version event.idm.read_only_udm.network.application_protocol_version מופה מיומן השינויים
server_name event.idm.read_only_udm.intermediary.hostname מופה מיומן השינויים
server_name event.idm.read_only_udm.intermediary.asset.hostname מופה מיומן השינויים
BLOCK security_result.action מופה מיומן השינויים
Pulse Secure VPN metadatda.product_name מופה מיומן השינויים
observer_hostname observer.hostname מופה מיומן השינויים
priority_code", "Syslog_version", and "info_desc about.labels מופה מיומן השינויים

יומן שינויים

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

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