הסבר על תחביר החיפוש
המדריך הזה מיועד לאנליסטים בתחום האבטחה שרוצים להגדיר ביטויי חיפוש (ערכי נתונים, תווי בריחה, אופרטורים וכו') בכלי לעריכת שאילתות בדף החיפוש של 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. כל רשומה מאחסנת צמד מפתח/ערך:
additionalfields: יכול להכיל כמה צמדי מפתח/ערך לכל אירוע (additional.fields["key"] = "value").
labelsfields: יכול להכיל רק זוג אחד של מפתח/ערך לכל אירוע (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_domainabout.asset.network_domainnetwork.dns.questions.namenetwork.dns_domainprincipal.administrative_domainprincipal.asset.network_domaintarget.administrative_domaintarget.asset.hostnametarget.asset.network_domaintarget.hostname |
email |
intermediary.user.email_addressesnetwork.email.fromnetwork.email.toprincipal.user.email_addressessecurity_result.about.user.email_addressestarget.user.email_addresses |
file_path |
principal.file.full_pathprincipal.process.file.full_pathprincipal.process.parent_process.file.full_pathtarget.file.full_pathtarget.process.file.full_pathtarget.process.parent_process.file.full_path |
hash |
about.file.md5about.file.sha1about.file.sha256principal.process.file.md5principal.process.file.sha1principal.process.file.sha256security_result.about.file.sha256target.file.md5target.file.sha1target.file.sha256target.process.file.md5target.process.file.sha1target.process.file.sha256 |
hostname |
intermediary.hostnameobserver.hostnameprincipal.asset.hostnameprincipal.hostnamesrc.asset.hostnamesrc.hostnametarget.asset.hostnametarget.hostname |
ip |
intermediary.ipobserver.ipprincipal.artifact.ipprincipal.asset.ipprincipal.ipsrc.artifact.ipsrc.asset.ipsrc.iptarget.artifact.iptarget.asset.iptarget.ip |
namespace |
principal.namespacesrc.namespacetarget.namespace |
process_id |
principal.process.parent_process.pidprincipal.process.parent_process.product_specific_process_idprincipal.process.pidprincipal.process.product_specific_process_idtarget.process.parent_process.pidtarget.process.parent_process.product_specific_process_idtarget.process.pidtarget.process.product_specific_process_id |
user |
about.user.useridobserver.user.useridprincipal.user.user_display_nameprincipal.user.useridprincipal.user.windows_sidsrc.user.useridtarget.user.user_display_nametarget.user.useridtarget.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.