ASIM-jäsennyksen luominen
Kehittyneen suojauksen tietomallin (ASIM) käyttäjät käyttävät kyselyissä yhdistämismuuttajia taulukoiden nimien sijaan, jotta he voivat tarkastella tietoja normalisoidussa muodossa ja sisällyttää kyselyyn kaikki rakenteeseen liittyvät tiedot. Yhdistämällä jäsennykset voit käsitellä kunkin lähteen tiettyjä tietoja lähdekohtaisilla jäsennyksillä.
Microsoft Sentinel tarjoaa sisäänrakennettuja lähdekohtaisia jäsennyksiä monille tietolähteille. Saatat haluta muokata tai kehittää näitä lähdekohtaisia jäsennyksiä seuraavissa tilanteissa:
Kun laitteesi tarjoaa ASIM-rakenteeseen sopivia tapahtumia, mutta laitteesi lähdekohtainen jäsennys ja asianmukainen rakenne eivät ole käytettävissä Microsoft Sentinelissä.
Kun ASIM-lähdekohtaiset jäsennykset ovat käytettävissä laitteessasi, laite lähettää TAPAHTUMAT ASIM-jäsennysten mukaan eri tavalla tai eri tavalla kuin mitä se on odottanut. Esimerkiksi:
Lähdelaite on ehkä määritetty lähettämään tapahtumia ei-vakio-tavalla.
Laitteesi versio voi olla eri kuin ASIM-jäsennyksen tukema.
Välittäjäjärjestelmä voi kerätä ja muokata tapahtumia ja välittää ne edelleen.
Mukautettu jäsennyskehitysprosessi
Seuraavassa työnkulussa kuvataan mukautetun ASIM-lähdekohtaisen jäsennyksen kehittämisen ylätason vaiheet:
Mallilokien kerääminen.
Määritä ne rakenteet tai rakenteet, joita lähteestä lähetetyt tapahtumat edustavat.
Yhdistä lähdetapahtumakentät tunnistettuun rakenteeseen tai rakenteeseen.
Kehitä yksi tai useampi ASIM-jäsennys lähteellesi. Sinun on kehitettävä suodatuksen jäsennys ja parametritta -jäsennys kullekin lähteelle olennaiselle rakenteelle.
Testaa jäsennystä.
Ota jäsennykset käyttöön Microsoft Sentinel -työtiloissa.
Päivitä asianmukainen ASIM-yhdistävä jäsennys viittaamaan uuteen mukautettuun jäsennykseen.
Haluat ehkä myös lisätä jäsennyksesi ensisijaiseen ASIM-jakaumaan. Osaan sisältyvät jäsennykset voidaan myös saattaa saataville kaikissa työtiloissa sisäisinä jäsennyksinä.
Mallilokien kerääminen
Jotta voit luoda tehokkaita ASIM-jäsennyksiä, tarvitset edustavan joukon lokeja, mikä useimmiten edellyttää lähdejärjestelmän määrittämistä ja sen yhdistämistä Microsoft Sentineliin. Jos lähdelaitetta ei ole käytettävissä, käytön mukaan laskevien pilvipalveluiden avulla voit ottaa käyttöön useita laitteita kehitystä ja testausta varten.
Lisäksi toimittajan dokumentaation ja lokien näytteiden löytäminen voi auttaa nopeuttamaan kehitystä ja vähentämään virheitä varmistamalla laajan lokimuodon kattavuuden.
Edustavan lokijoukon tulisi sisältää seuraavat:
- Tapahtumat, joiden tulokset ovat erilaiset.
- Tapahtumat, joissa on eri vastaustoimintoja.
- Eri muodot käyttäjänimelle, isäntänimelle ja tunnuksille sekä muille kentille, jotka edellyttävät arvon normalisointia.
Kuvaus
Ennen kuin luot jäsennyksen, yhdistä lähdetapahtumassa tai tapahtumissa käytettävissä olevat tiedot tunnistamaasi rakenteeseen:
- Yhdistä kaikki pakolliset kentät ja mieluiten myös suositellut kentät.
- Yritä yhdistää lähteessä käytettävissä olevat tiedot normalisoituihin kenttiin. Jos se ei ole käytettävissä osana valittua rakennetta, harkitse yhdistämistä muissa rakenteet käytettävissä oleviin kenttiin.
- Yhdistä lähteen kenttien arvot ASIM:n sallimiin normalisoituihin arvoihin. Alkuperäinen arvo tallennetaan erilliseen kenttään, kuten EventOriginalResultDetails.
Jäsennysten kehittäminen
Kehitä kullekin rakenteen suodattimelle ja parametrittomalle jäsennys.
Mukautettu jäsennys on Microsoft Sentinel Logs -sivulla kehitetty KQL-kysely. Jäsennyskyselyssä on kolme osaa:
Suodata > Valmistele-kentät >
Asianmukaisten tietueiden suodattaminen
Monissa tapauksissa Microsoft Sentinel -taulukko sisältää useita erityyppisiä tapahtumia. Esimerkiksi:
- Syslog-taulukossa on tietoja useista lähteistä.
- Mukautetut taulukot voivat sisältää tietoja yhdestä lähteestä, joka tarjoaa useamman kuin yhden tapahtumatyypin ja voi mahtua eri rakenteet.
Tämän vuoksi jäsennyksen tulisi ensin suodattaa vain kohderakenteeseen liittyvät tietueet.
KQL:ssä suodattaminen tehdään where-operaattorilla . Esimerkiksi Sysmon-tapahtuma 1 raportoi prosessin luomisesta, joten se normalisoidaan ProcessEvent-rakenteeseen . Sysmon-tapahtuma 1 -tapahtuma on osa Tapahtuma-taulukkoa, joten voit käyttää seuraavaa suodatinta:
Event | where Source == "Microsoft-Windows-Sysmon" and EventID == 1
Tärkeää
Jäsennyksen ei tulisi suodattaa ajan mukaan. Jäsennintä käy oleva kysely käyttää aika-aluetta.
Suodattaminen lähdetyypin mukaan katseluluettelon avulla
Joissakin tapauksissa itse tapahtuma ei sisällä tietoja, jotka sallisivat suodattamisen tietyissä lähdetyypeissä.
Esimerkiksi Infoblox DNS -tapahtumat lähetetään Syslog-viesteinä, ja niitä on vaikea erottaa muista lähteistä lähetetyistä Syslog-viesteistä. Tällöin jäsennys käyttää luetteloa lähteistä, jotka määrittävät asiaankuuluvat tapahtumat. Tätä luetteloa ylläpidetään ASimSourceType-katseluluettelossa.
ASimSourceType-katseluluettelon käyttäminen jäsennyksissä:
- Lisää seuraava rivi jäsennyksen alkuun:
let Sources_by_SourceType=(sourcetype:string){_GetWatchlist('ASimSourceType') | where SearchKey == tostring(sourcetype) | extend Source=column_ifexists('Source','') | where isnotempty(Source)| distinct Source };
- Lisää suodatin, joka käyttää katseluluetteloa jäsennyssuodatuksen osassa. Esimerkiksi Infoblox DNS -jäsennys sisältää seuraavat suodatusosiossa:
| where Computer in (Sources_by_SourceType('InfobloxNIOS'))
Tämän mallin käyttäminen jäsennystoiminnossa:
Korvaa Tietokone sen kentän nimellä, joka sisältää lähteesi lähdetiedot. Voit pitää tämän tietokoneena kaikille Syslog-pohjaisille jäsennyksille.
Korvaa InfobloxNIOS-tunnus haluamallasi arvolla jäsennystä varten. Ilmoita jäsennyskäyttäjille, että heidän on päivitettävä ASimSourceType-katseluluettelo käyttämällä valitsemaasi arvoa sekä tämäntyyppisten tapahtumien lähettämiseen käytettävää lähdeluetteloa.
Jäsennysparametreihin perustuva suodatus
Kun kehität suodatus jäsennyksiä, varmista, että jäsennys hyväksyy soveltuvan rakenteen suodatusparametrit kyseisen rakenteen viiteartikkelissa kuvatulla tavalla. Käyttämällä olemassa olevaa jäsennintä lähtökohtana varmistat, että jäsennys sisältää oikean funktion allekirjoituksen. Useimmissa tapauksissa todellinen suodatuskoodi on samanlainen myös saman rakenteen jäsennysten suodattamisessa.
Kun suodatat, varmista, että:
- Suodata ennen jäsennystä fyysisten kenttien avulla. Jos suodatetut tulokset eivät ole riittävän tarkkoja, voit hienosäätää tuloksia toistamalla testin jäsennyksen jälkeen. Lisätietoja on artikkelissa Optimointi.
- Älä suodata, jos parametria ei ole määritetty ja sillä on edelleen oletusarvo.
Seuraavissa esimerkeissä näytetään, miten voit toteuttaa suodatuksen merkkijonoparametrille, jonka oletusarvo on yleensä *, ja luetteloparametrille, jossa oletusarvo on yleensä tyhjä luettelo.
srcipaddr=='*' or ClientIP==srcipaddr
array_length(domain_has_any) == 0 or Name has_any (domain_has_any)
Suodatuksen optimointi
Varmista jäsennyksen suorituskyky huomioimalla seuraavat suodatussuositukset:
- Suodata aina sisäänrakennetut kentät jäsennyskenttien sijaan. Vaikka suodattaminen on joskus helpompaa jäsennetyillä kentillä, se vaikuttaa suorituskykyyn dramaattisesti.
- Käytä operaattoreita, jotka tarjoavat optimoidun suorituskyvyn. Erityisesti ==, on ja alkaa. Operaattoreiden, kuten sisältää- tai vastaavuus, käyttö vaikuttaa myös merkittävästi suorituskykyyn.
Suorituskykysuositusten suodattaminen ei välttämättä ole aina helppoa. Esimerkiksi -menetelmän käyttäminen ei ole yhtä tarkka kuin sisältää.) Muissa tapauksissa sisäinen kenttä, kuten SyslogMessage, vastaavuus on vähemmän tarkka kuin poimitun kentän, kuten DvcActionin, vertailu. Suosittelemme tässä tapauksessa, että edelleen esisuodatat käyttämällä suorituskyvyn optimointioperaattoria sisäisessä kentässä ja toistat suodattimen käyttämällä tarkempia ehtoja jäsentämisen jälkeen.
Katso esimerkiksi seuraava Infoblox DNS -jäsennyskatkelman kohta. Jäsennys tarkistaa ensin, että SyslogMessage-kentässä on sana asiakas. Termiä voidaan kuitenkin käyttää eri paikassa viestissä, joten kun Log_Type-kenttä on jäsennys, jäsennys tarkistaa uudelleen, että sana asiakas oli todellakin kentän arvo.
Syslog | where ProcessName == "named" and SyslogMessage has "client"
…
| extend Log_Type = tostring(Parser[1]),
| where Log_Type == "client"
Jäsentäminen
Kun kysely valitsee tarvittavat tietueet, se voi joutua jäsentämään ne. Yleensä jäsennystä tarvitaan, jos yksittäiseen tekstikenttään välitetään useita tapahtumakenttiä.
Jäsennystä suorittavat KQL-operaattorit on lueteltu alla niiden suorituskyvyn optimoinnin mukaan. Ensimmäinen tarjoaa optimoiduimman suorituskyvyn, kun taas viimeinen tarjoaa vähiten optimoidun suorituskyvyn.
| Operaattori | Kuvaus |
|---|---|
| jakaa | Jäsennä eroteltujen arvojen merkkijono. |
| parse_csv | Jäsentä CSV-riviksi (pilkuin erotellut arvot) muotoillun arvomerkkijonon. |
| jäsentää | Jäsentää useita arvoja mielivaltaisesta merkkijonosta käyttämällä mallia, joka voi olla yksinkertaistettu malli, jolla on parempi suorituskyky, tai säännönmukainen lauseke. |
| extract_all | Jäsentä yksittäisiä arvoja mielivaltaisesta merkkijonosta käyttäen säännönmukaista lauseketta. extract_all suorituskyky on samankaltainen kuin jäsennys, jos jälkimmäisessä käytetään säännönmukaista lauseketta. |
| uute | Poimi yksittäinen arvo mielivaltaisista merkkijonoista käyttäen säännönmukaista lauseketta. Poiminta tarjoaa paremman suorituskyvyn kuin jäsennä tai extract_all, jos yksittäistä arvoa tarvitaan. Purkuen useiden aktivoinnit saman lähdemerkkijonon kautta ei kuitenkaan ole yhtä tehokasta kuin yksittäinen jäsennys tai extract_all, ja sitä tulisi välttää. |
| parse_json | Jäsennä JSON-muotoon muotoillun merkkijonon arvot. Jos JSON-mallissa tarvitaan vain muutamia arvoja, voit parantaa suorituskykyä jäsentämisen, poimimisen tai extract_all avulla. |
| parse_xml | Jäsennä XML-muotoon muotoillun merkkijonon arvot. Jos XML:ssä tarvitaan vain muutama arvo, käyttämällä jäsennystä, poimimista tai extract_all suorituskykyä voidaan parantaa. |
Merkkijonon jäsentämisen lisäksi jäsennysvaihe voi edellyttää alkuperäisten arvojen käsittelyä, mukaan lukien:
Muotoilu ja tyypin muunto. Kun lähdekenttä on poimittu, se täytyy ehkä muotoilla sopimaan kohderakennekenttään. Saatat esimerkiksi joutua muuntamaan päivämäärää ja aikaa edustavan merkkijonon datetime-kentäksi. Funktioista, kuten todatetime ja tohex, on hyötyä näissä tapauksissa.
Arvon haku. Lähdekentän arvo, kun se on poimittu, on ehkä yhdistettävä kohderakennekenttään määritettyyn arvojoukkoon. Jotkin lähteet esimerkiksi raportoivat numeerisista DNS-vastauskoodeista, kun taas rakenne määrittää yleisemmät tekstivastauskoodit. Funktioista ja kirjainkoomista voi olla hyötyä muutamien arvojen yhdistämisessä.
Esimerkiksi Microsoft DNS -jäsennys määrittää EventResult-kentän Tapahtuman tunnuksen ja vastauksen koodin perusteella iff-lausekkeen avulla seuraavasti:
extend EventResult = iff(EventId==257 and ResponseCode==0 ,'Success','Failure')Käytä useissa arvoissa tietotaulukkoa ja hakua, kuten samassa DNS-jäsennys -kohdassa on osoitettu:
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')
Arvojen yhdistäminen
Monissa tapauksissa poimittu alkuperäinen arvo pitää normalisoida. Esimerkiksi ASIM:ssä MAC-osoite käyttää erottimena kaksoispistettä, kun taas lähde voi lähettää yhdysmerkillä erotellun MAC-osoitteen. Ensisijainen operaattori arvojen muuntamiseen on laajentaa laajan KQL-merkkijono-, numeeristen ja päivämääräfunktioiden joukon rinnalle, kuten yllä olevassa Jäsennys-osassa on esitetty.
Käytä palvelupyyntö-, iff- ja hakulausekkeita, kun sinun on yhdistettävä arvojoukko kohdekentän sallimiin arvoihin.
Kun kukin lähdearvo yhdistetään kohdearvoon, määritä yhdistämismääritys tietotaulukko-operaattorin ja haun avulla. Esimerkiksi
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
Huomaa, että haku on hyödyllinen ja tehokas myös silloin, kun yhdistämismäärityksessä on vain kaksi mahdollista arvoa.
Kun yhdistämisehdot ovat monimutkaisempia, käytä iff- tai tapausfunktioita. iff-funktio mahdollistaa kahden arvon yhdistämisen:
| extend EventResult =
iff(EventId==257 and ResponseCode==0,'Success','Failure’)
Tapausfunktio tukee useampia kuin kahta tavoitearvoa. Alla olevassa esimerkissä näytetään, miten haku ja kirjainkoko yhdistetään. Yllä oleva hakuesimerkki palauttaa tyhjän arvon DnsResponseCodeName-kentässä, jos hakuarvoa ei löydy. Alla oleva esimerkkitapaus laajentaa sitä käyttämällä hakutoiminnon tulosta, jos se on käytettävissä, ja määrittämällä muussa tapauksessa lisäehtoja.
| extend DnsResponseCodeName =
case (
DnsResponseCodeName != "", DnsResponseCodeName,
DnsResponseCode between (3841 .. 4095), 'Reserved for Private Use',
'Unassigned'
)
Valmistele kentät tulosjoukossa
Jäsennyksen on valmisteltava tulosjoukon kentät sen varmistamiseksi, että normalisoituja kenttiä käytetään.
Tulosjoukon kenttien valmisteluun käytetään seuraavia KQL-operaattoreita:
| Operaattori | Kuvaus | Milloin käyttää jäsennyessä? |
|---|---|---|
| project-rename | Nimeää kenttiä uudelleen. | Jos kenttä on olemassa todellisessa tapahtumassa ja se on nimettävä uudelleen, käytä projektin nimeä uudelleennimeämistä. Uudelleennimetty kenttä käyttäytyy edelleen kuin sisäinen kenttä, ja kentän toiminnoilla on paljon parempi suorituskyky. |
| projekti poispäin | Poistaa kenttiä. | Käytä projektin pois -ominaisuuksille tiettyjä kenttiä, jotka haluat poistaa tulosjoukosta. Suosittelemme, että et poista alkuperäisiä kenttiä, joita ei ole normalisoitu tulosjoukosta, elleivät ne aiheuta sekaannusta tai ovat erittäin suuria ja niillä voi olla vaikutuksia suorituskykyyn. |
| projekti | Valitsee kentät, jotka oli olemassa ennen lauseketta tai jotka luotiin osana lauseketta, ja poistaa kaikki muut kentät. | Ei suositella käytettäväksi jäsennykseen, koska jäsennys ei poista muita kenttiä, joita ei normalisoida. Jos sinun on poistettava tietyt kentät, kuten jäsennyksen aikana käytetyt väliaikaiset arvot, poista ne tuloksista käyttämällä projektin poistoja. |
| jatkaa | Lisää aliaksia. | Sen lisäksi, että laajennusoperaattori luo laskettuja kenttiä, sen roolia laskettujen kenttien luonnissa käytetään myös aliasten luomiseen. |
Käsittele jäsennysvariantit
Monissa tapauksissa tapahtumavirran tapahtumat sisältävät variantteja, jotka edellyttävät erilaista jäsennyslogiikkaa. Jos haluat jäsentää eri variantteja yhdessä jäsennystilassa, käytä joko ehdollisia lausekkeita, kuten iff ja tapaus, tai käytä yhdistelmärakennetta.
Jos haluat käyttää yhdistämistä useiden varianttien käsittelyyn, luo erillinen funktio kullekin variantille ja yhdistä tulokset yhdistämällä ne yhdistämällä yhdistämislauseke:
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…
Jos haluat välttää päällekkäiset tapahtumat ja liiallisen käsittelyn, varmista, että kukin funktio käynnistyy suodattamalla käyttäen alkuperäisiä kenttiä ja vain tapahtumia, jotka se on tarkoitettu jäsennykseen. Käytä tarvittaessa myös projektia jokaisessa haarassa ennen liittoa.
Jäsennysten käyttöönotto
Ota jäsennykset käyttöön manuaalisesti kopioimalla ne Azure Monitor Log -sivulle ja tallentamalla kysely funktiona. Tästä menetelmästä on hyötyä testauksessa. Lisätietoja on kohdassa Funktion luominen.
Jos haluat ottaa käyttöön suuren määrän jäsennyksiä, suosittelemme parser ARM -mallien käyttämistä seuraavasti:
Luo YAML-tiedosto kullekin rakenteen kannalta olennaisen mallin pohjalta ja sisällytä siihen kysely. Aloita rakenteen ja jäsennyksen tyyppiä, suodatusta tai parametrittomaa käyttämällä YAML-mallia, joka liittyy rakenteeseen ja jäsennykseen.
VOIT muuntaa YAML-tiedoston ARM-malliksi ASIM Yaml to ARM -mallimuunntimen avulla.
Jos otat päivityksen käyttöön, poista funktioiden vanhemmat versiot portaalin avulla tai poista PowerShell-työkalu.
Ota mallisi käyttöön Azure-portaalin tai PowerShellin avulla.
Voit myös yhdistää useita malleja yhteen käyttöönottoprosessiin linkitettyjen mallien avulla.