Sovellusten tulisi tuottaa auditointilokia, joka mahdollistaa forensisen analyysin. Lokitiedot tulisi lähettää reaaliaikaisesti keskitetylle lokien keräily- ja analyysijärjestelmälle, jollaisen organisaatio yleensä tuottaa yhteisenä palveluna.

Lokitiedon muoto

Jotta lokitiedot olisivat käyttökelpoisia forensiikkaan, on tärkeää, että lokitiedoissa on tarkat UTC-aikaan sidotut aikaleimat. Kaikkien palvelinten on oltava synkronoituja yhteiseen aikastandardiin, yleensä NTP:llä. Aikaleimojen tallennukseen tulisi käyttää yhteneväistä kielioppia, mieluiten RFC 3339:n mukaan.

Lisäksi erityisesti mikropalveluarkkitehtuureissa lokitietoihin tulisi tallentaa pyyntötunniste, jota voidaan käyttää korreloimaan lokitapahtumia eri mikropalveluiden välillä. Pyyntötunnisteesta on lisäkuvaus alempana.

Palveluiden tulisi lokittaa kaikki sisään tulevat rajapintapyynnöt. Lokiin tulisi merkitä myös pyynnön lähettänyt IP-osoite, vaikka palvelu olisikin auki vain sisäverkkoon. Mikäli palvelu on kuormantasaimen tai välityspalvelimen takana, välityspalvelin on konfiguroitava välittämään ulkoinen IP-osoite edelleen proxy-protokollalla tai X-Forwarded-For -otsakkeessa.

Lokitapahtumien tulisi yleensä olla JSON-objekteja. Tämä mahdollistaa uusien ja tapauskohtaisten tietoelementtien lisäämisen sekä helpon lokien jäsentämisen millä tahansa nykyaikaisella lokianalyysityökalulla.

Erityisesti ympäristössä, joka skaalautuu elastisesti kuorman mukaan, palvelujen tulisi tallentaa lokiin myös yksikäsitteinen instanssitunnisteensa, joka koostuu sovelluksen ajossa olevan komponentin nimestä ja esimerkiksi prosessin, virtuaalikoneen tai Kubernetes-podin tunnisteesta.

Kehittäjän tulee pystyä liittämään vapaamuotoista kontekstuaalista tietoa lokitapahtumiin. Tämän tiedon tulisi antaa tietoa siitä, mitä sovellus yritti kyseisessä tilanteessa tehdä. Jos sovellus saa lokitettavaan tapahtumaan liittyen toiselta sovellukselta ihmisluettavan virheviestin, se on hyvä liittää mukaan.

Lokitettavat tapahtumat

Tapahtumat, jotka tulisi kirjoittaa lokimerkintä, ovat:

  • Henkilötietojen lukeminen, muuttaminen ja poisto. Lokikirjauksen tulisi sisältää sovelluksen sisäinen tunniste siitä henkilöstä, kenen tietoihin kajottiin ja kuka niihin kajosi, mutta yleensä ei henkilötietoja itsessään
  • Henkilötietojen käytön suostumus ja suostumuksen peruminen, käyttöehtojen hyväksyminen, viestintäasetusten muuttuminen
  • Muutokset istuntojen todennuksen tai valtuutuksen tilassa (sisäänkirjautuminen, käyttäjätason vaihtuminen, uloskirjautuminen)
  • Istuntotunnisteiden tarkistuksen virheet
  • Epäonnistuneet todennus- tai valtuutusyritykset


Seuraavat tapahtumat voivat generoida liikaa lokidataa, mutta niitä voidaan myös harkita auditointitarkoituksiin:

  • Epäonnistuneet kutsut taustapalvelimelle tai muihin mikropalveluihin, koska tämä saattaa olla merkki vääristä kutsuparametreista. Lokiin tulisi tällöin kirjoittaa palautettu virheviesti vapaamuotoisena tietona, jos sellainen on.
  • Epäonnistunut syötteen tarkastus (esimerkiksi rajapintakutsu, johon tulee vääränlainen syöte). Internetiin auki olevista avoimista rajapinnoista voi tulla liikaa tämänkaltaisia lokitapahtumia, mutta suljettujen rajapintojen osalta vialliset kutsut tulisi todennäköisesti aina kirjata lokiin.

Pyyntötunnisteet

Pyyntötunniste on erityisesti mikropalveluarkkitehtuureille hyödyllinen tapa korreloida lokitietoja. Niiden avulla voidaan jälkikäteen rakentaa kuva siitä, mitä sisään tulleen pyynnön seurauksena tapahtui.

Sovelluksella saattaa olla käytössä hajautettu pyyntöjen seuranta (distributed tracing). Tällaista järjestelyä voidaan käyttää pyyntöjen seurantaan, mikäli se tuottaa riittävän pysyvän lokitiedon. Mikäli tällaista järjestelyä ei ole olemassa, pyyntötunnisteet voidaan toteuttaa myös seuraavasti.

Pyyntötunnisteen tulisi olla satunnainen tunniste, joka luodaan mahdollisimman aikaisessa vaiheessa sisään tulevia pyyntöjä käsitellessä (esimerkiksi kuormantasaimessa). Se lisätään HTTP-pyyntöön sopivassa otsakkeessa, kuten X-Request-Id. On huomattava, että ulkopuolelta syötetyt pyyntötunnisteet tulee poistaa, koska ne ovat hyökkääjän manipuloitavissa.

Jokainen palvelu (mikropalvelu), joka vastaanottaa X-Request-Id -arvon, kopioi vastaavan arvon kaikkiin muihin palveluihin lähettämiinsä pyyntöihin. Lisäksi palvelu tallentaa tämän arvon jokaiseen auditointilokitapahtumaan, jotka pyyntö aiheutti.

Yhdistettynä aikaleimoihin pyyntötunniste antaa mahdollisuuden muodostaa täydellisen kuvan mikropalveluiden kutsuhierarkiasta ja korreloida kaikki pyynnöt siihen ulkoiseen IP-osoitteeseen, josta alkuperäinen pyyntö tuli.