תחביר של קטע התנאי

נתמך ב:

במסמך הזה מוסבר איך אפשר להשתמש בקטע condition של שאילתת YARA-L 2.0.

ההשפעה של הקטע condition תלויה בשאלה אם אתם מריצים שאילתה אד-הוק או פורסים כלל קבוע, באופן הבא:

  • בחיפוש ובלוחות בקרה: פועל כמסנן לאחר החיפוש, ומחזיר ומציג רק רשומות שעומדות בתנאים של הביטויים שצוינו.
  • כללי זיהוי (חובה): משמשים כלוגיקה של הטריגר. התראה מופעלת רק אם התנאים מתקיימים (true) בחלון זמן נתון של match.

בקטע condition מגדירים ביטויים שמסננים אירועים ומשתני placeholder. כשמשתמשים בו בשאילתת חיפוש או בשאילתת לוח בקרה, הוא מציג רק פלט שעומד בתנאים. כשמשתמשים בהם בכלל זיהוי, התנאים צריכים להתקיים כדי להפעיל התראה.

בקטע condition, אתם יכולים להשתמש באופרטורים בוליאניים, באופרטורים להשוואה ובתוצאות של משתני outcome כדי לקבוע אם השאילתה צריכה להפעיל את הטריגר.

הגדרת הקטע condition

מגדירים את ביטויי התנאים לאירועים ולמשתני placeholder בקטע condition. אפשר לציין match תנאים למשתנים מהקטע events, ואם רוצים, אפשר להשתמש במילת המפתח and כדי לכלול לוגיקה שמבוססת על הקטע outcome. פרטים נוספים זמינים במאמר בנושא תחביר של קטע התוצאה.

אפשר לחבר בין הביטויים באמצעות מילות המפתח and או or:

  • צריך להשתמש ב-and בין התנאים.

  • משתמשים ב-or רק כשהשאילתה מכילה משתנה אירוע אחד.

משתמשים בתו # בקטע condition לפני שם של אירוע או של משתנה placeholder כדי לייצג את מספר האירועים או הערכים הייחודיים שעומדים בכל התנאים בקטע events. לדוגמה:

#c > 1 פירושו שהמשתנה c חייב להופיע יותר מפעם אחת.

כדי לייצג את הערך של תוצאה מסוימת, משתמשים בתו $ בקטע condition לפני שם המשתנה של התוצאה. אם משתמשים בו לפני אירוע או שם של משתנה placeholder (לדוגמה, $event), הוא מייצג את #event > 0.

בדוגמה הזו של כלל, המערכת מחזירה זיהוי אם יש יותר מחמש (כפי שמוגדר בקטע condition) התחברויות שנכשלו לכל משתמש בחלון של 10 דקות (כפי שמוגדר בקטע match):

rule failed_logins
{
  meta:
   author = "Security Team"
   description = "Detects multiple failed user logins within 10-minute windows."
   severity = "HIGH"

  events:
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $user = $e.target.user.userid

  match:
   $user over 10m

  outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

  condition:
    #e >= 5
}

תנאים מוגבלים ולא מוגבלים

אפשר להשתמש בתנאים מוגבלים או לא מוגבלים בשאילתה:

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

    $var // equivalent to #var > 0

    #var > n // where n >= 0

    #var >= m // where m > 0

  • אפשר להשתמש בתנאים לא מוגבלים כדי לזהות היעדר של אירוע במהלך פרק זמן מסוים. לדוגמה, אירוע איום ללא אירוע צמצום בתוך חלון של 10 דקות. תנאים לא מוגבלים מאפשרים למשתנה האירוע המשויך לא להתקיים (שאילתות של אי-קיום), כלומר יכול להיות שאף מופע של האירוע לא יופיע בזיהוי, וכל הפניה לשדות במשתנה האירוע תניב ערך אפס.

    אלה תנאים לא מוגבלים:

    !$var // equivalent to #var = 0

    #var >= 0

    #var < n // where n > 0

    #var <= m // where m >= 0

דרישות לשאילתות לגבי אי-קיום

כדי ששאילתת אי-קיום תעבור קומפילציה, היא צריכה לעמוד בדרישות הבאות:

  • לפחות אירוע אחד של UDM צריך לכלול תנאי מוגבל (כלומר, צריך להיות לפחות אירוע אחד של UDM).
  • אם לפלייסולדר יש תנאי לא מוגבל, הוא חייב להיות משויך לפחות לאירוע אחד מוגבל של UDM.
  • אם לישות יש תנאי לא מוגבל, היא חייבת להיות משויכת לאירוע אחד לפחות של UDM עם תנאי מוגבל.

דוגמה: שאילתת אי-קיום

נבחן את השאילתה הבאה שבה הושמט קטע התנאי:

rule NonexistenceExample {
  meta:
      author = "Google Security"
      description = "Example: non-existence query."
  events:
      $u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
      $u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
      $e1.graph.metadata.entity_type = "FILE"        // $e1 is an entity.
      $e2.graph.metadata.entity_type = "FILE"        // $e2 is an entity.

      $user = $u1.principal.user.userid // Match variable is required for multi-event query.

      // Placeholder Associations:
      //   u1        u2
      //   |  \    /
      // port   ip
      //   |       \
      //   e1        e2
      $u1.target.port = $port
      $e1.graph.entity.port = $port
      $u1.principal.ip = $ip
      $u2.target.ip = $ip
      $e2.graph.entity.ip = $ip

      // UDM-Entity Associations:
      // u1 - u2
      // |  \  |
      // e1   e2
      $u1.metadata.event_type = $u2.metadata.event_type
      $e1.graph.entity.hostname = $u1.principal.hostname
      $e2.graph.entity.hostname = $u1.target.hostname
      $e2.graph.entity.hostname = $u2.principal.hostname

  match:
    $user over 5m

  condition:
      //Add valid condition
}

קטע תנאים תקין

דוגמאות לשימוש תקין בקטע של התנאי:

  • $u1 and !$u2 and $e1 and $e2
    • כל האירועים והישויות של UDM מופיעים בקטע התנאים.
    • לפחות אירוע אחד של UDM מוגבל.
  • $u1 and !$u2 and $e1 and !$e2
    • הערך $e2 לא מוגבל ומותר כי הוא משויך ל-$u1, שהוא מוגבל. אם $e2 לא היה משויך ל-$u1, הקישור הזה לא היה תקין.
  • #port > 50 and #ip = 0
    • אין אירועים וישויות של UDM בקטע של התנאי, אבל ה-placeholders שמופיעים מכסים את כל האירועים והישויות של UDM.
    • ‫$ip מוקצה גם ל-$u1 וגם ל-$u2, ו-#ip = 0 הוא תנאי לא מוגבל. עם זאת, תנאים מוגבלים חזקים יותר מתנאים לא מוגבלים. מכיוון שהערך $port מוקצה ל-$u1 ו-#port > 50 הוא תנאי מוגבל, $u1 עדיין מוגבל.

קטע תנאי לא חוקי

הדוגמאות הבאות לא תקינות בקטע התנאי:

  • $u1 and $e1
    • כל אירוע וכל ישות של UDM שמופיעים בקטע events חייבים להופיע בקטע condition (או שיוקצה להם placeholder שמופיע בקטע condition).
  • $u1, $u2, $e1, $u2, #port > 50
    • אסור להשתמש בפסיקים כמפרידים בין תנאים.
  • !$u1 and !$u2 and $e1 and $e2
    • הפרה של הדרישה הראשונה: לפחות אירוע UDM אחד צריך להיות מוגבל.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • מילת המפתח or לא נתמכת בתנאים לא מוגבלים.
  • ($u1 or $u2) and $e1 and $e2
    • אין תמיכה במילת המפתח or בין משתני אירועים שונים.
  • not $u1 and $u2 and $e1 and $e2
    • אסור להשתמש במילת המפתח not בתנאים של אירועים ופלייס הולדרים.
  • #port < 50 and #ip = 0
    • למרות שה-placeholder מפנה לכל האירועים והישויות של UDM, כל תנאי משויך הוא בלתי מוגבל. המשמעות היא שאף אחד מהאירועים ב-UDM לא מוגבל, ולכן הכלל לא מצליח להתקמפל.

תנאים להערכת תוצאות

אפשר לכלול תנאים למשתני התוצאה בקטע condition, בשילוב עם מילת המפתח and או or, או לפני מילת המפתח not.

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

  • מספר שלם: השוואה לליטרל של מספר שלם באמצעות האופרטורים =, >, >=, <, <=, != לדוגמה: $risk_score > 10

  • ‫float: השוואה לליטרל מסוג float באמצעות האופרטורים =, >, >=, <, <=, != לדוגמה: $risk_score <= 5.5

  • string: השוואה למחרוזת מילולית באמצעות = או != לדוגמה: $severity = "HIGH"

  • רשימה של מספרים שלמים או מערכים: מציינים תנאי באמצעות הפונקציה arrays.contains. לדוגמה: arrays.contains($event_ids, "id_1234")

אם מציינים תנאי תוצאה בשאילתה שיש בה קטע match, השאילתה מסווגת כשאילתה עם כמה אירועים לצורך מכסת השאילתות. מידע נוסף על סיווגים של אירוע אחד או כמה אירועים זמין במאמר בנושא תחביר של התאמה.

הגבלות

  • מומלץ להימנע משימוש במשתנה match בקטע condition. זו שגיאה סמנטית כי האירועים מקובצים לפי ערך המשתנה match.

  • מומלץ להימנע מהגדרה של תנאים לא מוגבלים בלבד לכל המשתנים event שהמשתנה match מוקצה להם. זו שגיאה סמנטית. כדי שיוחזר ערך של משתנה match, צריך להיות לפחות אירוע אחד שמכיל את הערך.

  • אם משתמשים בחלון נע, משתנה אירוע הציר חייב להיות מעורב לפחות בתנאי אחד מוגבל.

מה השלב הבא?

מידע נוסף

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