הצלבת נתונים באמצעות שאילתות איחוד חיצוניות
במסמך הזה מוסבר על איחודים חיצוניים (איחוד שמאלי ואיחוד ימני). פעולות Join משמשות ליצירת קורלציה בין נתונים מכמה מקורות ולשילוב שלהם על סמך ערכים משותפים בשדות. שילוב של אירועי אבטחה וישויות קשורות בתצוגה מקיפה אחת מאפשר לכם לזהות איומים ולחקור אותם בצורה יעילה.
בשונה משיוכים רגילים (פנימיים), שדורשים רשומות תואמות בשני מקורות הנתונים, שיוך חיצוני מאחזר את כל הרשומות מצד אחד של השיוך, גם אם אין רשומות תואמות בצד השני. בדרך כלל, שדות שלא תואמים מהצד השני מלאים בערך null. כך לא תאבדו נתונים שלא נמצאה להם התאמה.
איך מתבצעים צירופים חיצוניים
המושג של איחודים חיצוניים ב-YARA-L 2.0 זהה ל-SQL סטנדרטי:
ב-left outer join נשמרים כל הרשומות מהצד השמאלי של ה-join.
ב-right outer join נשמרות כל הרשומות מהצד הימני של ה-join.
תחביר של צירוף חיצוני (צירוף שמאלי וצירוף ימני) נתמך בכל השאילתות – גם עם תנאי match וגם בלי.
הסבר על איחוד חיצוני שמאלי
באיחוד חיצוני שמאלי (או באיחוד שמאלי) נשמרות כל הרשומות ממקור הנתונים בצד שמאל של מילת המפתח left join.
אם לרשומה מהצד הימני אין התאמה לאירוע הימני, השדות מהאירוע הימני מוחזרים כ-
null.המשמעות של placeholder: כל משתנה placeholder שמשמש בקטע
matchצריך להפנות לשדה מהאירוע השמאלי כדי להבטיח צבירת נתונים מדויקת בכל קבוצת התוצאות.
דוגמה ל-left join מאירוע לאירוע
בדוגמה הבאה מוצג צירוף חיצוני שמאלי כדי ליצור קורלציה בין אירועי התחברות של משתמש לבין אירועי חיבור לרשת שמתרחשים בהמשך באותו מארח.
ה-left join מבטיח שכל האירועים מסוג USER_LOGIN יישמרו בקבוצת התוצאות. אם נמצא אירוע NETWORK_CONNECTION תואם ($e2), הנתונים שלו מאוחדים.
אם לא נמצאת התאמה, השדות של $e2 הם null.
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname
הגדרת האירוע בצד שמאל
בדוגמה הבאה של שאילתה מוגדר הצד הימני של הצירוף ($e1), שהוא קבוצת האירועים שנשמרת בתוצאה הסופית:
$e1.metadata.event_type = "USER_LOGIN"
הטבלה הבאה מייצגת את תוצאת השאילתה, ומזהה את קבוצת האירועים הראשונית של התחברות משתמשים:
| סוג אירוע | שם המארח הראשי | כתובת IP |
|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
USER_LOGIN
|
server-db-03
|
10.0.0.50
|
USER_LOGIN
|
kiosk-4
|
192.168.1.104
|
הגדרת האירוע הנכון
בדוגמה הבאה של שאילתה מוגדר הצד הימני של הצירוף ($e2), שהוא קבוצת האירועים שמושוות לאירועים בצד שמאל:
$e2.metadata.event_type = "NETWORK_CONNECTION"
בטבלה הבאה מוצגים האירועים של חיבור לרשת שאפשר להשתמש בהם להתאמה:
| סוג אירוע | שם המארח הראשי | כתובת IP |
|---|---|---|
NETWORK_CONNECTION
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
laptop-hr-02
|
192.168.1.101
|
NETWORK_CONNECTION
|
kiosk-4
|
203.0.113.3
|
הצטרפות לאירועים
עם קטע של התאמה
בדוגמה הבאה מוצגת שאילתת התאמה שמשתמשת בצירוף חיצוני שמאלי בשדה principal.hostname:
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname
$host = $e1.principal.hostname
match:
$host over 5m
ה-left outer join מוודא שכל אירוע
USER_LOGIN($e1) ייכלל בקבוצת התוצאות הסופית.הערך של ה-placeholder $host מוקצה מ-
$e1.principal.hostname. ה-left outer join מבטיח את הנוכחות של אירוע$e1, ומוודא שהמשתנה $host תמיד יאוכלס לצורך צבירה.הכלל צובר את התוצאות לפי המארח בחלון זמן של 5 דקות.
תוצאה של הצטרפות
הנתונים שמתקבלים מראים את השילוב של שני האירועים. כל הרשומות מהטבלה הימנית ($e1) נשמרות, והשדות מהטבלה השמאלית ($e2) מוגדרים ל-null אם לא נמצא שם מארח תואם (לדוגמה, עבור server-db-03).
סוג האירוע ($e1)
|
שם המארח הראשי ($host)
|
כתובת IP ($e1)
|
סוג האירוע ($e2)
|
כתובת IP ($e2)
|
סטטוס התאמה |
|---|---|---|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
192.168.1.101
|
נמצאה התאמה |
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
NETWORK_CONNECTION
|
192.168.1.101
|
נמצאה התאמה |
USER_LOGIN
|
server-db-03
|
10.0.0.50
|
null
|
null
|
אין התאמה |
USER_LOGIN
|
kiosk-4
|
192.168.1.104
|
NETWORK_CONNECTION
|
203.0.113.3
|
נמצאה התאמה |
דוגמאות לשאילתות מסוג left join
בקטע הזה מוצגות דוגמאות לשאילתות left join.
הצטרפות עם תנאי התאמה
Event-entity
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname $host = $e1.principal.asset.hostname match: $host over 5mEvent-datatable
$host = $e1.principal.hostname left join $e1.principal.hostname = %all_dt_column_types.hostname match: $host by 5m
הצטרפות ללא תנאי התאמה
אירוע-אירוע
$e1.metadata.event_type = "USER_LOGIN" $e1.principal.ip = "114.241.96.87" $e2.metadata.event_type = "NETWORK_CONNECTION" left join $e1.principal.hostname = $e2.principal.hostnameEvent-entity
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname $host = $e1.principal.asset.hostnameEvent-datatable
$host = $e1.principal.hostname left join $e1.principal.hostname = %all_dt_column_types.hostname
איחוד חיצוני ימני (right outer join)
ב-right outer join (או right join) נשמרות כל הרשומות ממקור הנתונים בצד ימין של מילת המפתח right join.
אם לרשומה מהאירוע הימני אין התאמה באירוע השמאלי, השדות מהאירוע השמאלי מוחזרים כ-
null.המשמעות של placeholder: כל משתנה placeholder שמשמש בקטע
matchצריך להפנות לשדה מהאירוע הנכון כדי להבטיח צבירת נתונים מדויקת בכל קבוצת התוצאות.
דוגמה ל-right join מאירוע לאירוע
בדוגמה הבאה מוצג right outer join כדי ליצור קורלציה בין אירועי התחברות של משתמשים לבין אירועי חיבור לרשת שמתרחשים בהמשך באותו מארח.
הפונקציה right join מוודאת שכל האירועים מסוג NETWORK_CONNECTION יישמרו בקבוצת התוצאות. אם נמצא אירוע USER_LOGIN תואם, הנתונים שלו מצורפים.
אם לא נמצאת התאמה, השדות של$e1 הם null.
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
הגדרת האירוע השמאלי
השאילתה הבאה מגדירה את הצד השמאלי של הצירוף ($e1), שהוא קבוצת האירועים האופציונלית בתוצאה הסופית:
$e1.metadata.event_type = "USER_LOGIN"
הטבלה הבאה מייצגת את תוצאת השאילתה, ומזהה את קבוצת האירועים הראשונית של התחברות משתמשים:
| סוג אירוע | שם המארח הראשי | כתובת IP |
|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
USER_LOGIN
|
server-db-03
|
10.0.0.50
|
הגדרת האירוע הנכון
השאילתה הבאה מגדירה את הצד הימני של הצירוף ($e2), שהוא קבוצת האירועים שנשמרת בתוצאה הסופית.
$e2.metadata.event_type = "NETWORK_CONNECTION"
הטבלה הבאה מייצגת את קבוצת האירועים של חיבור לרשת שזמינים להתאמה.
| סוג אירוע | שם המארח הראשי | כתובת IP |
|---|---|---|
NETWORK_CONNECTION
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
laptop-hr-02
|
192.168.1.101
|
NETWORK_CONNECTION
|
vm-unauth-05
|
203.0.113.3
|
הצטרפות לאירועים
בדוגמה הבאה מוצגת שאילתת התאמה עם צירוף חיצוני ימני בשדה principal.hostname:
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
$host = $e1.principal.hostname
match:
$host over 5m
ה-right outer join מבטיח שכל אירוע
NETWORK_CONNECTION($e2) ייכלל בקבוצת התוצאות הסופית.הערך של
$e2.principal.hostnameמוקצה ל-placeholder$host. ה-outer join הימני מבטיח את הנוכחות של אירוע$e2, וכך מוודא שהמשתנה$hostתמיד מאוכלס לצורך צבירה.הכלל צובר את התוצאות לפי המארח בחלון זמן של 5 דקות.
תוצאה של הצטרפות
מערך הנתונים שמתקבל מראה את השילוב של שני האירועים. כל הרשומות מהטבלה הימנית ($e2) נשמרות, והשדות מהטבלה השמאלית ($e1) מוגדרים כ-null אם לא נמצא שם מארח תואם (לדוגמה, vm-unauth-05).
סוג האירוע ($e1)
|
שם המארח הראשי ($e1)
|
כתובת IP ($e1)
|
סוג האירוע ($e2)
|
שם המארח הראשי ($host) | כתובת IP ($e2)
|
סטטוס התאמה |
|---|---|---|---|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
workstation-01
|
192.168.1.101
|
נמצאה התאמה |
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
NETWORK_CONNECTION
|
laptop-hr-02
|
192.168.1.101
|
נמצאה התאמה |
null
|
null
|
null
|
NETWORK_CONNECTION
|
vm-unauth-05
|
203.0.113.4
|
אין התאמה |
דוגמאות לשאילתות right join
בקטע הזה מופיעות דוגמאות לשאילתות של צירוף ימני.
הצטרפות עם תנאי התאמה
אירוע-אירוע
$e1.metadata.event_type = "USER_LOGIN" $e2.metadata.event_type = "NETWORK_CONNECTION" right join $e1.principal.hostname = $e2.principal.hostname $host = $e2.principal.hostname match: $host over 5mEntity-event
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname $host = $e1.principal.asset.hostname match: $host over 5mDatatable-event
$host = $e1.principal.hostname right join %all_dt_column_types.hostname = $e1.principal.hostname match: $host by 5m
הצטרפות ללא תנאי התאמה
אירוע-אירוע
$e1.metadata.event_type = "USER_LOGIN" $e1.principal.ip = "114.241.96.87" $e2.metadata.event_type = "NETWORK_CONNECTION" right join $e1.principal.hostname = $e2.principal.hostnameEntity-event
$e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname $host = $e1.principal.asset.hostnameDatatable-event
$host = $e1.principal.hostname right join %all_dt_column_types.hostname = $e1.principal.hostname
מגבלות
כשיוצרים צירופים חיצוניים, חשוב לקחת בחשבון את המגבלות הבאות:
אין תמיכה בחיבור חיצוני מלא (חיבור שמאלי וחיבור ימני ביחד).
טווח הזמן של השאילתה לצירופים ללא התאמה מוגבל ל-14 ימים.
אי אפשר לחבר ישירות שני מקורות הקשריים (לדוגמה, ישות ישירות לטבלת נתונים).
האירוע הראשי במודל הנתונים המאוחד (UDM) חייב להיות הצד שנשמר של הצירוף החיצוני. השאילתה לא תקינה אם האירוע הראשי נמצא בצד 'ניתן לאיפוס'.
איחוד של אירוע וישות חייב להיות איחוד שמאלי. כך האירוע נשמר בצורה נכונה (
$e1).הצטרפות של ישות לאירוע חייבת להיות הצטרפות ימנית. כך האירוע נשמר בצורה נכונה (
$e1).
הדוגמה הבאה לא תקינה כי אירוע UDM (
$e1) נמצא בצד שמאל, אבל הצטרפות ימנית שומרת על הצד הימני ($g1), וזה מנוגד לכלל שאירוע UDM חייב להישמר:// Invalid query $e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" right join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
שיטות מומלצות
כדי למנוע ביצועים איטיים ופסק זמן לשאילתות בשאילתות של צירוף חיצוני, צריך להשתמש במסננים ספציפיים ומצומצמים.
לדוגמה, שאילתה רחבה כמו הבאה:
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
אפשר לבצע אופטימיזציה על ידי הוספת קריטריונים ספציפיים, כמו שמתואר בהמשך:
$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.ip = "121.121.121.121"
$e1.principal.user.userid = "alex"
$e2.metadata.event_type = "NETWORK_CONNECTION"
$e2.src.hostname = "altostrat.com"
$e1.principal.hostname = $e2.principal.hostname
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.