
KQL क्वेरीज़ का संग्रह
Microsoft Sentinel के लिए KQL का उपयोग करने के लिए कुछ टिप्स, ट्रिक्स और उदाहरण।
Kusto Query Language वह भाषा है जिसका उपयोग Azure Monitor, Azure Data Explorer और Azure Log Analytics में किया जाता है (Microsoft Sentinel अंदरूनी रूप से यही उपयोग करता है)। मुझे KQL के संबंध में यह विज़ुअलाइज़ेशन हमेशा उपयोगी लगा है -

हम KQL का उपयोग करके अपने बड़े डेटा सेट के भीतर से खतरों, डिटेक्शन, पैटर्न और विसंगतियों को खोजने के लिए सटीक और कुशल क्वेरी बनाना चाहते हैं।
नीचे दी गई क्वेरी को एक उदाहरण के रूप में लें```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName == "[email protected]" | where ResultType == "0" | where AppDisplayName == "Microsoft Teams" | project TimeGenerated, Location, IPAddress, UserAgent
जब हम इस तरह की क्वेरी चलाते हैं, तो पहली पंक्ति Microsoft Sentinel को बताती है कि डेटा के लिए किस तालिका में देखना है, इसलिए इस मामले में हम SigninLogs तालिका खोजना चाहते हैं, जहाँ Azure AD साइन-इन डेटा भेजा जाता है। आप तालिकाओं की सूची [यहाँ](https://docs.microsoft.com/en-us/azure/sentinel/data-source-schema-reference) देख सकते हैं।
Microsoft Sentinel फिर आपकी क्वेरी को क्रमिक रूप से चलाएगा, इसलिए वह प्रत्येक पंक्ति को एक-एक करके तब तक चलाएगा जब तक वह अंत तक नहीं पहुँच जाता, या आपको कोई त्रुटि नहीं होती। तो आइए अपनी क्वेरी को पंक्ति दर पंक्ति तोड़ें।```kql
SigninLogs
तो सबसे पहले हमने अपनी SigninLogs तालिका चुनी है।```kql SigninLogs | where TimeGenerated > ago(14d)
इसके बाद हम Sentinel को इस तालिका में पिछले 14 दिनों के डेटा को देखने के लिए कहते हैं।```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"
आगे हम Sentinel से केवल उन लॉग्स को खोजने के लिए कहते हैं जहाँ UserPrincipalName "[email protected]" के बराबर है```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName == "[email protected]" | where ResultType == "0"
फिर हम केवल उन लॉग्स को देखते हैं जहाँ ResultType == 0 है, जो Azure AD में एक सफल लॉगऑन है।```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"
| where ResultType == "0"
| where AppDisplayName == "Microsoft Teams"
अगला, हम केवल Microsoft Teams में साइन-इन की तलाश करते हैं।```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName == "[email protected]" | where ResultType == "0" | where AppDisplayName == "Microsoft Teams" | project TimeGenerated, Location, IPAddress, UserAgent
हमारी अंतिम पंक्ति project ऑपरेटर का उपयोग करती है, ताकि हमारे लॉग्स से केवल 4 फ़ील्ड्स लौटाए जाएँ, इसलिए हम केवल TimeGenerated, Location, IPAddress और UserAgent ही देख पाएँगे जो हमारे SigninLogs डेटा से लौटाए गए हैं।
इस तरह आप क्वेरी बनाते हैं, अब मूल बातें।
## मूल बातें
### समय की मूल बातें
Microsoft Sentinel और KQL समय फ़िल्टर के लिए अत्यधिक अनुकूलित हैं, इसलिए यदि आप उस डेटा की समय अवधि जानते हैं जिसे आप खोजना चाहते हैं, तो आपको तुरंत समय सीमा फ़िल्टर कर देनी चाहिए। पिछले 14 दिनों के लॉग्स प्राप्त करना, फिर नीचे दी गई क्वेरी जैसे उपयोगकर्ता नाम की खोज करना -```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"
पहले उपयोगकर्ता नाम और फिर समय अवधि खोजने की तुलना में कहीं अधिक कुशल है, जैसे -```kql SigninLogs | where UserPrincipalName == "[email protected]" | where TimeGenerated > ago(14d)
KQL के पास विशिष्ट समय अवधियों की क्वेरी करने के लिए कई विकल्प हैं।```kql
SigninLogs
| where TimeGenerated > ago(14d)
पहले उदाहरण के अनुसार, यह पिछले 14 दिनों की खोज करेगा।```kql SigninLogs | where TimeGenerated > ago(14h)
आप घंटे भी कर सकते हैं।```kql
SigninLogs
| where TimeGenerated > ago(14m)
और मिनट।
KQL समय सीमा के बीच क्वेरी करने का भी समर्थन करता है -```kql SigninLogs | where TimeGenerated between (ago(14d) .. ago(7d))
यह 14 दिन पहले और 7 दिन पहले के बीच का SigninLogs डेटा खोजेगा।```kql
SigninLogs
| where TimeGenerated between (ago(14h) .. ago(7h))
14 घंटे और 7 घंटे पहले के बीच।```kql SigninLogs | where TimeGenerated between (ago(14m) .. ago(7m))
और 14 मिनट पहले से 7 मिनट पहले के बीच।
### Where मूल बातें
Where एक ऑपरेटर है जिसका उपयोग आप अपने द्वारा लिखे जाने वाले लगभग हर क्वेरी में करेंगे। इसी तरह आप Microsoft Sentinel को विशिष्ट डेटा खोजने के लिए कहते हैं। where ऑपरेटर के साथ सिंटैक्स बहुत महत्वपूर्ण है। अगर हम अपना वही उदाहरण उपयोग करते हैं।```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"
यह पिछले 14 दिनों में हमारी SigninLogs तालिका में सटीक मिलानों की खोज करेगा, जहाँ हमारा UserPrincipalName [email protected] के बराबर है। KQL में == केस-सेंसिटिव है, इसलिए यदि आप [email protected] के लिए खोज करते हैं और उपयोगकर्ता नाम वास्तव में [email protected] है, तो आपको कोई परिणाम नहीं मिलेगा। गैर-केस-सेंसिटिव समकक्ष =~ है।```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName =~ "[email protected]"
यह केस संवेदनशीलता की परवाह किए बिना [email protected] के लिए कोई भी मिलान खोजेगा।
बराबर के बजाय, हम contains का भी उपयोग कर सकते हैं।```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName contains "reprise_99"
यह उन सभी लॉग प्रविष्टियों को ढूंढेगा जहां UserPrincipalName में reprise_99 शामिल है, यदि आपके पास [email protected] और [email protected] डेटा है, तो यह दोनों को ढूंढ लेगा। contains ऑपरेटर केस-सेंसिटिव नहीं है, लेकिन आप इसे केस-सेंसिटिव बनाने के लिए contains_cs का उपयोग कर सकते हैं।
यदि आप विशेष पैटर्न खोज रहे हैं तो आप startswith या endswith का उपयोग कर सकते हैं।```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName startswith "reprise_99"
SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName endswith "testdomain.com"
startswith और endswith दोनों केस-सेंसिटिव नहीं हैं, लेकिन आप उन्हें केस-सेंसिटिव बनाने के लिए startswith_cs या endswith_cs का उपयोग कर सकते हैं।
यदि आप पूर्ण शब्दों (चार वर्णों से अधिक) की खोज कर रहे हैं, तो KQL में आप has ऑपरेटर का उपयोग कर सकते हैं। 'has' का उपयोग 'contains' की तुलना में अधिक कुशल है क्योंकि डेटा आपके लिए अनुक्रमित होता है।```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where AppDisplayName has "Teams"
यह किसी भी SigninLogs को खोजेगा जहाँ एप्लिकेशन डिस्प्ले नाम में Teams शब्द हो, जिसमें "Microsoft Teams" और "Microsoft Teams Web Client" शामिल हो सकते हैं, दोनों क्वेरी को संतुष्ट करते हैं।
यदि आप कई शब्दों की खोज कर रहे हैं तो आप has_any या has_all का उपयोग कर सकते हैं।```kql SigninLogs | where TimeGenerated > ago(14d) | where AppDisplayName has_any ("Teams","Outlook")
यह उन परिणामों को लौटाएगा जहाँ एप्लिकेशन प्रदर्शन नाम में "Teams" या "Outlook" शामिल है```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where AppDisplayName has_all ("Teams","Outlook")
यह उन परिणामों को लौटाएगा जहाँ एप्लिकेशन के डिस्प्ले नाम में "Teams" और "Outlook" शामिल हैं।
यदि आप नहीं जानते कि किन फ़ील्ड्स में खोजना है, तो आप वाइल्डकार्ड का भी उपयोग कर सकते हैं। यह अक्षम है, लेकिन यह आपको वह खोजने के लिए सही रास्ते पर ले जा सकता है जो आप चाहते हैं।```kql SigninLogs | where TimeGenerated > ago(14d) | where * contains "reprise_99"
यह SigninLogs तालिका में किसी भी ऐसे फ़ील्ड की खोज करेगा जिसमें reprise_99 हो।