ASIM Ayrıştırıcısı oluşturma

Tamamlandı

Gelişmiş Güvenlik Bilgileri Modeli (ASIM) kullanıcıları sorgularında tablo adları yerine birleştirici ayrıştırıcılar kullanır, verileri normalleştirilmiş biçimde görüntüler ve şemayla ilgili tüm verileri sorguya ekler. Ayrıştırıcıları birleştirerek, her kaynağın belirli ayrıntılarını işlemek için kaynağa özgü ayrıştırıcıları da kullanabilirsiniz.

Microsoft Sentinel, birçok veri kaynağı için yerleşik, kaynağa özgü ayrıştırıcılar sağlar. Aşağıdaki durumlarda bu kaynağa özgü ayrıştırıcıları değiştirmek veya geliştirmek isteyebilirsiniz:

Cihazınız bir ASIM şemasına uyan olaylar sağladığında, ancak cihazınız ve ilgili şema için kaynağa özgü ayrıştırıcı Microsoft Sentinel'de mevcut olmadığında.

ASIM kaynağına özgü ayrıştırıcılar cihazınız için kullanılabiliyorsa ancak cihazınız olayları ASIM ayrıştırıcıları tarafından beklenenden farklı bir yöntemde veya biçimde gönderdiğinde. Örneğin:

Kaynak cihazınız olayları standart olmayan bir şekilde gönderecek şekilde yapılandırılabilir.

Cihazınızın ASIM ayrıştırıcısı tarafından desteklenenden farklı bir sürümü olabilir.

Olaylar bir aracı sistem tarafından toplanabilir, değiştirilebilir ve iletilebilir.

Özel ayrıştırıcı geliştirme işlemi

Aşağıdaki iş akışında, kaynağa özgü özel bir ASIM ayrıştırıcı geliştirmenin üst düzey adımları açıklanmaktadır:

  1. Örnek günlükleri toplayın.

  2. Kaynaktan gönderilen olayların temsili şemaları veya şemaları tanımlayın.

  3. Kaynak olay alanlarını tanımlanan şema veya şemalarla eşleyin.

  4. Kaynağınız için bir veya daha fazla ASIM ayrıştırıcısı geliştirin. Kaynakla ilgili her şema için bir filtreleme ayrıştırıcısı ve parametresiz ayrıştırıcı geliştirmeniz gerekir.

  5. Ayrıştırıcınızı test edin.

  6. Ayrıştırıcıları Microsoft Sentinel çalışma alanlarınıza dağıtın.

  7. Yeni özel ayrıştırıcıya başvurmak için ilgili ASIM birleştirici ayrıştırıcısını güncelleştirin.

  8. Ayrıştırıcılarınızı birincil ASIM dağıtımına da katkıda bulunmak isteyebilirsiniz. Katkıda bulunan ayrıştırıcılar tüm çalışma alanlarında yerleşik ayrıştırıcılar olarak da kullanılabilir hale getirilebilir.

Örnek günlükleri toplama

Etkili ASIM ayrıştırıcıları oluşturmak için, çoğu durumda kaynak sistemin ayarlanmasını ve Microsoft Sentinel'e bağlanmasını gerektiren temsili bir günlük kümesine ihtiyacınız vardır. Kullanılabilir kaynak cihazınız yoksa, bulut kullandıkça öde hizmetleri geliştirme ve test için birçok cihaz dağıtmanıza olanak tanır.

Ayrıca, günlükler için satıcı belgelerini ve örneklerini bulmak, geniş günlük biçimi kapsamı sağlayarak geliştirmeyi hızlandırmaya ve hataları azaltmaya yardımcı olabilir.

Temsili bir günlük kümesi şunları içermelidir:

  • Farklı olay sonuçlarına sahip olaylar.
  • Farklı yanıt eylemlerine sahip olaylar.
  • Kullanıcı adı, ana bilgisayar adı ve kimlikler ve değer normalleştirmesi gerektiren diğer alanlar için farklı biçimler.

Haritalandırma

Ayrıştırıcı geliştirmeden önce, kaynak olayda veya olaylarda bulunan bilgileri tanımladığınız şemayla eşleyin:

  • Tüm zorunlu alanları ve tercihen önerilen alanları eşleyin.
  • Kaynaktan sağlanan tüm bilgileri normalleştirilmiş alanlarla eşlemeyi deneyin. Seçili şemanın bir parçası olarak kullanılamıyorsa, diğer şemalarda kullanılabilen alanlarla eşlemeyi göz önünde bulundurun.
  • Kaynakta alanların değerlerini ASIM tarafından izin verilen normalleştirilmiş değerlerle eşleyin. Özgün değer EventOriginalResultDetails gibi ayrı bir alanda depolanır.

Ayrıştırıcı geliştirme

Her ilgili şema için hem filtreleme hem de parametresiz ayrıştırıcı geliştirin.

Özel ayrıştırıcı, Microsoft Sentinel Günlükleri sayfasında geliştirilen bir KQL sorgusudur. Ayrıştırıcı sorgusunun üç bölümü vardır:

Filtrele > Ayrıştır > Alanları hazırla

İlgili kayıtları filtreleme

Çoğu durumda, Microsoft Sentinel'deki bir tablo birden çok olay türü içerir. Örneğin:

  • Syslog tablosunda birden çok kaynaktan veriler bulunur.
  • Özel tablolar, birden fazla olay türü sağlayan ve çeşitli şemalara sığabilen tek bir kaynaktan bilgi içerebilir.

Bu nedenle, ayrıştırıcının önce yalnızca hedef şemayla ilgili kayıtları filtrelemesi gerekir.

KQL'de filtreleme where işleci kullanılarak yapılır. Örneğin, Sysmon olay 1 işlem oluşturmayı raporlar ve bu nedenle ProcessEvent şemasına normalleştirilir. Sysmon olay 1 olayı Event tablosunun bir parçasıdır, bu nedenle aşağıdaki filtreyi kullanabilirsiniz:

Event | where Source == "Microsoft-Windows-Sysmon" and EventID == 1

Önemli

Ayrıştırıcı zamana göre filtre uygulamamalıdır. Ayrıştırıcıyı kullanan sorgu bir zaman aralığı uygular.

İzleme Listesi kullanarak kaynak türüne göre filtreleme

Bazı durumlarda, olayın kendisi belirli kaynak türleri için filtrelemeye izin verecek bilgiler içermez.

Örneğin, Infoblox DNS olayları Syslog iletileri olarak gönderilir ve diğer kaynaklardan gönderilen Syslog iletilerinden ayırt etmek zordur. Bu gibi durumlarda ayrıştırıcı, ilgili olayları tanımlayan bir kaynak listesine dayanır. Bu liste ASimSourceType izleme listesinde tutulur.

Ayrıştırıcılarınızda ASimSourceType izleme listesini kullanmak için:

  • Ayrıştırıcınızın başına aşağıdaki satırı ekleyin:
let Sources_by_SourceType=(sourcetype:string){_GetWatchlist('ASimSourceType') | where SearchKey == tostring(sourcetype) | extend Source=column_ifexists('Source','') | where isnotempty(Source)| distinct Source };
  • Ayrıştırıcı filtreleme bölümünde izleme listesini kullanan bir filtre ekleyin. Örneğin, Infoblox DNS ayrıştırıcısı filtreleme bölümünde aşağıdakileri içerir:
| where Computer in (Sources_by_SourceType('InfobloxNIOS'))

Ayrıştırıcınızda bu örneği kullanmak için:

  • Bilgisayar'ın yerine kaynağınızın kaynak bilgilerini içeren alanın adını yazın. Syslog tabanlı tüm ayrıştırıcılar için bunu Bilgisayar olarak kullanmaya devam edebilirsiniz.

  • InfobloxNIOS belirtecini ayrıştırıcınız için seçtiğiniz bir değerle değiştirin. Ayrıştırıcı kullanıcıları, seçtiğiniz değeri ve bu tür olayları gönderen kaynakların listesini kullanarak ASimSourceType izleme listesini güncelleştirmeleri gerektiğini bildirin.

Ayrıştırıcı parametrelerine göre filtreleme

Filtreleme ayrıştırıcıları geliştirirken, ayrıştırıcınızın ilgili şema için filtreleme parametrelerini kabul ettiğinden emin olun. Bu şema için başvuru makalesinde belirtildiği gibi. Var olan bir ayrıştırıcıyı başlangıç noktası olarak kullanmak, ayrıştırıcınızın doğru işlev imzasını içermesini sağlar. Çoğu durumda, gerçek filtreleme kodu aynı şema için ayrıştırıcıları filtrelemek için de benzerdir.

Filtreleme sırasında şunları yaptığınızdan emin olun:

  • Fiziksel alanları kullanarak ayrıştırmadan önce filtreleyin. Filtrelenen sonuçlar yeterince doğru değilse, sonuçlarınıza ince ayar yapmak için ayrıştırdıktan sonra testi yineleyin. Daha fazla bilgi için bkz. filtreleme iyileştirmesi.
  • Parametre tanımlanmamışsa ve hala varsayılan değere sahipse filtrelemeyin.

Aşağıdaki örneklerde, varsayılan değerin genellikle '*' olduğu bir dize parametresi ve varsayılan değerin genellikle boş bir liste olduğu liste parametresi için filtrelemenin nasıl uygulanacağı gösterilmektedir.

srcipaddr=='*' or ClientIP==srcipaddr
array_length(domain_has_any) == 0 or Name has_any (domain_has_any)

Filtreleme iyileştirmesi

Ayrıştırıcının performansını sağlamak için aşağıdaki filtreleme önerilerini not edin:

  • Ayrıştırılmış alanlar yerine her zaman yerleşik alanları filtreleyin. Ayrıştırılmış alanları kullanarak filtrelemek bazen daha kolay olsa da performansı önemli ölçüde etkiler.
  • İyileştirilmiş performans sağlayan işleçleri kullanın. Özellikle "==", "has" ve "startswith" (kodlama terimleri). İçerme veya eşleşme regex gibi işleçlerin kullanılması da performansı önemli ölçüde etkiler.

Performans için filtreleme önerilerini izlemek her zaman kolay olmayabilir. Örneğin, has kullanmak, içerir'e göre daha az doğrudur. Diğer durumlarda, SyslogMessage gibi yerleşik alanı eşleştirmek, DvcAction gibi ayıklanan bir alanı karşılaştırmaktan daha az doğrudur. Bu gibi durumlarda, yerleşik bir alan üzerinde performans iyileştirme işleci kullanarak hala ön filtreleme yapmanızı ve ayrıştırdıktan sonra daha doğru koşullar kullanarak filtreyi tekrarlamanızı öneririz.

Bir örnek için aşağıdaki Infoblox DNS ayrıştırıcı kod parçacığına bakın. Ayrıştırıcı ilk olarak SyslogMessage alanında istemci sözcüğünün bulunduğunu denetler. Ancak, terim iletide farklı bir yerde kullanılabilir, bu nedenle Log_Type alanını ayrıştırdıktan sonra ayrıştırıcı, istemci sözcüğünün gerçekten alanın değeri olduğunu tekrar denetler.

Syslog | where ProcessName == "named" and SyslogMessage has "client"
…
      | extend Log_Type = tostring(Parser[1]),
      | where Log_Type == "client"

Ayrıştırma

Sorgu ilgili kayıtları seçtikten sonra bunları ayrıştırmak gerekebilir. Genellikle, tek bir metin alanında birden çok olay alanı iletilirse ayrıştırma gerekir.

Ayrıştırma gerçekleştiren KQL işleçleri, performans iyileştirmelerine göre sıralanmış olarak aşağıda listelenmiştir. İlki en iyi duruma getirilmiş performansı sağlarken, sonuncusu en az iyileştirilmiş performansı sağlar.

Operatör Açıklama
böl Sınırlandırılmış değerlerden oluşan bir dizeyi ayrıştırın.
CSV dosyasını ayrıştır CSV (virgülle ayrılmış değerler) satırı olarak biçimlendirilmiş bir değer dizesini ayrıştırın.
ayrıştırmak Daha iyi performansa sahip basitleştirilmiş bir desen veya normal bir ifade olabilecek bir desen kullanarak rastgele bir dizeden birden çok değeri ayrıştırma.
hepsini_çıkar Normal bir ifade kullanarak tek değerleri rastgele bir dizeden ayrıştırma. extract_all, parse fonksiyonu normal ifade kullanıyorsa benzer bir performansa sahiptir.
özet Normal ifade kullanarak rastgele bir dizeden tek bir değer ayıklayın. Ayıklama kullanımı, tek bir değer gerekiyorsa ayrıştırma veya tümünü ayıklama yöntemlerinden daha iyi performans sağlar. Ancak, aynı kaynak dize üzerinde ayıklama işleminin birden çok kez uygulanması, tek bir ayrıştırma veya 'extract_all' ile karşılaştırıldığında daha az verimlidir ve bundan kaçınılması tavsiye edilir.
JSON çözümle JSON olarak biçimlendirilmiş bir dizedeki değerleri ayrıştırın. JSON'dan yalnızca birkaç değer gerekiyorsa ayrıştırma, ayıklama veya extract_all kullanılması daha iyi performans sağlar.
xml'i ayrıştır XML olarak biçimlendirilmiş bir dizedeki değerleri ayrıştırın. XML'den yalnızca birkaç değer gerekiyorsa ayrıştırma, ayıklama veya extract_all kullanılması daha iyi performans sağlar.

Dize ayrıştırmaya ek olarak, ayrıştırma aşaması aşağıdakiler de dahil olmak üzere özgün değerlerin daha fazla işlenmesini gerektirebilir:

  • Biçimlendirme ve tür dönüştürme. Ayıklandıktan sonra kaynak alanın hedef şema alanına sığacak şekilde biçimlendirilmesi gerekebilir. Örneğin, tarih ve saati temsil eden bir dizeyi tarih saat alanına dönüştürmeniz gerekebilir. Todatetime ve tohex gibi işlevler bu durumlarda yararlıdır.

  • Değer arama. Ayıklandıktan sonra kaynak alanın değerinin hedef şema alanı için belirtilen değer kümesine eşlenmesi gerekebilir. Örneğin, bazı kaynaklar sayısal DNS yanıt kodlarını bildirirken şemada daha yaygın metin yanıt kodları zorunlu tutulur. İşlevler iff ve case birkaç değeri eşlemek için yararlı olabilir.

    Örneğin, Microsoft DNS ayrıştırıcısı eventResult alanını bir iff deyimi kullanarak Olay Kimliği ve Yanıt Kodu temelinde aşağıdaki gibi atar:

    extend EventResult = iff(EventId==257 and ResponseCode==0 ,'Success','Failure')
    

    Aynı DNS ayrıştırıcısında gösterildiği gibi çeşitli değerler için datatable ve lookup kullanın:

    let RCodeTable = datatable(ResponseCode:int,ResponseCodeName:string) [ 0, 'NOERROR', 1, 'FORMERR'....];
    ...
     | lookup RCodeTable on ResponseCode
     | extend EventResultDetails = case (
     isnotempty(ResponseCodeName), ResponseCodeName,
     ResponseCode between (3841 .. 4095), 'Reserved for Private Use',
     'Unassigned')
    

Haritalama değerleri

Çoğu durumda, ayıklanan özgün değerin normalleştirilmesi gerekir. Örneğin, ASIM'de bir MAC adresi ayırıcı olarak iki nokta üst üste kullanırken, kaynak kısa çizgiyle ayrılmış bir MAC adresi gönderebilir. Değerleri dönüştürmek için birincil işleç, yukarıdaki Ayrıştırma bölümünde gösterildiği gibi geniş bir KQL dizesi, sayısal ve tarih işlevleri kümesinin yanı sıra genişletilir.

Bir değer kümesini hedef alanın izin verdiği değerlerle eşlemeniz gerektiğinde case, iff ve lookup deyimlerini kullanın.

Her kaynak değer bir hedef değerle eşlendiğinde, eşlemeyi veri tablosu işlecini kullanarak tanımlayın ve eşlemek için arama yapın. Örneğin:

let NetworkProtocolLookup = datatable(Proto:real, NetworkProtocol:string)[
        6, 'TCP',
        17, 'UDP'
   ];
    let DnsResponseCodeLookup=datatable(DnsResponseCode:int,DnsResponseCodeName:string)[
      0,'NOERROR',
      1,'FORMERR',
      2,'SERVFAIL',
      3,'NXDOMAIN',
      ...
   ];
   ...
   | lookup DnsResponseCodeLookup on DnsResponseCode
   | lookup NetworkProtocolLookup on Proto

Eşlemenin yalnızca iki olası değeri olduğunda da aramanın yararlı ve verimli olduğuna dikkat edin.

Eşleme koşulları daha karmaşık olduğunda iff veya durum işlevlerini kullanın. iff işlevi iki değeri eşlemeyi etkinleştirir:

| extend EventResult = 
      iff(EventId==257 and ResponseCode==0,'Success','Failure’)

Case işlevi ikiden fazla hedef değeri destekler. Aşağıdaki örnekte arama ve servis talebinin nasıl birleştirildiği gösterilmektedir. Yukarıdaki arama örneği, arama değeri bulunamazsa DnsResponseCodeName alanında boş bir değer döndürür. Aşağıdaki örnek , varsa arama işleminin sonucunu kullanarak ve aksi takdirde ek koşullar belirterek bunu artırır.

| extend DnsResponseCodeName = 
      case (
        DnsResponseCodeName != "", DnsResponseCodeName,
        DnsResponseCode between (3841 .. 4095), 'Reserved for Private Use',
        'Unassigned'
      )

Sonuç kümesindeki alanları hazırlama

Ayrıştırıcı, normalleştirilmiş alanların kullanıldığından emin olmak için sonuç kümesindeki alanları hazırlamalıdır.

Aşağıdaki KQL işleçleri, sonuç kümenizdeki alanları hazırlamak için kullanılır:

Operatör Açıklama Ayrıştırıcıda ne zaman kullanılır?
proje-yeniden adlandırma Alanları yeniden adlandırır. Gerçek olayda bir alan varsa ve yalnızca yeniden adlandırılması gerekiyorsa, project-rename'ı kullanın. Yeniden adlandırılan alan hala yerleşik bir alan gibi davranır ve alandaki işlemler çok daha iyi performansa sahiptir.
proje dışında Alanları kaldırır. Sonuç kümesinden kaldırmak istediğiniz belirli alanlar için proje dışında seçeneğini kullanın. Karışıklık oluşturmadığı veya çok büyük olmadığı ve performans üzerindeki etkileri olmadığı sürece, sonuç kümesinden normalleştirilmemiş özgün alanları kaldırmamanızı öneririz.
proje Daha önce var olan veya deyiminin bir parçası olarak oluşturulmuş alanları seçer ve diğer tüm alanları kaldırır. Ayrıştırıcı normalleştirilmemiş diğer alanları kaldırmaması gerektiği için ayrıştırıcıda kullanılması önerilmez. Ayrıştırma sırasında kullanılan geçici değerler gibi belirli alanları kaldırmanız gerekiyorsa, bunları sonuçlardan kaldırmak için proje dışında kullanın.
uzatmak Diğer adlar ekleyin. Genişletme operatörü, hesaplanan alanlar oluşturmadaki rolünün yanı sıra diğer adlar oluşturmak için de kullanılır.

Değişken ayrıştırma tutamacı

Çoğu durumda, bir olay akışındaki olaylar farklı ayrıştırma mantığı gerektiren değişkenler içerir. Tek bir ayrıştırıcıda farklı varyantları ayrıştırmak için if ve case gibi koşullu ifadeler veya birleşim yapısı kullanın.

Birden çok değişkeni işlemek üzere birleşim kullanmak için, her değişken için ayrı bir işlev oluşturun ve sonuçları birleştirmek için birleşim deyimini kullanın:

let AzureFirewallNetworkRuleLogs = AzureDiagnostics
    | where Category == "AzureFirewallNetworkRule"
    | where isnotempty(msg_s);
let parseLogs = AzureFirewallNetworkRuleLogs
    | where msg_s has_any("TCP", "UDP")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        ":"                  srcPortNumber:int
    …
    | project-away msg_s;
let parseLogsWithUrls = AzureFirewallNetworkRuleLogs
    | where msg_s has_all ("Url:","ThreatIntel:")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        " to "               dstIpAddr:string
    …
union parseLogs,  parseLogsWithUrls…

Yinelenen olayları ve aşırı işlemeyi önlemek için, her işlevin yerel alanları kullanarak, yalnızca ayrıştırması amaçlanan olayları filtreleyerek başladığından emin olun. Ayrıca gerekirse birleşimden önce her dalda proje dışında kullanın.

Ayrıştırıcıları dağıtma

Ayrıştırıcıları Azure İzleyici Günlük sayfasına kopyalayıp sorguyu işlev olarak kaydederek el ile dağıtın. Bu yöntem test için yararlıdır. Daha fazla bilgi için bkz. İşlev oluşturma.

Çok sayıda ayrıştırıcı dağıtmak için ayrıştırıcı ARM şablonlarını aşağıdaki gibi kullanmanızı öneririz:

  1. Her şema için ilgili şablonu temel alan bir YAML dosyası oluşturun ve sorgunuzu buna ekleyin. YAML şablonunuzdan, şema ve ayrıştırıcı türünüze uygun olanını, filtreleme veya parametresiz, seçerek başlayın.

  2. YAML dosyanızı ARM şablonuna dönüştürmek için ASIM Yaml to ARM şablon dönüştürücüsünüzü kullanın.

  3. Güncelleştirme dağıtıyorsanız portalı veya işlev silme PowerShell aracını kullanarak işlevlerin eski sürümlerini silin.

  4. Azure portalını veya PowerShell'i kullanarak şablonunuzu dağıtın.

Ayrıca, bağlı şablonları kullanarak birden çok şablonu tek bir dağıtım işlemiyle birleştirebilirsiniz.