סקירה כללית של כללי הזיהוי

נתמך ב:

שפת הכללים של YARA-L

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

כללי זיהוי לדוגמה ב-Google Security Operations

כדי לעזור לכם להטמיע את מנוע הזיהוי של Google SecOps, יצרנו מאגר ב-GitHub עם כללים לדוגמה. המאגר הזה מכיל כמה קטגוריות שונות של כללי זיהוי, כולל:

  • Google Cloud CloudAudit
  • Google Workspace
  • אזהרות עם מידע
  • תוכנה זדונית
  • MITRE ATT&CK
  • כללים של SOC prime
  • אירועים חשודים

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

דוגמאות לכללים ולשינויים

הכלל הבא יוצר משתנה אירוע $e1 שמשמש למעקב אחרי סוג האירוע. משתנה האירוע יכול להיות כל ערך שיש לו משמעות לנתונים שנבדקים. השדה ב-UDM שנבדק באירוע הזה הוא metadata.eventype, ולכן הגיוני פשוט לקרוא לו e1. השורות הבאות מחפשות מקרים ספציפיים של התאמות לביטויים רגולריים ב-e1. התנאי שיוצר זיהוי ב-Google SecOps הוא כל פעם שהאירוע $e1 מתרחש. לצורך שינוי הגדרות, מסופק תנאי not להחרגת נתיבים מסוימים שאינם זדוניים עבור הארגומנט של שורת הפקודה. אפשר להוסיף לכלל הזה עוד not תנאים אם מזהים תוצאות חיוביות כוזבות שחוזרות לעיתים קרובות מנתיבי קבצים ידועים אחרים.

rule suspicious_unusual_location_svchost_execution

{
 meta:
   author = "Google Cloud Security"
   description = "Windows 'svchost' executed from an unusual location"
   yara_version = "YL2.0"
   rule_version = "1.0"

 events:
   $e1.metadata.event_type = "PROCESS_LAUNCH"
   re.regex($e1.principal.process.command_line, `\bsvchost(\.exe)?\b`) nocase
   not re.regex($e1.principal.process.command_line, `\\Windows\\System32\\`) nocase

condition:
   $e1
}

ציון של יותר ממשתנה אירוע אחד

ב-YARA-L אפשר להשתמש ביותר ממשתנה אירוע אחד בכלל. בדוגמה הבאה, הכלל כולל את האירועים $e1 ו-$e2. התנאי מציין את התנאי הלוגי שמפעיל את הזיהוי.

rule ExcludeZeroValues {
  meta:
    author = "noone@google.com"

  events:
    $e1.metadata.event_type = "NETWORK_DNS"
    $e1.principal.hostname = $hostname

    // $e1.principal.user.userid may be empty string.
    $e1.principal.user.userid != "Guest"

    $e2.metadata.event_type = "NETWORK_HTTP"
    $e2.principal.hostname = $hostname

    // $e2.target.asset_id cannot be empty string as explicitly specified.
    $e2.target.asset_id != ""

  match:
    // $hostname cannot be empty string.
    $hostname over 1h

  condition:
    $e1 and $e2
}

הקטע 'תוצאת הכללים'

משתמשים בקטע התוצאה כדי להגדיר משתני אחזקה בתוך זיהוי הכלל, כדי לספק העשרה לצריכה במורד הזרם. לדוגמה, אפשר להוסיף מידע על ניקוד חומרה שמבוסס על נתונים מהאירועים שמנותחים. הזיהוי הבא בוחן שני אירועים כדי לשייך את הערך $hostname. אם הערך $hostnames תואם במשך 5 דקות, יוקצה ניקוד חומרה. כשמשתמשים בתקופות זמן, מנוע הזיהוי של Google SecOps בודק רק את בלוקי הזמן הנפרדים שציינתם.

rule OutcomeRuleMultiEvent {
    meta:
      author = "noone@google.com"
    events:
      $u.udm.principal.hostname = $hostname
      $asset_context.graph.entity.hostname = $hostname

      $severity = $asset_context.graph.entity.asset.vulnerabilities.severity

    match:
      $hostname over 5m

    outcome:
      $risk_score =
        max(
            100
          +   if($hostname = "my-hostname", 100, 50)
          +   if($severity = "HIGH", 10)
          +   if($severity = "MEDIUM", 5)
          +   if($severity = "LOW", 1)
        )

      $asset_id_list =
        array(
          if($u.principal.asset_id = "",
             "Empty asset id",
             $u.principal.asset_id
          )
        )

      $asset_id_distinct_list = array_distinct($u.principal.asset_id)

      $asset_id_count = count($u.principal.asset_id)

      $asset_id_distinct_count = count_distinct($u.principal.asset_id)

    condition:
      $u and $asset_context and $risk_score > 50 and not arrays.contains($asset_id_list, "id_1234")
}

סיכום

YARA-L היא שפת זיהוי גמישה שמאפשרת לבדוק אירועי אבטחה ולא רק להחזיר שאילתת נתונים. משתנה האירוע משמש למעקב אחרי ערכי השדות שבהם נעשה שימוש בקטע התנאים של הכלל. אפשר להשתמש באירוע יחיד, בכמה אירועים לאורך זמן, ליצור קורלציה בין מקורות כדי לקבל ערך יחיד (כמו $hostname ממקורות נתונים שונים), ואפילו להשתמש בכלים כמו ביטויים רגולריים כדי לספק התאמות. חשוב להתאים את הכללים לסביבה שלכם, ואפשר לעשות זאת על ידי הגדרת החרגות בלוגיקה. אפשר גם להשתמש ברשימות הפניה כדי לקבץ פריטים ואז להפנות לרשימה הזו בכלל. חשוב לזכור ש-Google SecOps לא צריך לשלוח התראה על כל זיהוי. אתם יכולים לעקוב אחרי זיהויים למטרות שונות, ולהגדיר התראות רק על אלה שאתם קובעים שהם הכי קריטיים בסביבה שלכם.

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