skip to Main Content

Autentikointi ja auktorisointi mikropalveluarkkitehtuurissa

Useista pienistä ja itsenäisesti toimivista palveluista koostuvan järjestelmän arkkitehtuuria kutsutaan mikropalveluarkkitehtuuriksi. Autentikoinnin ja auktorisoinnin toteuttaminen tällaisessa arkkitehtuurissa on haasteellisempaa verrattuna perinteisiin monoliittisiin ohjelmiin. 

Autentikointi ja auktorisointi ovat prosesseja, joiden avulla käyttäjälle myönnetään pääsy järjestelmään ja annetaan tarvittavat käyttöoikeudet sen käyttämiseen. Perinteisesti monoliittisessa sovelluksessa kaikki tämä tapahtuu saman sovelluksen sisällä, mutta mikropalveluarkkitehtuurissa järjestelmä koostuu useista palveluista.

Mikropalveluarkkitehtuurin periaatteiden mukaan kullakin mikropalvelulla on oma yksittäinen tehtävänsä, joten auktorisointi- ja autentikointiprosessien toteuttaminen erikseen kuhunkin mikropalveluun ei täysin noudata tätä periaatetta. Lisäksi kirjautuminen jokaiseen mikropalveluun erikseen ei ole kovin käyttäjäystävällistä.

Kirjautuminen mikropalveluarkkitehtuurissa

Autentikointiin eli tunnistautumiseen liittyvän ongelman mikropalveluissa voi ratkaista kertakirjautumisen (engl. Single Sign On, SSO) avulla. Kertakirjautumisen avulla käyttäjä pääsee käyttämään useita palveluita yksittäisen tunnistautumiskerran jälkeen. Käytännössä järjestelmä näyttää ulkoapäin yhdeltä kokonaisuudelta, johon kirjaudutaan vain kerran. Taustalla käyttäjälle luodaan jokin istunto tai tunniste.

Tunnistautumistietoa siirretään eri mikropalveluille pyyntöjen yhteydessä, ja palvelut voivat jollain tapaa tarkistaa tunnistautumistiedon aitouden. Kertakirjautumisen toteuttamista varten on olemassa useita eri protokollia kuten OAuth, OpenId Connect, SAML ja Json Web Token.

Pääsynhallinnan toteuttaminen

Auktorisoinnin eli pääsynhallinnan toteuttamiseen on olemassa erilaisia malleja ja oikean mallin valinta riippuu sovelluksesta ja siitä, kuinka monia erilaisia käyttöoikeuksia sovelluksen käyttäjillä on. Usein pääsynhallinta toteutetaan käyttämällä rooleihin (engl. Role-Based Access Control, RBAC) tai attribuutteihin (engl. Attribute-Based Access Control, ABAC) perustuvia malleja.

Mikropalveluarkkitehtuurissa pääsynhallinta voidaan toteuttaa keskitetysti yhdessä palvelussa tai se voidaan toteuttaa hajautetusti jokaisessa mikropalvelussa. Pääsynhallinta on myös mahdollista toteuttaa keskitetyn ja hajautetun mallin hybriditoteutuksena.

Keskitetyssä pääsynhallinnassa pääsynhallinta tehdään jonkin keskitetyn palvelun kautta, ja se muistuttaa monoliittisen ohjelman auktorisointia. Tällaisessa ratkaisussa mikropalvelu lähettää erillisiä auktorisointipyyntöjä pääsynhallintamoduulille, kun jotain toimintoa halutaan suorittaa. Se lisää jonkin verran viivettä palvelun toiminnassa ja lisää palveluiden välille kytköksiä, joita pyritään mikropalveluarkkitehtuurissa välttämään.

Hajautetusti toteutetussa pääsynhallinnassa mikropalvelut auktorisoivat pyynnöt täysin itse. Tämä voidaan toteuttaa välittämällä käyttäjän käyttöoikeudet pyynnön mukana mikropalvelulle. Hajautettu malli on usein keskitettyä parempi, koska sen avulla vältetään ylimääräisiä kytköksiä mikropalveluiden välillä.

Lisäksi hajautettua pääsynhallintaa voidaan toteuttaa käyttäen palveluverkkoarkkitehtuuria (engl. Service Mesh), jossa mikropalveluiden ohelle kytketään eräänlainen “sivuvaunupalvelu”. Se voi olla jaettu koodikirjasto tai erillinen mikropalvelu varsinaisen mikropalvelun ohella. Sivuvaunut muodostavat niin sanotun palveluverkon, jonka kautta kulkevat niin pyynnöt kuin liikenne mikropalvelusta toiseen.

Nämä sivuvaunut hoitavat kaiken pyyntöjen auktorisointi- ja autentikointilogiikan. Tällöin itse mikropalveluihin ei tarvitse toteuttaa kyseisiä toiminnallisuuksia. Käytännössä pyynnöt menevät ensin sivuvaunulle, joka tarkistaa, voidaanko pyyntö suorittaa. Tämän jälkeen pyyntö ohjataan mikropalvelulle.

Esimerkkiratkaisu

Esimerkkiratkaisussa oletetaan, että mikropalveluita suoritetaan yksityisessä verkossa. Kaikki ulkoiset pyynnöt mikropalveluihin kulkevat API-yhdyskäytävän (engl. API Gateway) kautta, jossa suoritetaan auktorisointia karkealla tasolla. Jos käyttäjä ei ole tunnistautunut, pyynnöt hylätään. Autentikointi toteutetaan kertakirjautumisena, esimerkiksi OAuth-teknologian avulla. Käyttäjä voi siis kirjautua järjestelmään ja käyttää kaikkia rajapintoja ja mikropalveluita yhden tunnistautumisen jälkeen kuten kuvassa 1 esitetään.

Esimerkkiratkaisu autentikoinnin ja auktorisoinnin toteuttamiseen kaaviomuodossa.
Kuva 1. Esimerkkiratkaisu autentikoinnin ja auktorisoinnin toteuttamiseen.

Tässä ratkaisussa mikropalveluiden ei tarvitse olla kytköksissä keskitettyyn auktorisointipalveluun, sillä kaikki auktorisointiin tarvittava tieto saadaan pyyntöjen mukana ja pääsynhallinta suoritetaan mikropalveluiden ohelle konfiguroiduissa sivuvaunuissa.

Pääsynhallinta tapahtuu käyttäjän käyttöoikeuksien perusteella, jotka ovat esim. RBAC (Role-Based Access Control) -mallin mukaisia rooleja. Kun järjestelmää käytetään, pyyntö kulkee API-yhdyskäytävän kautta keskitettyyn auktorisointimikropalveluun, jossa OAuth-tunnistetta vastaan palautetaan roolit ja käyttöoikeudet sisältävä JSON Web Token. Tällä JWT:llä on lyhyt voimassaoloaika ja se kulkee alkuperäisen pyynnön mukana mikropalvelulle, jossa tarkempi auktorisointi tapahtuu. Käyttöoikeudet ja roolit sisältävä JWT ei siis koskaan paljastu suoraan käyttäjälle, vaan sitä käytetään vain mikropalveluiden välisessä liikenteessä.

JWT on lisäksi allekirjoitettu auktorisointipalvelussa. Mikropalvelut tarkistavat allekirjoituksen esimerkiksi julkisen avaimen tai varmenteen avulla. Allekirjoituksella pyritään estämään hyökkäys, jossa hyökkääjä tietäisi mikropalveluiden vaatimista JWT:istä ja pyrkisi ujuttamaan keinotekoisen JWT:n pyyntöihin mukaan.

Yllä esitelty ratkaisu tekee mikropalveluista helpommin vaihdettavia ja uudelleenkäytettäviä, koska suoria kytköksiä auktorisointipalveluun ei ole. Myös auktorisoinnin toteuttava sivuvaunu on uudelleenkäytettävä ja konfiguroitavissa eri mikropalveluille. Samoja mikropalveluita voisi periaatteessa näin ollen käyttää myös muissa ohjelmistoissa. Lisäksi tässä ratkaisussa kaikilla palveluilla on tietty rajattu tehtävä, joten se noudattaa hyvin mikropalveluarkkitehtuurille ominaista yhden vastuun periaatetta (engl. Single Responsibility Principle).

Diplomityöni ”Autentikoinnin ja auktorisoinnin toteuttaminen mikropalveluarkkitehtuurissa” yksi osa-alue oli tutkia kirjallisuudesta erilaisia mikropalveluiden autentikointi- ja auktorisointiratkaisuja, joiden joukosta yritin löytää sopivimmat ratkaisut mikropalveluarkkitehtuurille.


Roope Karvinen

Ohjelmistosuunnittelija

Roope Karvinen työskentelee Atostekilla ohjelmistosuunnittelijana. Hän on aloittanut Atostekilla vuonna 2019 ja saanut diplomi-insinöörin paperit vuonna 2021. IT-maailmassa häntä kiinnostavat erityisesti tietoturva sekä ohjelmistoarkkitehtuurit.