שפת קוסטו ועולם הדממה
לחפש נתונים במאגרי מידע עצומים זה כמו צלילה במים עמוקים ובשביל לנווט נכון בעולם הדממה ולקבל תובנות אנו צריכים להיות עם הכלים הנכונים, וכמו הניווט בים, כך גם כאשר מחפשים נתונים עם שפת קוסטו, אנו צריכים לדעת מהם הכלים שעומדים לרשותינו ואיך להשתמש בהם.
כמה סוגים ושפות מבוססות שאילתות יש במרחב הטכנולוגי? כל וונדור באשר הוא מאמץ שפת Query כלשהיא, בין אם מדובר על ספקיות ענן, או יצרני אבטחה וכן הלאה ולכל אחד מהם יש שפת שאילתות ספציפית. למה כל ספק צריך שפה כזאת? מהסיבה הפשוטה שאנו אוגרים כמויות עצומות של מידע וממשקים אינם יכולים לתת מענה כמו חיפוש פשוט בכל שפה שהיא.
למיקרוסופט יש את Kusto Query Language או בקצרה KQL, והמאמר מתמקד בשפת KQL, עקרונות, דוגמאות, כלים, טיפים ובסיס למאמרי KQL הבאים.
החוויה האישית שלי עם KQL התחילה איפשהוא בתקופת OMS Log Analytics ולימים המשיכה אל פלטפורמות ומערכות אחרות כמו החיפושים בתשתית דפנדר עם Advanced Hunting או Microsoft Sentinel.
לא פעם קראתי לשפת KQL האמא של כל השפות בעננים – KQL – The Mother Of All Languages In Azure
קצת היסטוריה…
כדי להתחיל את המסע בשפת KQL צריך ללכת אחורה בזמן ולהבין מהיכן הגיע הרעיון ואיך זה מתחבר לשפה עצמה וליומיום שלנו. שפת KQL נקראת על שם זאק קוסטו שהיה בין היתר חוקר ימי וצלל למעמקי הים עם ציוד חדשני שפיתח במטרה לגלות מה יש בעולם הדממה.
כמו זק קוסטו כך גם המטרה של שפת KQL והיא לאפשר לנו לחקור לגלות מה יש מתחת לפני הים ואפשר לראות התייחסויות שונות במסמכים של Microsoft כמו במסמך של Azure Monitor, ואם תשימו לב לשאילתה אפשר למצוא התייחסות לקוסטו עם תאריך הלידה שלו, תאריך כניסתה לאקדמיה הימית ועוד.
datatable operator – Azure Data Explorer | Microsoft Docs
אם כך מה אנו מנסים להשיג כשאנחנו מבצעים שאילתה על נתוני אבטחה? או מה אנו מנסים להשיג באמצעות תרגילי הגנה תקיפה וכן ביצוע האנטינג? אנו בוחנים את עומק הנתונים שלנו ומנסים לחשוף את המידע הקריטי וההכרחי שיספר על חשיפה פוטנציאלית באמצעות שאילתות פשוטות או חזקות.
כמו הטיטניק, העניין הוא לא מה שגלוי ונמצא מעל לפני הים שהוא קל לצפייה, אלא המסה העצומה מתחת לפני השטח שאינו ניתן לגילוי באופן פשוט והסיבה לכך שהאונייה טבעה. כמו הטיטניק, כך גם המידע שלנו, אנחנו רוצים לראות מתחת לשורות ולעמודות הנתונים הניתנות לצפייה את הנתונים שאנו צריכים להתעמק בהם בכדי למצוא מידע פרקטי ובמהירות המיטבית.
שפת KQL פותחה כדי לנצל את העוצמה של הענן ונבנתה עבור מערכי מידע עצומים, ולכן KQL הוא כלי בעל ביצועים טובים המאפשר לצלול בצורה מהירה לנתונים קריטיים. זה חלק גדול מהסיבה שזה עובד כל כך טוב ומתעלה על שפות שאילתות רבות אחרות.
שפת קוסטו החלה בשנת 2014 כפרויקט פנימי של Microsoft כדי לענות על הצרכים של רכיבים ושירותי Azure לניתוח נתונים,לוגים וטלמטריה. בשנת 2016 הפך להיות החלק האחורי של פלטפורמות וכלים אחרים. Kusto הוא מסד נתונים מבוזר הפועל על רכיבי Cluster ועל Compute Node. הנתונים של קוסטו מחולקים למספר חלקי נתונים אופקיים שבהם כל מקטע מיושם כמאגר עמודות המורחב באינדקסים, נתונים ומטא-נתונים.
עקרונות בשפת קוסטו
שפת KQL היא שפה שאילתות בקוד פתוח שנמצאת בפלטפורמות שונות ומאפשרת לבצע פעולות בסיסיות לצד פעולות מתקדמות, למשל, לבצע חיפושים של אירועי אבטחה (או hunting) בתשתית Microsoft Sentinel. החלק החזק של שפת KQL הוא האפשרות להריץ שאילתות קצרות ופשוטות אשר מחזירות תוצאות ותובנות על גבי פרק זמן מהיר מאוד מתוך כמויות מידע . כאמור, שפת KQL יכולה לרוץ מול מגוון פלטפורמות כמו Microsoft Sentinel או Azure Monitor, וכן Log Analytics ופלטפורמות נוספות.
זוהי אחת השפות העיקריות המשמשות בתשתית של Azure Data Explorer שהוא שירות Azure המשמש לאחסון וניתוח ביג דאטה, כמו גם בסיס קריטי בתשתית של Azure Log Analytics.
שפת KQL מאפשרת לחקור נתונים ולגלות דפוסים, לזהות אנומליות וחריגות, ליצור מודלים סטטיסטיים ועוד. השאילתה משתמשת בישויות סכימה המאורגנות בהיררכיה בדומה לזו של SQL: מסדי נתונים, טבלאות ועמודות. שאילתת KQL מבצעת בקשות לקריאה בלבד לעיבוד נתונים ולהחזרת תוצאות, ולכן הבקשות מצוינות כטקסט רגיל, באמצעות מודל זרימת נתונים (לוגיקה/אנטומיה) וכזה שניתן לקריאה בצורה פשוטה, או לחבר ולהפוך לאוטומטי.
שאילתות KQL עשויות מהצהרת שאילתה אחת או יותר. ישנם שלושה סוגים של הצהרות בשאילתה:
– הצהרה של ביטוי טבלאי
– הצהרת מסוג let
– הצהרה מסוג set
כל הצהרה בשאילתה מופרדת על-ידי נקודה-פסיק, ויכולים להשפיע על השאילתה הספציפית (או במקרים אחרים יותר יכולים להשפיע על מקטעים אחרים בשאילתה). למשל, אחת מהצהרות השאילתה צריכה להיות ביטוי טבלאי שהוא מחזיר את תוצאת השאילתה בתבנית של עמודת שורה.
הצהרות נועדו לתמוך בתרחישים שונים שבהם יישומים בשכבה לוקחים שאילתות ושולחים גרסה אחרת. הצהרת שאילתה ביישומים השונים יכולים להיות בין היתר לפי המאפיינים הבאים:
– כינוי – מגדיר את הכינוי של אותם נתונים.
– דפוסים – משמש נתונים בכדי להזריק את עצמם לתוך תהליך של השאילתה.
– הצהרת פרמטרים – נועד להגן על עצמם מפני שינויים בשאילתה.
– הגבלה – משמש להגבלה של אילתות לקבוצת משנה ספציפית של נתונים.
הרצת שאילתות KQL הם למעשה בקשות לקריאה בלבד לעיבוד נתונים ולהחזרת תוצאות מבלי לשנות מטא-נתונים ע”י טקסט רגיל במודל של Data flow לטובת יצירה, עריכה, קריאה ואוטמציה של שאילתות. שאילתות קוסטו עשויות מהצהרת שאילתה אחת או יותר.
כאמור, הסוג הנפוץ ביותר של שאילתה הוא ביטוי טבלאי, כלומר הקלט והפלט שלו מורכבים מטבלאות או מערכי נתונים טבלאיים, ומשפטים טבלאיים מכילים אופרטורים, שכל אחד מהם מתחיל בקלט טבלאי ומחזיר פלט טבלאי. האופרטורים מסודרים על ידי pipe. הנתונים מבצעים סינון מחלק אחד אחד למשנהו בכל שלב ולאחר מכן מוזנים או נמצאים בשימוש של החלק הבא בשאילתה.
שפת KQL מכילה אלמנטים רבים ומגוונים, בין היתר, סוגי יישויות, סוגי אופרטורים (טאבולר, סקלאריים), פונקציות, סדרות זמן והרבה אחרים. לכן, שפת KQL יכולה להתמודד עם מיליארדים רבים של שורות. כאשר אנו עובדים עם ריבוי נתונים אנו יכולים לעבוד עם אופרטורים והגבלות, למשל, אופרטור limit שמחזיר תת-קבוצה אקראית של שורות אלה.
התרשים הבא מתאר בצורה כללית את המהות של שאילתות, פילטר בחלקים שונים בשאילתה, ביצוע פעולות והתהליך שמתרחש בכל שאילתה.
טיפ: למי שרוצה להתנסות עם שפת קוסטו, ישנו פורטל התנסות בקישור https://aka.ms/lademo
הממשקים הנפוצים שעובדים איתם ביומיום עם קוסטו הם Microsoft Sentinel וכן Azure Monitor שמתבססים על Log Analytics. באימייג המצורף אפשר לראות את הממשק והמבנה כאשר עובדים עם קוסטו והאפשרויות שיש בממשק.
עלינו להבין כי חיפוש נתונים באמצעות KQL דומה מאוד למה שעשינו בעבר באמצעות שפת SQL: חיפוש מסדי נתונים, טבלאות ועמודות. אנחנו מריצים רצף של הוראות והצהרות שאנחנו רוצים לבצע עבור הטבלאות שאנחנו רוצים לחפש.
איך נראית שאילתה
שאילתת KQL תמיד מתחילה עם מקור הנתונים בראש, ולכן אנו מציינים את שם הטבלה מתוך כוונה לבצע שאילתה על הנתונים של אותה טבלה. לאחר מכן נוכל להתחיל לסנן את הנתונים עם סעיפים שונים ומגוונים כמו אופרטור, ואז נוכל לרדת לדבר האמיתי ולפלטר את הנתונים עם תנאים נוספים, לשייך אל מול טבלה נוספת, לקרוא למידע חיצוני ועוד שלל אפשרויות.
בואו נקח כמה דוגמאות סופר פשוטות מהיומיום, ואפשר לומר שרוב היומיום שלי עם קוסטו הוא על גבי משפחת הדפדנדרים ובפרט על Microsoft Sentinel שמחובר למערכות שונות שעיקרן מערכות צד שלישי.
בדוגמה הזאת נחפש מקרה פשוט מתוך מכונה שמתבססת על אירועי כניסה של Windows במסגרת זמן ספציפי. במקרה כזה החיפוש שלנו מצריך הצגת נתונים מתוך טבלה שנקראת SecurityEvents. טבלה זו מכילה אירועי אבטחה שנאספו מתוך מכונות Windows. (המכונה מזרימה יומני אבטחה ספציפיים אל Microsoft Sentinel בצורה ישירה).
כאשר אני מריץ את השאילתה הבאה כדי לבדוק את האבנטים אני מוסיף אופרטור limit שיחזיר רשומות ספציפיות.
SecurityEvent | limit 10
האופרטור limit מאפשר לנו לקבל מדגם אקראי של כמה מידע ובפרט שורות שאנו מעוניינים לקבל, ולכן שימושי מאוד כאשר אנו רוצים לקבל מושג על סוג המידע והנתונים שאנו עובדים עליהם
טיפ: בעקרון, אין הבדלים פונקציונליים בין take לבין limit והם כמו תאומים עם תכונות דומות, אך עדיין יש להם שמות ומראה שונים. במאמר הבא נרד לרזולוציות ספציפיות בין take לבין limit.
בנוסף, אפשר להריץ שאילתה קצרה וספציפית שמסכמת פעילויות בטבלת SecurityEvent.
SecurityEvent
| summarize by Activity
עכשיו, בואו נריץ שאילתה שאוספת את האירועים במסגרת זמן ספציפית של בין שבוע לשבועיים ובנוסף נסנן לפי מזהה אירוע “4624” (מזהה אירוע של חשבון נרשם בהצלחה). במקרה הזה נוסיף where גם לסינון הזמן וגם לסינון סוג האבנט בכדי לקבל נתונים שאנו צריכים.
הדוגמאות מעלה הן כלליות ובסיסיות אבל מתבססות על העקרונות של חיפוש נתונים והצגתם באופן מהיר לפי אופרטורים שמאפשרים להציג תוצאות נדרשות.
כלים וקישורים
ישנם ברשת אינספור מאמרים, קטעי וידאו, הדגמות ושאילתות. מצרף מספר כלים, שאילתות וקישורים שיכולים לסייע ביומיום. מצרף כלים וקישורים נבחרים:
Splunk to Kusto Query Language map
SQL to Kusto query translation – Azure Data Explorer
Kusto Query Language in Microsoft Sentinel
Write your first query with Kusto Query Language