הסבר על תחביר החיפוש

נתמך ב:

המדריך הזה מיועד לאנליסטים בתחום האבטחה שרוצים להגדיר ביטויי חיפוש (ערכי נתונים, תווי בריחה, אופרטורים וכו') בכלי לעריכת שאילתות בדף החיפוש של SIEM.

כשכותבים ביטויי חיפוש ב-YARA-L 2.0 או ב-SQL בכלי לעריכת שאילתות ב-Google Security Operations, צריך לעצב את ערכי הנתונים, האופרטורים ורצפי הבריחה של המחרוזות בהתאם לסוג הנתונים המדויק של שדה ה-UDM של היעד. תנאי חיפוש מורכב משם של שדה UDM, אופרטור השוואה (=,‏ !=,‏ >,‏ <,‏ <=,‏ >=) וערך נתונים מפורמט.

עיצוב ערכי נתונים לפי סוג הנתונים

בקטע הזה מתוארים הנושאים הבאים:

ערכים ממוספרים (enums)

צריך לכתוב את הערכים של ה-Enum כמחרוזות טקסט באותיות רישיות, שזהות בדיוק להגדרות המילון התקפות של UDM, ומוקפות במירכאות כפולות ("), כמו בדוגמה הבאה:

metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"

ערכים בוליאניים

בשדות בוליאניים אפשר להזין true או false (לא תלוי רישיות, לא נדרשות מירכאות), כמו בדוגמה הבאה:

network.dns.response = true target.user.is_admin = false

מספרים שלמים וערכים מספריים

מספרים שלמים ומספרי יציאות נכתבים כספרות ללא מרכאות כפולות, כמו בדוגמה הבאה:

target.port = 443 network.sent_bytes > 10485760

ערכים מסוג float ומספרים עשרוניים

בשדות UDM מסוג float או double, מזינים מספר עשרוני או מספר שלם ללא מירכאות כפולות, כמו בדוגמה הבאה:

security_result.about.asset.vulnerabilities.cvss_base_score = 9.8

מחרוזות טקסט

ערכי טקסט רגילים צריכים להיות מוקפים במירכאות כפולות ("), כמו בדוגמה הבאה:

metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"

התאמה לא תלוית אותיות רישיות (nocase)

כברירת מחדל, השוואות מחרוזות ב-YARA-L 2.0 הן תלויות אותיות רישיות. כדי להתאים לכל שילוב של אותיות רישיות וקטנות, מוסיפים את האופרטור nocase ישירות בסוף התנאי, כמו בדוגמה הבאה:

principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase

שימוש בתווי Escape במחרוזות (‎\‎ ו-‎ "‎)

אם ליטרל מחרוזת מכיל לוכסנים הפוכים או מירכאות כפולות, צריך להוסיף לוכסן הפוך לפני התווים האלה (\\), כמו בדוגמה הבאה:

  • משתמשים ב-\\ כדי להתאים ללוכסן נטוי (\\).
  • משתמשים ב-\" כדי להתאים למירכאות כפולות (").

  • חיפוש נתיבי קבצים ב-Windows עם קו נטוי הפוך שמוקף בגרשיים:

    principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
    
  • חיפוש שורות פקודה שמכילות מירכאות כפולות מוטמעות:

    target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
    

ביטויים רגולריים (תחביר RE2)

כדי לחפש באמצעות ביטויים רגולריים, מקיפים את תבנית הביטוי הרגולרי בלוכסנים (/ /) במקום במירכאות כפולות. ב-Google SecOps נעשה שימוש במנוע הביטויים הרגולריים הרגיל של RE2:

  • התאמה לכל כתובת IP ראשית בטווח 10.x.x.x, כמו בדוגמה הבאה:

    principal.ip = /10\..*/
    
  • מחפשים את ההפעלה של PsExec עם התוסף האופציונלי .exe, ללא הבחנה בין אותיות רישיות לאותיות קטנות, כמו בדוגמה הבאה:

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • התאמה של שמות מארחים של DNS דינמי לפי תבנית ממוספרת, כמו בדוגמה הבאה:

    principal.hostname = /dns-server-[0-9]+/ nocase
    

לוגיקה בוליאנית וקדימות אופרטורים

משלבים כמה תנאי חיפוש באמצעות האופרטורים AND, OR ו-NOT. אפשר להשתמש בסוגריים () כדי לקבץ ביטויים באופן מפורש ולשלוט בסדר העדיפויות של ההערכה, כמו בדוגמאות הבאות:

  • חיפוש של אירועי התחברות ספציפיים של משתמשים במארח רגיש, כמו בדוגמה הבאה:

    metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"
    
    
  • משתמשים בסוגריים כדי לבודד תנאי OR משרשרות של תנאי AND, כמו בדוגמה הבאה:

    metadata.event_type = "PROCESS_LAUNCH" AND principal.process.file.full_path = /winword.exe/ nocase AND (target.process.file.full_path = /cmd.exe/ OR target.process.file.full_path = /powershell.exe/)
    

חיפוש של צמדים של מפתח/ערך בשדות additional ו-labels

השדות additional ו-labels משמשים כמאגרי נתונים גמישים לנתוני אירועים מותאמים אישית ולמאפיינים של ספקי צד שלישי שלא ממופים לשדות רגילים של UDM. כל רשומה מאחסנת צמד מפתח/ערך:

  • ‫additional fields: יכול להכיל כמה צמדי מפתח/ערך לכל אירוע (additional.fields["key"] = "value").

  • ‫labels fields: יכול להכיל רק זוג אחד של מפתח/ערך לכל אירוע (labels["key"] = "value").

התאמה מדויקת של צמד מפתח/ערך (field["key"] = "value")

אפשר להשתמש בתחביר של סוגריים כדי לשאול ישירות על מפתח ספציפי ועל ערך המחרוזת התואם שלו, כמו בדוגמה הבאה:

additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"

התאמה מתקדמת של ביטויי Regex וערכים שהם לא מחרוזות בשדות additional

אם אתם צריכים לשלוח שאילתות לגבי ערכים מספריים או בוליאניים בשדות additional, או להתאים מפתחות וערכים באמצעות ביטויים רגולריים, אתם צריכים להשתמש בנתיב המלא של שדה ה-protobuf:

  • התאמה לכל מחרוזת ערך בתוך מאגר נוסף באמצעות ביטוי רגולרי:

    additional.fields.value.string_value = /suspicious_payload_.*/ nocase
    
  • התאמה של ערכים בוליאניים או מספריים בשדות מותאמים אישית:

    additional.fields.value.bool_value = true additional.fields.value.number_value > 500
    
  • חיפוש בכמה מפתחות דינמיים שתואמים לקידומת של ביטוי רגולרי:

    additional.fields.key = /^myKeyNumber_.*/
    
  • כדי לבדוק אם מפתח קיים בלי קשר לערך:

    additional.fields["pod_name"] != ""
    
  • שימוש בביטויים רגולריים וב-nocase ישירות עם תחביר של סוגריים:

    additional.fields["pod_name"] = /br/
    additional.fields["pod_name"] = bar nocase
    
  • משלבים כמה צמדים של מפתח/ערך additional.fields באמצעות AND:

    additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
    

חיפוש שדות מקובצים

שדות מקובצים הם כינויים לקבוצות של שדות UDM קשורים. אפשר להשתמש בהם כדי לשלוח שאילתה לכמה שדות UDM בו-זמנית בלי להקליד כל שדה בנפרד.

בדוגמה הבאה מוצגת שאילתה שמתאימה לשדות הנפוצים של UDM שעשויים להכיל את כתובת ה-IP שצוינה:

ip = "1.2.3.4"

אפשר להתאים שדה מקובץ באמצעות ביטוי רגולרי ושימוש באופרטור nocase. יש תמיכה גם ברשימות הפניות. אפשר גם להשתמש בשדות מקובצים בשילוב עם שדות רגילים של UDM, כמו בדוגמה הבאה:

ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"

סוגים של שדות UDM מקובצים

אפשר לחפש בכל השדות הבאים של UDM שמקובצים יחד:

שם השדה המקובץ שדות UDM משויכים
domain about.administrative_domain
about.asset.network_domain
network.dns.questions.name
network.dns_domain
principal.administrative_domain
principal.asset.network_domain
target.administrative_domain
target.asset.hostname
target.asset.network_domain
target.hostname
email intermediary.user.email_addresses
network.email.from
network.email.to
principal.user.email_addresses
security_result.about.user.email_addresses
target.user.email_addresses
file_path principal.file.full_path
principal.process.file.full_path
principal.process.parent_process.file.full_path
target.file.full_path
target.process.file.full_path
target.process.parent_process.file.full_path
hash about.file.md5
about.file.sha1
about.file.sha256
principal.process.file.md5
principal.process.file.sha1
principal.process.file.sha256
security_result.about.file.sha256
target.file.md5
target.file.sha1
target.file.sha256
target.process.file.md5
target.process.file.sha1
target.process.file.sha256
hostname intermediary.hostname
observer.hostname
principal.asset.hostname
principal.hostname
src.asset.hostname
src.hostname
target.asset.hostname
target.hostname
ip intermediary.ip
observer.ip
principal.artifact.ip
principal.asset.ip
principal.ip
src.artifact.ip
src.asset.ip
src.ip
target.artifact.ip
target.asset.ip
target.ip
namespace principal.namespace
src.namespace
target.namespace
process_id principal.process.parent_process.pid
principal.process.parent_process.product_specific_process_id
principal.process.pid
principal.process.product_specific_process_id
target.process.parent_process.pid
target.process.parent_process.product_specific_process_id
target.process.pid
target.process.product_specific_process_id
user about.user.userid
observer.user.userid
principal.user.user_display_name
principal.user.userid
principal.user.windows_sid
src.user.userid
target.user.user_display_name
target.user.userid
target.user.windows_sid

הוספת הערות בשאילתה

אתם יכולים להוסיף הערות בתוך כלי עריכת החיפוש כדי לתעד לוגיקה מורכבת של חיפוש או כדי להשבית זמנית תנאים במהלך בדיקה:

  • תגובות בשורה אחת: מוסיפים לפני הטקסט של התגובה שני לוכסנים (//). כל מה שמופיע אחרי הלוכסנים בשורה הזו מתעלמים ממנו.
  • הערות בלוק עם כמה שורות: מקיפים את טקסט ההערה ב-/* וב-*/. תגובות שכוללות חסימה יכולות להתפרס על פני כמה שורות.

דוגמה:

metadata.event_type = "NETWORK_CONNECTION" AND
// Exclude approved corporate proxy traffic
target.ip != "192.0.2.100" AND
/* Uncomment the lines below when investigating specific lateral
   movement across subnet 10.240.0.0/16 */
// principal.ip = /10.240\..*/ AND
// network.sent_bytes > 5000000

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