You are here: TUTWiki>Tietoturva/Tutkielmat>TyoLuettelo?>2006-9

Olli Sorje

Pääsynvalvonta PostgreSQL-tietokannan hallintajärjestelmässä

Johdanto

Tässä tutkielmassa perehdytään PostgreSQL nimisen, ilmaisen tietokannan hallintajärjestelmän pääsynvalvontaan. Ensin esitellään lyhyesti relaatiotietokantoja yleisesti sekä yleisiä pääsynvalvonnan mekanismeja ja periaatteita, jonka jälkeen katsotaan mitä mekanismeja PostgreSQL tarjoaa käyttäjälle.

PostgreSQL:n tarjoamiin mahdollisuuksiin pureudutaan syvemmälle esimerkkien avulla ja lopuksi vielä annetaan vinkkejä turvallisen pääsynvalvonnan toteuttamiseen PostgreSQL:llä.

Taustatietoa

PostgreSQL yleisesti

PostgreSQL on BSD-lisenssin alaisuudessa avoimena lähdekoodina jaettava olio-relaatiotietokannan hallintajärjestelmä. Se on saatavana Windowsille ja useimmille Unix-varianteille(mm. Linux, Solaris, Max OS X). PostgreSQL sai alkunsa jo 80-luvun loppupuolella. [2]

Relaatiotietokannat yleisesti

Tietokannalla tarkoitetaan joukkoa tietoja, jotka liittyvät toisiinsa. Kun nämä tiedot on tallennettu relaatiomallin mukaisesti, puhutaan relaatiotietokannasta. Relaatiotietokannoilla on vahva teoreettinen pohja. [5]

Relaatiotietokannat koostuvat relaatioista, joissa kaikki tieto säilytetään. Relaatioissa on sarakkeita(ominaisuus) ja rivejä(monikko), joten usein relaatioista puhutaankin nimellä tietokantataulu.[5] Relaatiotietokantojen etuna voidaan pitää tietojen helppoa saatavuutta, sillä tietojen käyttö on mahdollista heti tietokantaan tallentamisen jälkeen. Taulukkojen välille luodaan relaatio eli yhteys, jotka nopeuttavat ja tarkentavat tietojen päivittämistä, sillä muutos on tehtävä vain yhteen paikkaan. Relaatiotietokanta on suunniteltava huolellisesti, sillä hyvin suunnitellusta tietokannasta voi helposti tyydyttää monimutkaiset tietotarpeet ja voi välttää paljon turhaa työtä kun ei joudu luomaan uudelleen koko tietokantaa ja syöttämään kaikkia tietoja uudelleen.[6]

Nykyisissä relaatiotietokannoissa on monia lisäominaisuuksia, joista tässä selitän tämän tutkielman kannalta olennaisimmat.

  • Kysely: SQL-kielinen lause, jolla tietokannasta haetaan tietoa.
  • Näkymä: yleensä näkymä esittää relaation jollain tavalla rajoitettuna, jolloin esim. kaikki rivit tai sarakkeet eivät ole mukana. Näkymiä voidaan käyttää esim. rajaamaan joiltain käyttäjiltä osa tiedosta tai yksinkertaistamaan monimutkaisia kyselyjä.
  • Liipaisin: liipaisin määrittelee toiminnon, joka suoritetaan aina, kun tietty tapahtuma tapahtuu. Liipaisimelle asetetaan ehto jolloin se laukeaa esim. kun tätä taulua päivitetään tai tähän tauluun lisätään rivi. Toiminto voi olla esim. kun taulua päivitetään, niin tarkasta, että tietyn sarakkeen arvoa ei ole pienennetty. Liipaisimella voidaan myös määrittää, tehdäänkö haluttu toiminto ennen vai jälkeen annetun tapahtuman.

Pääsynvalvonnan mekanismit yleisesti

Pääsynvalvonnalla tarkoitetaan sitä, että vain sellaiset henkilöt joilla on oikeus päästä käsiksi johonkin tietoaineistoon, pääsevät siihen käsiksi ja muut eivät pääse. Pääsynvalvonnan ytimessä on kolme asiaa: henkilö, toiminto ja kohde. Ongelmaksi jää ratkoa, onko kyseisellä henkilöllä oikeus tehdä kyseinen toiminto kyseiselle kohteelle. [3]

Tietojärjestelmissä on erityisen tärkeää, että henkilö voidaan autentikoida eli tunnistaa luotettavasti. Jos henkilöä ei voida tunnistaa, ei järjestelmällä ole mitään keinoa tietää kuka yrittää tehdä haluttua toimintoa, jolloin useimmiten on syytä evätä toiminnon suorittaminen.

Pääsynvalvonnassa on aina tarpeellista, että joku siihen oikeudet omaava on määritellyt, kuka saa tehdä ja mitä.

SQL-kielen tarjoamat työkalut pääsynvalvontaan

SQL tarjoaa pääsynvalvontaa tietokantataulujen tasolla. Autentikointi on kuitenkin suoritettu jo ennen kuin päästään edes käyttämään SQL-kieltä.

SQL sisältää useita erilaisia toimintoja, joita voidaan suorittaa. Näitä ovat mm. INSERT, UPDATE, DELETE, SELECT, joilla voidaan lisätä, päivittää, poistaa tai valita tietoa.

Oikeuksia myönnetään ja evätään komennoilla GRANT ja REVOKE. Syntaksi on GRANT oikeudet ON TABLE taulu TO kayttaja1, kayttaja2. Komennon tarkempi syntaksi vaihtelee hieman riippuen tietokannan hallintajärjestelmässä käytetystä SQL:n murteesta. Periaate on, että perusmuotoinen lause toimii aina, mutta murteilla voidaan tarjota jotain lisäominaisuuksia, joita ei standardissa SQL:ssä ole. PostgreSQL:n GRANT-komentoa käsitellään tarkemmin myöhemmin.[4]

Kohteita SQL:ssä voivat olla kokonaiset tietokantataulut, niistä luodut näkymät, tai vaikkapa vain taulun yksittäinen sarake. Näkymiä voidaan myös käyttää rajoittamaan käyttäjän näkemää tietomäärää esim. siten, että näkymässä on vain kaksi tietokantataulun kolmesta sarakkeesta ja käyttäjälle annetaan oikeudet vain näkymään eikä ollenkaan varsinaiseen tauluun. [4]

PostgreSQL:n tarjoamat työkalut pääsynvalvontaan

Autentikointi

PostgreSQL tarjoaa SQL:n pääsynvalvonnan lisäksi autentikoinnin, jota SQL ei siis tarjoa. PostgreSQL tarjoaa myös mahdollisuuden määritellä, mistä kukin käyttäjä voi ottaa tietokantaan yhteyttä, esim. pääkäyttäjä voi ottaa yhteyden vain paikalliselta koneelta(localhost), mutta tavallinen käyttäjä voisi ottaa yhteyden mistä vain. Yhteyksiä voi myös rajata ip-osoitteen perusteella tulemaan vain tietysti osoiteavaruuksista. [1]

Käyttäjän autentikointia voidaan säätää muokkaamalla pg_hba.conf-tiedostoa(hba=Host Based Authentication). Konfigurointitiedosto muodostuu säännöistä, joita on aina yksi yhdellä rivillä. Seuraavassa taulukossa on esitetty kaikki vaihtoehdot erilaisista säännöistä. Säännöissä esiintyvät avainsanat on merkitty taulukkoon lihavoinnilla ja kaikki muut sanat ovat vain parametrien nimiä. Tarkemmat selitykset säännöissä esiintyvistä avainsanoista ja parametreista löytyy taulukon alta.
local database user

auth-method [auth-option]
host database user CIDR-address
auth-method [auth-option]
hostssl database user CIDR-address
auth-method [auth-option]
hostnossl database user CIDR-address
auth-method [auth-option]
host database user IP-address IP-mask auth-method [auth-option]
hostssl database user IP-address IP-mask auth-method [auth-option]
hostnossl database user IP-address IP-mask auth-method [auth-option]

Avainsanojen merkitykset:
  • local: yhteydenotossa käytetään UNIX-socketteja.
  • host: yhteydenotossa käytetään TCP/IP-protokollaa. Sisältää SSL:ää käyttävät ja käyttämättömät yhteydet.
  • hostssl: yhteydenotossa käytetään TCP/IP-protokollaa ja SSL-salausta.
  • hostnossl: yhteydenotossa käytetään TCP/IP-protokollaa, mutta SSL ei ole sallittu.

Mahdolliset parametrit:
  • database: tietokannan nimi, jota kyseinen sääntö koskee. Voi olla myös all, jolloin koskee kaikkia tietokantoja.
  • user: käyttäjän nimi, jota kyseinen sääntö koskee. Voi olla myös all, jolloin koskee kaikkia käyttäjiä.
  • CIDR-address: ip-osoiteavaruus, josta yhteyden voi ottaa. Osoiteavaruus on annettu muodossa, jossa alku on ip-osoite ja loppu on CIDR-maski. Esim. 172.20.143.89/32 yhdelle osoitteelle ja 172.20.143.0/24 verkolle. Voi käyttää vain, jos yhteysmääre on host, hostssl tai hostnossl.
  • IP-address ja IP-mask: ip-osoite ja aliverkon peite, josta yhteyden saa ottaa. Vaihtoehtoinen notaatio CIDR-osoitteelle. Voi käyttää vain, jos yhteysmääre on host, hostssl tai hostnossl.
  • auth-option: vapaaehtoisia lisämääreitä autentikointiin. Nämä eivät sisällä mitään merkityksellistä.

Auth-method kohtaan on useita eri vaihtoehtoja. Seuraavassa on listattu kaikki vaihtoehdot ja selitetty niiden merkitystä.
  • trust, jolloin kuka tahansa voi kirjautua käyttäjäksi määritetystä osoitteesta ilman minkäänlaisia salasanakyselyjä.
  • reject, trustin täydellinen vastakohta, eli kyseisestä osoitteesta kyseisellä tunnuksella ei milloinkaan voi kirjautua sisään.
  • md5, jolloin asiakas lähettää palvelimelle salasanan md5-tiivisteen.
  • crypt, jolloin asiakas lähettää salasanan tiivisteen palvelimelle ja tiiviste on laskettu crypt()-funktiolla.
  • password, jolloin asiakas lähettää salasanan selväkielisenä.
  • krb5, jolloin käytetään Kerberos V5:ttä autentikoinnissa.
  • pam, jolloin käytetään käyttöjärjestelmän tarjoamaa palvelua Pluggable Authentication Modules (PAM)
  • ident, jolloin käytetään paikallisen käyttöjärjestelmän käyttäjätunnusta tai TCP/IP-yhteyksien tapauksessa ident-palvelinta. Ident:iä käytettäessä pitää myös määrittää ne tietokannan roolit, joilla tietty henkilö voi kirjautua. Tämä voidaan tehdään antamalla parametrina pg_ident.conf-tiedostossa määritellyn kartan nimi, jossa on määritelty millä rooleilla tietty käyttäjä saa kirjautua sisään. Erikoistapauksena on sameuser, jolloin käytetään aina samaa roolia tietokannassa, kuin minkä käyttöjärjestelmä/ident kertoo.
[1]

Edellä esitettyjä varattuja sanoja ja parametreja käyttämällä voidaan rakentaa sääntöjä, joilla säädetään käyttäjän autentikointia. Esimerkiksi jos haluttaisiin sallia paikalliselta koneelta kaikki TCP/IP-yhteydet kaikkin tietokantoihin ilman salasanan tarkistamista ja sallia pääsy osoitteesta 172.168.2.45 käyttäen SSL-salausta käyttäjälle dba kaikkiin tietokantoihin käyttäen crypt()-funktiolla laskettua salasanan tiivistettä, niin se saataisiin aikaan esimerkiksi seuraavanlaisilla riveillä:
host all all 127.0.0.1/32 trust
hostssl all dba 172.168.2.45 255.255.255.255 crypt

Käyttäjien(roolien) hallinta

SQL itsessään tarjoaa jo käyttäjän käsitteen, koska sillä voi myös myöntää käyttöoikeuksia tietyille käyttäjille. PostgreSQL:ssä käytetään kuitenkin rooleja, joka on hieman eri asia kuin SQL:n käyttäjä. [1]

PostgreSQL:n rooleja voi ajatella tietokannan käyttäjinä tai käyttäjien ryhmänä. Roolit voivat omistaa tietokantaobjekteja(esim. taulut, näkymät jne.) ja voivat myöntää niihin oikeuksia muille rooleille. Roolin on myös mahdollista myöntää jäsenyys toiselle roolille omaan rooliinsa. Rooleilla ei ole mitään yhteyttä käyttöjärjestelmän käyttäjiin. Roolit ovat PostgreSQL:n sisällä globaaleja, joten ei ole mahdollista määritellä rooleja, jotka näkyisivät vain käytettäessä tiettyä tietokantaa.

Rooleja luodaan ja poistetaan samantapaisella syntaksilla kuin käyttäjiä SQL:ssä. Lauseella CREATE ROLE nimi voidaan luoda rooli nimeltä "nimi". Rooli voidaan poistaa lauseella DROP ROLE nimi. Roolin luomisen yhteydessä voidaan roolille määritellä erilaisia oikeuksia lisäämällä ne komennon perään. Oikeuksia voidaan muuttaa vielä jälkikäteen komennolla ALTER ROLE nimi oikeudet. Mahdollisia oikeuksia ovat:
  • LOGIN: oikeus tarkoittaa, että roolia voi käyttää tietokantaan otettavissa yhteyksissä. Tällöin rooli vastaa normaalia SQL:n käyttäjää. Jos login oikeutta ei ole, voi rooli käyttää lähinnä ryhmänä muille rooleille.
  • SUPERUSER: oikeus tarkoittaa, että roolilla on kaikki oikeudet tietokantaan ja mitään käyttöoikeustarkistuksia ei tehdä. Roolia, jolla on superuser-oikeus, ei pidä käyttää joka päiväisessä käytössä vaan vain harvoin tehtävissä ylläpitotehtävissä, joissa se on välttämätöntä.
  • CREATEDB: oikeus tarkoittaa, että rooli voi luoda uusia tietokantoja.
  • CREATEROLE: oikeus tarkoittaa, että rooli voi luoda uusia rooleja. Createrole-oikeuden omaava rooli voi myös muuttaa ja poistaa olemassa olevia rooleja ja lisätä ja poistaa rooleja toisiin rooleihin
  • PASSWORD: password ei ole oikeastaan mikään oikeus vaan sillä voidaan määritellä roolille salasana lisäämällä luontilauseen perään PASSWORD 'salasana'. Salasanalla ei ole mitään merkitystä, ellei autentikointiasetuksissa ole käytössä joko password, md5 tai crypt.

Rooleja lisätään ja poistetaan toisiin rooleihin käyttäen GRANT ja REVOKE komentoja. Rooli lisätään rooliin lauseella GRANT ryhmä_rooli TO rooli1, rooli2 ja poistetaan roolista lauseella REVOKE ryhmä_rooli FROM rooli1, rooli2. Ryhmärooleja voidaan käyttää esimerkiksi antamaan käyttöoikeuksia useille rooleille kerralla. [1]

Käyttöoikeuksien hallinta

PostgreSQL:ssä voidaan rooleille myöntää käyttöoikeuksia käyttämällä GRANT-lausetta, kuten standardi SQL:ssäkin. GRANT lauseessa myös kerrotaan kohde, johon annettavat oikeudet ovat. Kohteina voivat olla esimerkiksi taulut, näkymät tai funktio. Kaikkia oikeuksia ei voi myöntää kaikille kohteille. Erilaisia oikeuksia, joita käyttäjille voi antaa ovat:

  • SELECT: antaa roolille oikeuden käyttää SELECT-lausetta(suorittaa kyselyjä).
  • INSERT: antaa roolille oikeuden lisätä rivejä tauluun.
  • UPDATE: antaa roolille oikeuden päivittää taulun tietoja.
  • DELETE: antaa roolille oikeuden poistaa rivejä taulusta.
  • RULE: antaa roolille oikeuden luoda sääntöjä tauluihin tai näkymiin.
  • REFERENCES: antaa roolille oikeuden tehdä vierasavaimissa käytettyjä viittauksia.
  • TRIGGER: antaa roolille oikeuden tehdä liipaisimen kyseiseen tauluun.
  • CREATE: antaa roolille oikeuden luoda schemoja, tietokantaobjekteja, tauluja tai indeksejä riippuen siitä, mihin tietokantaobjektiin oikeus annetaan.
  • TEMPORARY: antaa roolille oikeuden luoda väliaikaisia tauluja komennossa määriteltyyn tietokantaan.
  • EXECUTE: antaa roolille oikeuden käyttää funktiota.
  • USAGE: jos kohteena on kieli, niin roolilla on oikeus käyttää kyseisestä proseduraalista kieltä funktioissa. Jos kohteena on schema, niin usage antaa roolille pääsyn scheman objekteihin.
  • ALL PRIVILEGES: antaa roolille kaikki mahdolliset oikeudet kohteeseen.

Koska funktioita ja liipaisimia suoritetaan tietokannassa erilaisten toimintojen sivutuotteena ovat ne ihanteellisia mekanismeja troijan hevosten toteuttamiseen tietokannan sisällä. Ja koska funktioiden koodia suoritetaan osana tietokantapalvelindemonin prosessia, on koodilla pääsy myös muuhun järjestelmään kuin vain tietokantaan. Siksi PostgreSQL:ssä onkin rajoitettu funktioiden ja liipaisimien toteutuksessa käytettyjä kieliä. Jos kielessä on mahdollista tehdä tarkistamattomia muistiviittauksia, niin silloin ainoastaan superuser oikeuden omaava rooli voi luoda kyseisellä kielellä kirjoitettuja funktioita ja liipaisimia. [1]

Johtopäätökset ja yhteenveto

PostgreSQL tarjoaa monipuoliset mahdollisuudet pääsynvalvontaan ja sillä voidaan toteuttaa turvallisia tietokantajärjestelmiä. Toisaalta väärillä asetuksilla järjestelmä voi myös olla tietoturvaltaan täysin ala-arvoinen esimerkiksi jos käytön helpottamiseksi on määritelty, että tietyltä käyttäjältä ei kysytä koskaan salasanaa tämän ottaessa yhteyttä tietokantaan.

Käyttöoikeuksia voidaan määritellä monipuolisesti, mutta turvallisen järjestelmän aikaansaamiseksi pitää sopivien asetuksien määrittelyyn uhrata aikaa. Turvallisen järjestelmän asetuksien määrittelyssä olisikin suositeltavaa käyttää periaatetta, jossa ensin kielletään kaikki ja sen jälkeen myönnetään vain tarvittavat oikeudet.

Lähteet

Print version |  PDF  | History: r3 < r2 < r1 | 
Topic revision: r3 - 16 Nov 2009 - 17:49:28 - JenniOEhman?
 

TUTWiki

Copyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TUTWiki? Send feedback