autentifikacija u linux...

Download AUTENTIFIKACIJA U LINUX OKRUŽENJUsigurnost.zemris.fer.hr/protokoli/2003_njers/diplomski/njers... · jedan od argumenata pam_start funkcije je pokazivac na pam_conv strukturu. Autentifikacija

If you can't read please download the document

Upload: vanminh

Post on 06-Feb-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

  • SVEUCILITE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RACUNARSTVA

    DIPLOMSKI RAD br. 1549

    AUTENTIFIKACIJA U LINUX OKRUENJU

    Draen Njer

    Zagreb, rujan 2005.

  • SADRAJ 1. Uvod ..................................................................................................................................... 1

    2. Standardna Linux autentifikacija ............................................................................................ 2 2.1 Datoteka /etc/passwd ...................................................................................................... 2 2.2 Datoteka /etc/shaddow .................................................................................................... 4

    3. PAM ( Pluggable Authentication Modulle) autentifikacijski mehanizam................................... 5 3.1 Osnovne karakteristike PAM infrastrukture ...................................................................... 5 3.2 PAM biblioteka .............................................................................................................. 5 3.3 Aplikacija koja podrava primjenu PAM modula............................................................... 6 3.4 PAM moduli..................................................................................................................... 9

    3.4.1 Osnovna podjela i karakteristike pojedinih tipova PAM modula ................................. 9 3.4.2 Autentifikacijski modul ............................................................................................ 11

    3.5. PAM konfiguracijska datoteka...................................................................................... 13 3.5.1 Tipovi konfiguracijskih datoteka.............................................................................. 13 3.5.2 Osnovni argumenti PAM modula ............................................................................ 14 3.5.3 Specificni argumenti SRP modula.......................................................................... 15 3.5.4 Primjer konfiguracijske datoteke ............................................................................ 15

    4. SRP (Secure Remote Password) Protokol ........................................................................... 17 4.1 Uvod ............................................................................................................................. 17 4.2 Opis protokola............................................................................................................... 17 4.3 Sigurnosna svojstva SRP protokola............................................................................... 19 4.4 Proirenje SRP protokola .............................................................................................. 20 4.5 Optimizacija SRP protokola ........................................................................................... 21 4.6 Sigurnosni zahtjevi koje parametri moraju ispunjavati .................................................... 22

    5. Ostvarenje PAM SRP modula.............................................................................................. 23 5.1 Analiza rada PAM SRP modula ..................................................................................... 23 5.2 Strukture podataka koritene u implementaciji SRP modula........................................... 42 5.3 Primjenjeni algoritmi ...................................................................................................... 46

    5.3.1 Sha1 (Secure Hash Algorithm) ............................................................................... 46 5.3.2 Hmac ..................................................................................................................... 47 5.3.3 Linerano kongruentan generator slucajnih brojeva.................................................. 48 5.3.4 Pseudo generator slucajnih brojeva utemeljen na HMAC algoritmu....................... 49

    5.4 Instalacija PAM SRP modula........................................................................................ 50 5.5 Instalacija SRP posluitelja........................................................................................... 52

    6. Programski sustav koji demonstrira primjenu PAM SRP modula .......................................... 53 6.1 Opis aplikacije............................................................................................................... 53 6.2 Instalacija aplikacije....................................................................................................... 54 6.3 Konfiguracija aplikacije.................................................................................................. 55 6.4 Primjer koritenja aplikacije ........................................................................................... 56

    7. Analiza rjeenja................................................................................................................... 59

    8. Zakljucak............................................................................................................................. 60

    Literatura................................................................................................................................. 61

  • 1

    1. Uvod Od same pojave racunala, uslunih i poslovnih programskih paketa, korisnici paketa su teili da aplikacija koju koriste bude jednostavna za koritenje, modularna, jednostavna za odravanje i lako nadogradiva. Svaki nedostatak ispunjenja nekog od zahtjeva znacio je ulaganje dodatnih sredstava bilo za kupovinu nove inacice programskog paketa ili usluge odravanja aplikacija. Tijekom godina kako su racunala evoluirala, pitanje sigurnosti, sigurnosnih protokola sve je vie dolazilo do izraaja. Protokoli i pojedine implementacije pokazale su slabosti i propuste kako u ideji, tako i u realizaciji. Sigurnosni problemi protokola uzeli su maha i na aplikacijama koje protokole koriste. Korisnici su mogli birati izmedu koritenja nesigurne stare aplikacije ili nove verzije aplikacije koja koristi drugi siguran sigurnosni protokol. U dananje vrijeme racunalna sigurnost je bitna komponenta svakog racunalnog sustava. Sigurnost je prisutna u svim fazama razvoja programa, od projektiranja pa do implementacije. Uobicajena je praksa osigurati sustav kroz vie nivoa, implementirajuci odgovarajucu zatitu na svakom nivou. Autentifikacija je proces provjere da li je korisnik uistinu onaj za kojeg se izdaje. Korisnik moe biti osoba ili pak program, odnosno proces. Autentifikacija korisnika jedan je od osnovnih zahtjeva koje siguran sustav ispunjava. Razvojem open source zajednice vecina autentifikacijskih protokola dostupna je svima na uvid. Osnovne karakteristike autentifikacijskih protokola su dobre performanse, robusnost, otpornost na razne napade. Sigurnost svakog autentifikacijskog mehanizma je relativna, jer uvelike ovisi o vremenu kada se protokol koristi, tj. stanju razvoja tehnologije odnosno racunarstva. Autentifikacija je prisutna u ivotu vecine korisnika racunala, neovisno o platformi koju koriste. Neki od autentifikacijskih protokola su PAP, CHAP, Kerberos, S/Key, One time password, Sesame, SRP i ostali. Korisnik se autentificira na temelju onoga to je (biometrijski podaci), onoga to zna (zaporka), odnosno posjeduje ( uredaj koji sadri ili generira tajnu informaciju). Aplikacije koje zahtijevaju autentifikaciju korisnika su ovisne o koritenom autentifikacijskom protokolu, te sigurnosni propust u ideji protokola, odnosno implementaciji znaci pisanje nove verzije aplikacije. Koritenje nekog drugog autentifikacijskog protokola nije moguce, bez vecih izmjena izvornog programa aplikacije.

  • 2

    2. Standardna Linux autentifikacija

    2.1 Datoteka /etc/passwd

    Operacijski sustav Linux kao osnovni autentifikacijski mehanizam koristi zaporke. Zaporke su nizovi znakova specificni za pojedinog korisnika, namijenjeni potvrdi korisnikova identiteta. Neki od osnovnih kriterija pri izboru zaporke su: koritenje najmanje 8 znakova upotreba numerickih i alfanumerickih znakova uporaba malih i velikih slova upotreba specijalnih znakova spajanje dviju rijeci koje ne koreliraju, te smracivanje dobivenog niza

    znakova na dogovorenu velicinu uvijek izbrati lako pamtive zaporke Kreiranjem korisnickog racuna definira se i vrijeme validnosti zaporke. Promjena zaporke u predvidenom vremenu pridonosi sigurnosti sustava. Informacije o korisniku nalaze se u /etc/passwd datoteci. Zapis /etc/passwd datoteke sadri: korisnicko ime; ifrirana zaporka; uid, jedinstveni identifikacijski broj korisnika; guid, jedinstveni identifikacijski broj grupe korisnika kojoj korisnik pripada; komentar koji obicno sadri korisnikovo pravo ime; pocetni direktorij; osnovna ljuska kojom se korisnik slui , npr. bash, csh itd; Korisnicko ime je niz znakova kojim sustav identificira korisnika. Drugi parametar zapisa je ifrirana zaporka. Iako se ustalio ovaj naziv, /etc/passwd datoteka ne sadri doslovno ifriranu zaporku, vec rezultat crypt funkcije koja korisnikovu zaporku koristi kao kljuc enkripcije. Tijekom godina razvile su se dvije varijante crypt algoritma. Prva varijanta crypt algoritma varijacija je DES algoritma, dok se druga zasniva na primjeni MD5 algoritma. Prema osnovnim postavkama /etc/passwd datoteka dostupna je svim korisnicima za citanje. Iako su zaporke kriptirane, poznavanje algoritma kriptiranja, vece kolicine kriptirane informacije, te mnogi programi namijenjeni razbijanju zaporki smanjuju stupanj sigurnosti sustava. Primjer programa za razbijanje zaporki je Cracker Jack. Cracker Jack koristi rjecnik datoteku, duine par tisuca rijeci , te za svaku rijec iz rjecnika generira enkriptiran tekst i usporeduje sa zapisom /etc/passwd datoteke.

  • 3

    U slucaju podudaranja generiranog enkriptiranog teksta i sadraja /etc/passwd datoteke, korisnicka zaporka je rijec ciji enkriptiran oblik je posljednji testiran.

  • 4

    2.2 Datoteka /etc/shaddow

    Problem napada koritenjem rjecnika rijeen je premjetanjem enkriptirane zaporke u /etc/shaddow datoteku. Prema osnovnim postavkama shadow datoteci moe pristupiti samo root korisnik. Uporaba /etc/shadow datoteke uzrokovala je promjene u formatu zapisa /etc/passwd datoteke. Zapis sada na mjestu zaporke u /etc/passwd datoteci sadri znak x. Zapis shaddow datoteke sadri: korisnicko ime informaciju o periodu valjanosti zaporke Razdvajanje informacija omogucilo je da sve aplikacije slobodno pristupaju /etc/passwd datoteci, te dohvacaju sve informacije o korisniku osim enkriptirane zaporke. Ukoliko aplikacija zahtjeva korisnikovu zaporku, ona mora imati pravo pristupa /etc/shaddow/ datoteci. To znaci da aplikacija mora imati root ovlasti, bar na trenutak. Svaka aplikacija koja zahtjeva autentifikaciju korisnika, osim poslovne logike, mora implementirati specificnu autentifikacijsku metodu.Ovakav nacin razmiljanja od razvojnog programera zahtjeva da osim znanja iz podrucja primjene aplikacije, dobro poznaje sigurnosne protokole i mehanizme. Sunsoft je u kolovozu 1995 izdao specifikaciju PAM infrastructure, definiranu u rfc86 dokumentu. PAM specifikacija istice vanost autentifikacijskih paketa za sigurnost sustava, te donosi ideju o razdvajanju poslovne i autentifikacijske logike.

  • 5

    3. PAM ( Pluggable Authentication Modulle) autentifikacijski mehanizam

    3.1 Osnovne karakteristike PAM infrastrukture PAM infrastruktura omogucila je: definiranje jedinstvenog nacina autentifikacije korisnika na razini racunala; konfiguriranje autentifikacijskog mehanizma na razini aplikacije (S/Key

    autentifikacija za telnet pristup korisnika, a UNIX /etc/passwd za login ) ; mogucnost da aplikacija koristi vie autentifikacijskih protokola, slaganje

    protokola na stog; funkcionalnu nezavisnost aplikacija o modulima koje koriste;

    PAM infrastrukturu cine slijedece komponente:

    PAM biblioteka PAM svjesna aplikacija PAM moduli PAM konfiguracijska datoteka

    Slika 3.1.1 PAM infrastruktura

    3.2 PAM biblioteka PAM biblioteka centralna je komponenta PAM infrastrukture koja povezuje ostale komponente PAM infrastrukture u kompaktnu cjelinu. PAM biblioteka cita konfiguracijsku datoteku, ucitava i izvrava specificirane module, te omogucuje komunikaciju aplikacije i modula. Osim spomenutih funkcija PAM biblioteka prua sucelje za razvijanje modula i PAM svjesnih aplikacija.

  • 6

    3.3 Aplikacija koja podrava primjenu PAM modula

    Podjela aplikacija prema sposobnosti rada s PAM modulima je na aplikacije koje podravaju PAM module i aplikacije koji ih ne podravaju. Konverzija aplikacije u PAM kompatibilnu je moguca, ali ne uvijek. Ukoliko programer ima pristup izvornom kodu aplikacije, aplikaciju je moguce izmjeniti i uciniti je kompatibilnom za primjenu PAM modula. Ukoliko programer ima samo izvrnu datoteku aplikacije, postupak pretvorbe nije moguc. Jedan od nacina kako utvrditi da li aplikacija PAM kompatibilna je pozivom sistemske naredbe ldd . Naredba ldd vraca popis biblioteka funkcija o kojima je aplikacija ovisna:

    linux:/home/gronker/dipl/ap # ldd app_simple libpam.so.0 => /lib/libpam.so.0 (0x40035000) libdl.so.2 => /lib/libdl.so.2 (0x4003d000) libc.so.6 => /lib/i686/libc.so.6 (0x40040000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) linux:/home/gronker/dipl/ap #

    Slika 3.3.1 Ispis rezultata ldd naredbe Ukoliko popis biblioteka sadri libpam ili libmiscpam, aplikacija podrava primjenu PAM modula. Kako bi tocno utvrdili da li aplikacija uistinu radi kako treba potrebno je kreirati konfiguracijsku datoteku u /etc/pam.d/ direktoriju, te pokrenuti aplikaciju. Uobicajena je praksa da konfiguracijska datoteka nosi isto ime kao i aplikacija koja ju koristi. Potpuno neovisna o modulu koji trenutno koristi. Komunikacija s modulima ostvaruje se preko funkcije za razgovor (conversation function). Deklaracija funkcije za razgovor prikazana je na slici 3.3.2 :

    int (*conv)(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr);

    Slika 3.3.2 Deklaracije funkcije za razgovor

    Tablica 3.3.1. Parametri funkcije za razgovor

  • 7

    Parametar Znacenje

    int num_msg Broj poruka

    const struct pam_message **msg Poruke koje modul alje aplikaciji, svaki element polja odgovara jednoj poruci

    struct pam_response **resp Odgovori aplikacije na upite modula

    void *appdata_ptr Dodatne informacije koje modul alje aplikaciji

    Aplikacija definira funkciju za razgovor, incijalizira pam_conv strukturu koja sadri pokazivac na definiranu funkciju.

    struct pam_conv { int (*conv)(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); void *appdata_ptr; };

    Slika 3.3.2. pam_conv struktura

    Inicijalizacija PAM okoline postie se pozivom pam_start funkcije pri cemu jedan od argumenata pam_start funkcije je pokazivac na pam_conv strukturu. Autentifikacija je ostvarena interakcijom sa PAM bibliotekom putem sucelja koje PAM biblioteka definira. Format poruke koju modul alje aplikaciji prikazan je na slici 3.3.3.

    struct pam_message { int msg_style; const char *msg;

    }

    Slika 3.3.3 Definicija pam_message structure

  • 8

    Parametar msg_style moe imati 4 vrijednosti:

    PAM_PROMPT_ECHO_OFF PAM_PROMPT_ECHO_ON PAM_ERROR_MSG PAM_TEXT_INFO

    PAM_PROMPT_ECHO_OFF vrijednost upotrebljava se u situacijama u kojima se od korisnika zahtjeva da unese podatke, a da pri tome podaci koje je unio ne budu vidljivi prostim okom. PAM_PROMPT_ECHO_ON vrijednost namijenjena je situacijama u kojima su podaci koje korisnik unosi vidljivi na zaslonu. PAM_ERROR_MSG koristi se ukoliko je potrebno ispisati poruku o pogrjeci. PAM_TEXT_INFO namijenjen je ispisu obicnog teksta bez nekog posebnog znacenja. Parametar msg sadri poruku modula aplikaciji. Komunikacija izmedu modula i aplikacije je dvosmjerna i sinkrona. Komunikacija mora biti dvosmjerna kako bi aplikacija mogla odgovoriti na upite koje modul alje. Komunikacija je sinkrona, jer tek nakon to aplikacija pribavi sve informacije koje modul od nje zahtjeva , prikupljene informacije se alju modulu. Povratna informacija enkapsulirana je u pam_response strukturu. Slika 3.3.4 prikazuje definiciju pam_response strukture.

    struct pam_response{ char *resp; int resp_code; };

    Slika 3.3.4. Definicija pam_response strukture Parametar resp_code nema posebnu namjenu i ima vrijednost 0. Izvorna poruka aplikacije modulu sadrana je u parametru resp.

  • 9

    3.4 PAM moduli

    3.4.1 Osnovna podjela i karakteristike pojedinih tipova PAM modula

    PAM modul je komponenta koja implementira autentifikacijsku logiku. Iako sam naziv (Pluggable authentication module) govori da je rijec o autentifikacijskom modulu, mogucnosti primjene su ire. Ovisno o funkcijama koje implementiraju, moduli su podijeljeni na: autentifikacijske module (eng. authentication modul); module za upravljanje korisnickim racunima (eng. account modul); module za upravljanje zaporkama korisnika ( eng. password modul); sjednicke module ( eng. session modul); Funkcija autentifikacijskog modula je osigurati autentifikaciju korisnika. Modul za upravljanje korisnickim racunima zaduen je za verifikaciju korisnickih racuna; kontrolu pristupa korisnika resursima ovisno o grupi kojoj korisnik pripada, vremenu kada pristupa ili IP adresi s koje pristupa. Modul koji upravlja korisnickim racunima mora implementirati funkciju PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) unutar koje obavlja neke od prethodno spomenutih provjera. Funkcija se poziva nakon to je korisnik autentificiran. Informacija o dozvoli pristupa pohranjena je u povratnoj vrijednosti pam_sm_acct_mgmt funkcije. Svaka druga vrijednost osim PAM_SUCCESS oznacava zabranu pristupa. Modul za upravljanje zaporkama korisnika kreira, aurira i kontrolira korisnicke zaporke. PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv) je funkcija koju svaki modul za upravljanje zaporkama mora implementirati. Ovisno o vrijednostima parametra flags modul aurira zaporke nakon isteka perioda valjanosti zaporki, odnosno ukoliko su svi uvjeti za auriranje ispunjeni (npr. stara zaporka mora biti poznata). Sjednicki modul izvrava dvije skupine operacija. Prvu grupu cine operacije koje je potrebno obaviti prilikom prijavljivanja korisnika na racunalo. Skup operacija ide od izvravanja inicijalizacijskih skripti, kreiranje logova, podizanja pocetnog direktorija, ili postavljanje ogranicenja na dostupne resurse. Drugu grupu cine operacije koje se izvode prije svretka sjednice. PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) funkcija se poziva prilikom uspostavljanja sjednice..

  • 10

    PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) funkcija poziva se prije svretka sjednice . PAM_SUCCESS signalizira uspjeno izvodenje gornjih funkcija. Tablica 3.4.1.1 prikazuje neke osnovne PAM module, dostupne u vecini Linux distribucija i njihovu namjenu.

    Tablica 3.4.1.1. Standardni PAM moduli

    Modul Funkcija

    pam_unix Modul prua tradicionalnu unix autentifikaciju korisnika, upravljanje zaporkama i kontrolu korisnickih racuna

    pam_cracklib Provjera sigurnosti i kompleksnosti zaporke

    pam_env Omogucava postavljanje varijabli okoline

    pam_pwdb Funkcija identicna modulu pam_unix, razlika je da pam_pwdb kao datoteku korisnika koristi datoteku libpwd

    pam_access Kontrola pristupa na osnovu imena, racunala, IP adrese, terminala.

    pam_securetty Root se moe prijaviti samo s odredenog terminala

    pam_time Kontrola pristupa ovisno o vremenu pam_warn Biljei informacije o svakom

    pokuaju autentifikacije, odnosno o promjeni zaporke.

    pam_deny Sprjecava pristup aplikaciji Osim obaveznih funkcija koje mora implementirati, modul moe ponuditi trivijalnu definiciju funkcija ostalih tipova modula. U tom slucaju te ostale funkcije vracaju PAM_SERVICE_ERROR kao signal da je u konfiguracijskoj datoteci aplikacije uz ime modula specificiran krivi tip modula. Modul mora biti funkcijski neovisan o ostalim modulima te moci izvriti svoju funkciju neovisno o modulima pozvanim prije njega. PAM SRP modul primjer je autentifikacijskog modula.

  • 11

    3.4.2 Autentifikacijski modul Autentifikacijski modul mora implementirati pam_sm_authenticate i pam_sm_setcred funkcije. Opis svake od spomenutih funkcija dan je u nastavku. Nisu definirana nikakva pravila koja specificiraju koje je protokole moguce ostvariti, a koje ne. Funkcija PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, char *argv[]) obavlja autentifikaciju korisnika. Funkcija pam_sm_authenticate vraca PAM_SUCCESS ukoliko je autentifikacija bila uspjena. Tablica 3.4.2.1 prikazuje ostale moguce povratne vrijednosti koje simboliziraju pogrjeku kao i razloge nastanka pogrjeke.

    Tablica 3.4.2.1. Povratne vrijednosti pam_sm_authenticate funkcije Povratna vrijednost znacenje

    PAM_AUTH_ERR Korisnik nije autentificiran

    PAM_CRED_INSUFFICIENT Nedovoljno informacija za autentifikaciju korisnika

    PAM_AUTHINFO_UNAVAIL Modul nema pristup autentifikacijskoj informaciji, bilo zbog problema s mrezom ili sklopovljem

    PAM_USER_UNKNOWN Korisnik ne postoji

    PAM_MAXTRIES Maksimalan broj neuspjenih autentifikacija korisnika

    Parametar flags moe imati jednu vrijednost i to je PAM_DISALLOW_NULL_AUTHTOK. Ukoliko je flags postavljen, autentifikacija korisnika bez zaporke nije moguca. U suprotnom korisnik se autentificira tako da unese korisnicko ime. Parametri argv, argc, odnose se na argumente koji se predaju modulu preko konfiguracijske datoteke aplikacije koja modul koristi. PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, char *argv[]) funkcija slui kao izvor informacija o korisniku. Poziva se nakon to je korisnik autentificiran.

  • 12

    Tablica 3.4.2.2. Parametar zastavice

    Tip zastavice znacenje

    PAM_ESTABLISH_CRED Auriraj informacije o korisniku

    PAM_DELETE_CRED Obrii korisnicke informacije

    PAM_REINITIALIZE_CRED Reinicijaliziraj informacije o korisniku

    PAM_REFRESH_CRED Produi vrijeme valjanosti informacija o korisniku

    Povratne vrijednosti pam_sm_setcred funkcije dane su u tablici 3.4.2.3.

    Tablica 3.4.2.3. Povratne vrijednosti

    Povratna vrijednost Znacenje

    PAM_SUCCESS Auriranje uspjeno

    PAM_CRED_UNAVAIL Modul ne moe pristupiti korisnikovim tajnim informacijama

    PAM_CRED_EXPIRED Proao rok valjanosti tajnih informacija

    PAM_USER_UNKNOWN Korisnik ne postoji

    PAM_CRED_ERROR Modul nije postavio tajne informacije o korisniku

  • 13

    3.5. PAM konfiguracijska datoteka

    3.5.1 Tipovi konfiguracijskih datoteka Konfiguracijska datoteka kontrolira i specificira koje module ce pojedina aplikacija koristiti. Konfiguracija se moe obaviti na dva nacina. Prvi nacin je koritenjem /etc/pam.conf datoteke koja sadri zapise oblika: { }.

    app_simple auth required /lib/security/newpam.so debug

    Slika 3.5.1. Zapis /etc/pam.conf datoteke

    Drugi nacin je uporaba datoteke koja nosi ime aplikacije, a smjetena je u /etc/pam.d direktoriju. Takva datoteka sadri zapis oblika: { }.

    auth required /lib/security/newpam.so debug

    Slika 3.5.2. Zapis /etc/pam.d/app_simple datoteke

    Ukoliko je aplikacija konfigurirana na oba nacina, prevladava posljednji oblik konfiguracije. Tipovi modula su: auth, session, passwd i account. Namjena pojedinog tipa modula objanjena je u odjeljku 3.4.1. Definirane su 4 kontrolne zastavice : required, requisite, sufficient i optional. Funkcija pojedine kontrolne zastavice objanjena je u tablici 3.5.1.1 .

  • 14

    Tablica 3.5.1.1 Kontrolne zastavice

    Zastavica Znacenje

    required oznacava da za eventualan uspjeh ostalih modula koje aplikacija poziva, modul oznacen ovom zastavicom mora uspjeti. Ukoliko se to pak ne dogodi, pozivaju se ostali moduli, ali cjelokupan je rezultat neuspjeh.

    requisite oznacava da modul mora uspjeti inace rezultat je ukupan neuspjeh i ostali moduli se nece pozivati.

    sufficient kae da ukoliko je sufficient modul proao kao i svi required moduli, ukupan rezultat je prolaz i slijedeci required moduli se ne pozivaju.

    optional oznacava modul koji nije kritican za konacan uspjeh, odnosno neuspjeh koritenja aplikacije.

    Lokacija modula oznacava put do modula, odnosno smjetaj na datotecnom sustavu. Argumenti su dodatni ulazni parametri koji kontroliraju ukupnu funkcionalnost i ponaanje modula. U nastavku su navedeni neki osnovni argumenti koje vecina modula podrava.

    3.5.2 Osnovni argumenti PAM modula Debug argument ako postavljen omogucava da se informacija o stanju modula, eventualnim pogrjekama u radu modula zapie na za to predvidenu lokaciju. Jedan od nacina evidentiranja stanja je uporaba syslog sistemskog poziva. Ukoliko je syslog.conf (konfiguracijska datoteka syslogd procesa) datoteka zadrala pocetne postavke, prikupljene informacije se zapisuju u /var/log/messages datoteku. No_warn argument ako postavljen onemogucava prosljedivanje upozorenja, odnosno poruka aplikaciji o nastalim pogrjekama u radu modula. Use_first_pass argument omogucava autentifikaciju korisnika putem zaporke pohranjene u PAM okolini , a koju je korisnik unio na zahtjev prethodno izvrenog modula. Try_first_pas argument ima istu funkciju kao use_first_pass argument. Razliku

  • 15

    cini mogucnost korisnika da sam unese zaporku, ukoliko autentifikacija s vec postojecom lozinkom nije uspjela. Expose_account opcija cini aplikaciji dostupnim neke dodatne informacije o korisniku. Prema specifikacijama SRP protokola osim pohranjenih saetaka zaporki korisnika, korisnickog imena i salt vrijednosti, dodatnih informacija o korisnicima nema, stoga nema ni potrebe za izlaganjem informacija. Use mapped pass argument ako podran omogucava autentifikaciju korisnika posebnom lozinkom koja je u kriptiranom obliku pohranjena u PAM okolini. Prilikom izvodenja modula, zaporku je potrebno dekriptirati. Kako bi dekripcija bila moguca potrebno je poznavati kljuc. Korisnik unosi primarnu zaporku,tj. kljuc. Unesena zaporka predstavlja kljuc kojim se dekriptira korisnicka zaporka pohranjena u PAM okolini. Kriptirana korisnicka zaporka unaprijed je spremljena na odredenu lokaciju, a modul je mora dohvatiti i dekriptirati kako bi je dobio u izvornom obliku. Lokacija na kojoj se kriptirana zaporka nalazi mora biti sigurna. Dodatan problem je auriranje korisnicke zaporke, jer prilikom auriranja primarne zaporke, potrebno je ponovo kriptirati korisnicke zaporke koje koriste svi ostali moduli koji podravaju preslikavanje. U slucaju pogrjeke prilikom rada s mapiranim zaporkama ili ako modul ne podrava mapiranje zaporki, korisnik je ponudena opcija da sam unese korisnicku zaporku u jasnom obliku.

    3.5.3 Specificni argumenti SRP modula pass_file argument ima jednostavnu funkciju, a to je da prethodi imenu baze korisnika neke aplikacije. Ime baze korisnika cini modul fleksibilnijim i omogucava mu rad s vie aplikacija istovremeno.

    3.5.4 Primjer konfiguracijske datoteke Svaki sustav, aplikacija koja ima iole zahtjeva za sigurnocu definira sigurnosnu politiku. Sigurnosna politika izmedu ostalog definira tko, kada, odakle ima pravo pristupa resursima. Sigurnosna politika aplikacije koja podrava PAM module implementira se kroz konfiguracijsku datoteku aplikacije. U nastavku je prikazano par konfiguracijskih datoteka.

  • 16

    Slika 3.5.4.1. Primjer konfiguracijske datoteke

    Moduli se pozivaju prema redoslijedu kako su navedeni u konfiguracijskoj datoteci. Prvo se izvodi modul pam_securetty koji provjerava da li se terminal s kojeg se korisnik pokuava logirati nalazi u konfiguracijsku datoteku /etc/securetty. Ukoliko se ne nalazi, korisnik ne moe pristupiti sustavu preko terminala koji trenutno koristi. Buduci je modul oznacen kao required njegov neuspjeh znaci opci neuspjeh, ali i pozivanje svih ostalih modula navedenih iza njega. Nakon pam_securetty modula izvodi se pam_env modul cija funkcija je da incijalizira varijable okoline na vrijednosti specificirane u /etc/security/pam_env.conf datoteci. Pam_ldap modul zahtjeva od korisnika da unese zaporku, koju modul usporeduje s ldap bazom korisnika. Pam_ldap modul oznacen je kao sufficient to znaci da ukoliko su svi required moduli uspjeno izvreni, uspjeh ovog modula znaci opci uspjeh neovisno o ostalim modulima koji se pozivaju nakon njega. Neuspjeh pam_ldap modula, korisnik nije autentificiran u ldap bazi ne znaci opci neuspjeh. Nakon ldap_modula poziva se pam_unix modul. Uz pam_unix modul nalazi se argument try_first_pass koji oznacava da pam_unix modul od korisnika nece zahtijevati da unese zaporku, vec ce upotrijebiti zaporku koju je korisnik unio na zahtjev prethodnog modula (u ovom slucaju modula pam_ldap). Postoji mogucnost da administrator sustava namjerno ili slucajno zaboravi kreirati konfiguracijsku datoteku aplikacije. Svaka aplikacija koja nema konfiguracijsku datoteku koristi other datoteku.

    Slika 3.5.4.2. Primjer other konfiguracijske datoteke

    Other datoteka na slici 3.5.4.2 koristi samo jedan modul,modul pam_deny. Pam_deny ima samo jednu funkciju, a to je da na svaki zahtjev odgovori negativno, to znaci da nitko nema pristup aplikaciji koja nema vlastitu konfiguracijsku datoteku. Koritenje ovakve sigurnosne politike moe izazvati probleme, onemoguciti korisnika da se logira ukoliko login aplikacija koristi pam module, a nema vlastitu konfiguracijsku datoteku.

  • 17

    4. SRP (Secure Remote Password) Protokol

    4.1 Uvod Secure Remote Password je sigurnosni protokol namijenjen autentifikaciji korisnika i razmjeni kljuceva izmedu dviju strana. Tajni kljuc s dobrim kriptografskim svojstvima, nusprodukt je autentifikacije korisnika. SRP protokol namijenjen je sredinama u kojima nema povjerljive trece strane, a napadac poznaje algoritam koji protokol koristi; ima pristup rjecniku najcece upotrebljavanih zaporki; moe pratiti promet, moe generirati, mijenjati i lairati poruke. Ideja o autentifikacijskom protokolu koji ce raditi u nepovjerljivim sredinama javila se na USENET-u krajem 1996. godine. 1997. godine ideja je proirena sigurnosnim zahtjevima koje takav protokol mora ispunjavati. Prva verzija SRP protokola, poznata kao SRP-3 javila se 1998. godine . Trenutno je aktualna verzija SRP-6 koja je zadrala sigurnosna svojstva verzije SRP-3, ali povecala fleksibilnost protokola. SRP protokol se temelji na klijent/posluitelj arhitekturi. U nastavku je dan opis protokola.

    4.2 Opis protokola Korisnik pokrece SRP klijent program i unosi korisnicko ime. Klijent Posluitelj ---------- ------------ U = -->

    v = < password verifier > b = random()

  • 18

    Klijent generira slucajan broj a, te pomocu unaprijed dogovorenih vrijednosti za g i N generira broj A koji alje posluitelju. Nakon to posluitelj primi broj A, te utvrdi da je A razlicit od 0, posluitelj dohvaca pohranjeni saetak zaporke korisnika koji se prethodno identificirao, a zatim generira slucajni broj b, te racuna vrijednost B. Dobiveni broj B alje se klijentu.

    p = x = SHA(s | SHA(U | ":" | p))

    Nakon to klijent primi B, te provjeri da B nije 0, klijent od korisnika zahtjeva da unese zaporku. zaporka, salt, korisnicko ime potrebni su za generiranje vrijednosti x.

    S = (B - g^x) ^ (a + u * x) % N S = (A * v^u) ^ b % N K = SHA_Interleave(S) K = SHA_Interleave(S)

    Klijent i posluitelj dolaze do vrijednosti S, koja ce posluiti za generiranje sjednickog kljuca (session key). Sjednicki kljuc dobije se primjenom SHA_interleave funkcije na vrijednost parametra S. M = H(H(N) XOR H(g) | H(U) | s | A | B | K) -->

  • 19

    4.3 Sigurnosna svojstva SRP protokola Sa stajalita sigurnosti, SRP protokol pretpostavlja primjenu u nesigurnoj sredini. Kako bi sprijecio da se zaporka otkrije prilikom prijenosa izmedu klijenta i posluitelja, zaporka se uopce ne prenosi. zaporka se koristi samo na klijent strani za generiranje parametra x. Drugi faktor cini kljuc K koji se generira tijekom autentifikacije. Generirani kljuc moe se koristiti za ifriranje prometa izmedu klijenta i posluitelja. Pomocu dobivenog kljuca i npr. 3des algoritma za ifriranje podataka moguce je uspostaviti sigurnu vezu izmedu klijenta i posluitelja. Sigurna veza nudi mogucnost auriranja korisnicke zaporke ili cak kreiranja novog korisnika ( ukoliko je korisnik administrator ). Sljedeca svojstva SRP protokola cine ga relativno sigurnim i robusnim: 1. Prilikom uspostave sjedinice ne otkrivaju se nikakve informacije o lozinci,

    odnosno privatnom kljucu x. 2. Prislukivanje ne daje nikakve korisne informacije o parametru K, jer K je

    funkcija i parametara koji se ne prenose. 3. U slucaju da napadac kreira vlastite poruke a zatim impersonira drugog

    korisnika protokol je u stanju to otkriti i sprijeciti otjecanje informacija o posluitelju i zaporkama.

    4. Ukoliko napadac i uspije doci do datoteke s zaporkama biti ce mu potrebno odredeno vrijeme kako bi uspjeno realizirao napad rjecnika i doao do zaporke.

    5. Ukoliko je sjednicki kljuc neke od prolih sjednica ugroen, tj. napadac zna njegovu vrijednost, to mu ne pomae u otkrivanju korisnikove zaporke.

    6. Poznavanje korisnikove zaporke ne omogucava dekriptiranje poruka nekih prolih sjednica.

  • 20

    4.4 Proirenje SRP protokola PAM modul koji doslovno implementira SRP protokol ima ogranicenu primjenu. Konkretno broj aplikacija ( s razlicitim bazama korisnika) koje ga neovisno jedna drugoj mogu upotrebljavati je jedan. Zakljucak proizlazi iz pretpostavke da korisnik koji koristi jednu aplikaciju, ne mora koristiti i drugu, to implicira da svaka aplikacija mora imati svoju bazu korisnika. Kako bi modul bio to fleksibilniji, te omogucio da ga koristi mnotvo aplikacija odjednom, ovaj PAM modul alje jednu poruku posluitelju vie u odnosu na SRP specifikaciju. Poruka sadri ime datoteke koja cini bazu korisnika. Ime datoteke se ne alje u citljivom obliku, vec kao SHA1 saetak imena datoteke. Klijent Posluitelj =getargs() hpass=HASH() ----> =getpassFile(hpass) Ime datoteke s zaporkama korisnika predaje se prilikom konfiguriranja aplikacije koja koristi PAM module. Ukoliko svaka aplikacija ima zasebnu konfiguracijsku datoteku, zapis konfiguracijske datoteke aplikacije koja koristi modul je {auth pass_file }. Posluitelj je implementiran tako da parametar SRP_PASS pokazuje na ime datoteke, koja sadri zapise oblika {

  • 21

    datoteke>}. Prilikom dodavanja nove aplikacije koja koristi SRP modul, administrator mora aurirati datoteku na koju SRP_PASS pokazuje s novim zapisom koji sadri ime baze korisnika koju aplikacija koristi i saetak tog imena. Osim toga mora kreirati bazu korisnika za novu aplikaciju. Registriranje nove aplikacije ne uzrokuje promjene u izvornom klijenta, niti posluitelja. Klijent koristi konfiguracijsku datoteku /etc/pam_clientsrp.conf, a posluitelj /etc/pam_serversrp.conf. Nakon to se klijent i posluitelj pokrenu konfiguracija je pohranjena u client_config, odnosno server_config strukturu.

    4.5 Optimizacija SRP protokola SRP protokol moguce je optimizirati. Optimizacija se odnosi na broj poruka koje klijent i sever izmjenjuju.

    C -----> S C C S A C S M C S C, A C S M C

  • 22

    4.6 Sigurnosni zahtjevi koje parametri moraju ispunjavati Parametar g koji se koristi pri racunanju brojeva A i B naziva se generator. Svojstvo generatora mora se gledati iz konteksta grupe. Broj g je generator grupe N, ako vrijedi da za { }N1,...,?? x postoji bijekcija u skup Ng x % . Ukoliko je broj N primitivan broj, a g generator, period nakon kojeg je ponovo generiran broj 1 naziva se red. Parametar g je generator, ako je red N-1. Konkretno to znaci da je za Nx

  • 23

    5. Ostvarenje PAM SRP modula

    5.1 Analiza rada PAM SRP modula PAM SRP modul je ostvaren u programskom jeziku C i predstavlja klijent komponentu SRP ( Secure Remote Password ) protokola. PAM SRP modul primjer je autentifikacijskog modula i u skladu s tim implementira pam_sm_authenticate funkciju. PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh,int flags, int argc,const char **argv)

    Slika 5.1.1 pam_sm_authenticate funkcija

    Prije dijela koji implementira SRP protokol modul prolazi kroz postupak inicijalizacije. Inicijalizacija obuhvaca dohvat konfiguracijskih parametara, neophodnih za rad modula.

    /* alociraj memoriju za konfiguracijsku strukturu */ cc=(struct client_conf *)malloc(sizeof(struct client_conf));

  • 24

    if(NULL==cc) { D_printf("ne mogu alocirati memoriju",modRada,LOG_ERR,konvr); exit(0); } /** inicijalizacija g i N parametara, nuzno zbog implementacije bigInt strukture (gnu gmp mpz_t tip podataka) */ init_bigInt(&cc->common._param.g); init_bigInt(&cc->common._param.N); /** dohvati konfiguracijske parametre */ getClientConfig(cc,SRP_CONF);

    Slika 5.1.2 Inicijalizacija modula Konfiguracija modula je definirana vrijednostima parametara datoteke /etc/pam_clientsrp.conf. Modul pristupa konfiguracijskoj datoteci preko funkcije getClientConfig. Funkcija getClientConfig parsira svaki red datoteke, te dobivenim vrijednostima inicijalizira clanove client_conf strukture. Osim s SRP posluiteljem modul komunicira i s korisnikom aplikacije, koja modul koristi. Modul alje aplikaciji poruke koje se reproduciraju na zaslonu racunala. Korisnik putem tipkovnice unosi odgovore na pitanja koja modul postavlja. Korisnikov odgovor aplikacija prosljeduju modulu. PAM SRP modul od korisnika zahtjeva dvije informacije. To su korisnicko ime i zaporka kao to je na slici 5.1.4 i prikazano. Komunikacija izmedu modula i aplikacije se ostvaruje pozivom funkcije za razgovor (conversation function) koja kao ulazni argument prima polje pokazivaca na pam_message strukturu. mesg=(struct pam_message *)malloc(sizeof(struct pam_message)*nmbMesg); /* inicijalizira prvu strukturu */ mesg[0].msg_style=PAM_PROMPT_ECHO_ON; mesg[0].msg="username:"; /* inicijalizira drugu strukturu */ if(nmbMesg==2)

  • 25

    { mesg[1].msg_style=PAM_PROMPT_ECHO_OFF; mesg[1].msg="password:"; } resp=NULL; retval=konvr->conv(nmbMesg,(const struct pam_message **)&mesg,&resp,NULL);

    Slika 5.1.4 Poruke modula aplikaciji Posljedica poziva funkcije za razgovor je slijedeci ispis na zaslonu terminala s kojeg je aplikacija pokrenuta:

    otvaram /home/gronker/dipl/client/src/srp.conf datoteku Konfiguracijski parametri klijenta dohvaceni username:

    Slika 5.1.5. Ispis prve poruke modula aplikaciji

    Nakon to korisnik unese korisnicko ime, ispisuje se druga poruka. Stanje na zaslonu prikazano je na slici 5.1.6:

    otvaram /home/gronker/dipl/client/src/srp.conf datoteku Konfiguracijski parametri klijenta dohvaceni username: drazen password:

    Slika 5.1.6. Ispis druge poruke modula aplikaciji

    Ukoliko je povratna vrijednost poziva funkcije za razgovor PAM_SUCCESS, klijent poziva redom funkcije getLocalConf, getRemoteConf i pokuava se spojiti na posluitelj. SRP protokol zasnovan je na klijent / posluitelj arhitekturi. Uspostavljanje komunikacijskog kanala izmedu klijenta i posluitelja zahtjeva poznavanje IP adresa racunala na kojima su programi smjeteni i portova na kojima se izvravaju. IP adresa racunala i port na kojem se servis izvrava neophodni su parametri za konfiguraciju TCP / IP uticnica, kojima je komunikacijski kanal ostvaren. Konfiguracija lokalnog kraja veze postie se funkcijskim pozivom getLocalConf. Funkcijski poziv getRemoteConf postavlja IP adresu i port udaljenog racunala. Programski jezik C definira sucelje za pisanje, odnosno citanje sa uticnica (socketa). Slanje i primanje poruka implementirano je funkcijskim pozivima sendMessage i receiveMessage. Redoslijedom kako su navedeni, spomenuti pozivi enkapsuliraju funkcionalnost sistemskih poziva write, odnosno read.

  • 26

    IP adresa, broj porta, TCP / IP uticnica su parametri nuni za sudjelovanje u komunikaciji i logicno ih je spojiti u jednu strukturu, srp_connection strukturu. Definicija srp_connection strukture podataka prikazana je na slici 5.2.10 u poglavlju 5.2. Inicijalizacija lokalnog kraja veze ostvarena je funkcijom confLocalSocket prikazanom na slici 5.1.7. int confLocalSocket(struct client_conf *cc,struct srp_connection *kon) { int lt,r; kon->sck_inet=socket(PF_INET,SOCK_STREAM,0); if(kon->sck_inet==-1) { printf("Nemogu kreirati socket\n"); free(kon->data_buffer); return -1; } kon->local.sin_family=PF_INET; kon->local.sin_port=htons(cc->CLIENT_PORT); inet_aton(cc->CLIENT_IP,&kon->local.sin_addr); if(kon->local.sin_addr.s_addr==INADDR_NONE) { printf("Ne mogu tocno formirati adresu\n"); free(kon->data_buffer); return -1; } lt=sizeof kon->local; r=bind(kon->sck_inet,(struct sockaddr *)(&kon->local),lt); if(r==-1) { printf("Nemogu da vezem adresu na socket\n"); free(kon->data_buffer); return -1;

  • 27

    } return 0; };

    Slika 5.1.7. Funkcija confLocalSocket

    PAM SRP modul ostvaruje TCP / IP vezu s posluiteljem funkcijskim pozivom connect. Funkcija connect kao povratnu vrijednost vraca cijeli broj, a namijenjena je kreiranju veze izmedu klijenta i posluitelja. Negativna povratna vrijednost oznacava situaciju u kojoj vezu nije moguce ostvariti. Razlozi tome mogu biti: 1.posluitelj komponenta SRP protokola nije instalirana na racunalu odredenom IP adresom; 2. posluitelj komponenta SRP protokola nije pokrenuta na racunalu odredenom

    IP adresom; 3. pogrjeka u konfiguracijskoj datoteci pri unosu IP adrese, porta na kojem

    posluitelj radi;

    r=connect(xk->sck_inet, (struct sockaddr *)&(xk->remote),sizeof xk->remote); if(rcommon._param.g); clear_bigInt(&cc->common._param.N); free(cc); free(xk->data_buffer); free(xk); free(uname); free(passwd); free(pass_hash); release_memory(mem_colector,Knt); return PAM_AUTHINFO_UNAVAIL; }

    Slika 5.1.8. Poziv funkcije connect

    Pod pretpostavkom da je veza izmedu klijenta i posluitelja kreirana, modul pocinje s provedbom SRP protokola. Klijent posluitelju alje korisnicko ime i saetak imena baze korisnika aplikacije koja modul koristi.

    /** Klijent salje serveru "username hash_imena_datoteke" */

    strcpy(uphash,uname);

  • 28

    strcat(uphash," "); strcat(uphash,pass_hash); r_q=sendMessage(xk,uphash);

    Slika 5.1.9. Prva poruka klijenta posluitelju

    Funkcija sendMessage namijenjena je za razmjenu poruka izmedu klijenta i posluitelja. Informacija o uspjenom, odnosno neuspjenom slanju poruke sadrana je u povratnoj vrijednosti funkcije. Negativna povratna vrijednost signalizira neuspjeh, a pozitivna vrijednost uspjeno poslanu poruku. Kako bi poruka imala prispjela na odredite, posluitelj mora biti pokrenut i primati zahtjeve. Posluitelj se pokrece naredbom srpServer kao to je prikazano na slici 5.1.10.

    here to serve:srpServer 127.0.0.1 9002

    Slika 5.1.10. Pokretanje posluitelja

    Rezultat gornje naredbe je pozivanje main funkcije newserver.c datoteke.

    Slika 5.1.11. Funkcija main

    Main funkcija poziva funkciju signal kojoj kao ulazni argument predaje adresu funkcije koja ce osloboditi zauzete resurse ukoliko korisnik ili jezgra operacijskog sustava generira signal za prekid (CTRL / C). Posluitelj se zaustavlja kombinacijom tipki CTRL / C. Funkcija getServerConfig gotovo je identicna funkciji getClientConfig. Razlika je u parametrima koje posluitelj koristi, a klijent ne.

    int main(int argc,char *argv[]) { struct server_conf *wc; signal(SIGINT,freeResources); wc=(struct server_conf *)malloc( sizeof(struct server_conf)); init_bigInt(&wc->common._param.g); init_bigInt(&wc->common._param.N); getServerConfig(wc,SRP_CONF); start_srp_server(wc,argv[1],argv[2]); clear_bigInt(&wc->common._param.g); clear_bigInt(&wc->common._param.N); free(wc); return 0; }

  • 29

    Funkcija start_srp_server implementira posluitelj komponentu SRP protokola. void start_srp_server(struct server_conf *wc,char *max,char *port)

    Slika 5.1.12. start_srp_server funkcija Argument wc je pokazivac na inicijaliziranu server_conf strukturu. Argumenti max, odnosno port odnose se na IP adresu, tj. port na kojem ce se posluitelj izvoditi. Konfiguracija lokalnog kraja veze ostvarena je funkcijskim pozivom confLocalSocket. Nakon konfiguracije socketa posluitelj obavjetava okolinu da upravo konfigurirani lokalni socket namjerava koristiti za oslukivanje zahtjeva.

    /* slusaj zahtjeve na xk->sck_inet socketu, prihvacas do wc->REQ_BUFFER zahtjeva,

    sekvencijalno procesiranje */

    r=listen(xk->sck_inet,wc->REQ_BUFFER);

    Slika 5.1.14 Funkcija listen

    Dio izvornog koda koji se odnosi na obradu pristiglih zahtjeva smjeten je unutar bezuvjetne for petlje. Funkcija accept zaustavlja izvodenje programa do pojave narednog zahtjeva .

    for(;;) { printf("Cekam novi zahtjev\n"); /* inicijalizacija buffer na 0x00 vrijednost */ log_message("SRP posluitelj","inicijalizacija nekih podataka",LOG_DEBUG); bzero(data_out,nexs+1); bzero(sck_idn->data_buffer,wc->common.BUFFER_SIZE); bzero(_user.salt,nexs+1); bzero(_user.verifier,nexs+1); sck_idn->sck_inet=accept(xk->sck_inet,\ (struct sockaddr *)&xk->remote,&rs); log_message("SRP posluitelj","zahtjev prihvacen",LOG_DEBUG);

    Slika 5.1.15 Icekivanje zahtjeva

  • 30

    Posluitelj pristigle zahtjeve obraduje sekvencijalno. Sve dok je broj pristiglih zahtjeva manji od REQ_BUFFER parametra posluitelj ih je u stanju sve obraditi. Ukoliko je trenutan broj zahtjeva jednak vrijednost parametra REQ_BUFFER, svaki slijedeci zahtjev se odbacuje. Posluitelj je sada pokrenut i odgovara na zahtjeve, te moe primiti poruku koju mu PAM SRP modul, SRP klijent, alje. Funkcija receiveMessage prima poruke koje se prenose TCP / IP vezom izmedu klijenta i posluitelja i sprema ih na za njih rezervirano mjesto. Informacija o tome da li je poruka uspjeno primljena pohranjena je u povratnoj vrijednosti funkcije. Negativna povratna vrijednost funkcije oznacava da podaci nisu dostupni za citanje, to je posljedica problema s TCP / IP vezom izmedu klijenta i posluitelja.

    r=receiveMessage(sck_idn); if(0>r) { log_message("SRP posluitelj","nisam dobio userName",LOG_ERR); close(sck_idn->sck_inet); continue; }

    printf("Klijent je poslao korisnicko ime \n"); /* unesi username u user_entry strukturu */ _user.user = parse(sck_idn->data_buffer,' '); printf("Klijent je poslao SHA1 sazetak imena baze \ korisnika\n"); db_hash = parse(sck_idn->data_buffer,' ');

    Slika 5.1.16. Izdvajanje korisnickog imena i baze

    Posluitelj parsira primljenu poruku. Rezultat parsiranja je korisnicko ime i saetak imena baze korisnika aplikacije koja modul koristi. U slijedecem koraku posluitelj pretrauje bazu aplikacija kako bi pronaao zapis cija vrijednost kljuca odgovara primljenom saetku imena baze korisnika aplikacije koja modul koristi.

    /* pretrazi bazu sazetaka baza korisnika aplikacija *

  • 31

    pass_file = hashToSource(db_hash,wc->SRP_PASS);

    Slika 5.1.17. Pretraivanje baze podranih aplikacija

    Funkcija hashToSource vraca ime baze u razumljivom obliku. Specifikacija SRP protokola od posluitelja zahtjeva poznavanje password verifier i salt parametara korisnika koji se pokuava autentificirati. Korisnicko ime, password verifier i salt cine zapis baze korisnika svake podrane aplikacije. Funkcija getUserCredentials pretrauje bazu korisnika i inicijalizira user_entry strukturu podacima o korisniku ukoliko on postoji. Definicija user_entry strukuture dana je na slici 5.2.7 u poglavlju 5.2.

    r=getUserCredentials(pass_file,&_user,nexs);

    if(rsck_inet); continue;

    }

    Slika 5.1.18. Funkcija getUserCredentials Slucaj da korisnik ne postoji povlaci oslobadanje zauzetih resursa i zatvaranje ovog kraja veze. U slijedecem koraku posluitelj klijentu alje salt. Klijent provjerava povratnu vrijednost funkcije receiveMessage kako bi bio siguran da posluitelj jo uvijek obraduje njegov zahtjev.

    /** KLIJENT

  • 32

    PAM SRP modul parsira primljenu poruku. Definirana su dva formata poruke. Poruku cini samo salt vrijednost, ili su salt, parametar g i parametar N spojeni u jedan niz znakova. Funkcija set_bigInt_str inicijalizira broj preko vrijednosti zapisane u nizu znakova. Funkcija set_bigInt ima ulogu operatora jednakosti. Parametri g i N su neizostavni dio SRP protokola. Prema osnovnim postavkama koriste se vrijednosti parametara zadane u konfiguracijskoj datoteci. Ukoliko posluitelj odluci uz salt poslati jo parametre g i N, poslane vrijednosti ce se i koristiti. U svakom slucaju velicina parametara izraena u broju bitova, mora biti u granicama parametra NBITS konfiguracijske datoteke. strSalt=parse(xk->data_buffer,' '); set_bigInt_str(&s,strSalt); printf("%s \n",xk->data_buffer); /** provjeri da server nije poslao poruku "salt generator moduloN" */ if(strcmp("",xk->data_buffer)!=0) { strg=parse(xk->data_buffer,' '); strN=parse(xk->data_buffer,' '); set_bigInt_str(&g,strg); set_bigInt_str(&N,strN); } /** ili je poslao samo "salt" */ else { set_bigInt(&g,&cc->common._param.g); set_bigInt(&N,&cc->common._param.N); }

    Slika 5.1.20. Klijent parsira poruku Nakon to je primio salt, klijent generira slucajan broj a. Izbor generatora slucajnih brojeva odreduje parametar RAND_METHOD. Vrijednost parametra RAND_METHOD definirana je u konfiguracijskoj datoteci /etc/pam_clientsrp.conf. Izvor sjemena koje generator koristi odreden je parametrom SEED_SOURCE. Cetiri su moguca izvora sjemena, dok je izbor generatora suen na dva.

  • 33

    if (cc->common.RAND_METHOD==0) { init_f=&init_randtime; rand_f=&gen_randtime; } else { init_f=&init_randhash; rand_f=&gen_randhash; } /* cc->SEED_SOURCE sadrzi informaciju o tome kako se generira seed */

    init_seed(&sid,cc->common.SEED_SOURCE,cc->common.SFILE);

    Slika 5.1.21. Izbor generatora i inicijalizacija sjemena

    Tablica 5.1.1. Vrijednosti parametra RAND_METHOD

    vrijednost znacenje

    0 GNU gmp generator slucajnih brojeva

    1 HMAC pseudo generator slucajnih brojeva

    Tablica 5.1.2. Vrijednosti parametra SEED_SOURCE

    Vrijednost znacenje

    0 vrijeme

    1 saetak entropije sustava u trenutku instaliranja klijenta

    ili posluitelja

    2 /dev/random uredaj

    3 tipkovnica

    Generirani slucajni broj a mora zadovoljavati uvjet da je a > logg N. Izvorna

    implementacija SRP protokola, ispunjava uvjet dodavanjem vrijednosti log g N

  • 34

    generiranom broju a. Konkretno to znaci da je a = a + loggN. Ova

    implementacija za rad s velikim brojevima koristi GNU gmp biblioteku. GNU gmp biblioteka ne implementira logaritamsku funkciju, te se a racuna prema formuli a = a + 0.5N. Ovakav pristup i dalje zadovoljava uvjet a > log

    gN.

    Slika 5.1.22. Generiranje parametra A Klijent racuna parametar A, kao A=g^a%N i alje ga posluitelju.

    /* server ocekuje od klijenta broj A */

    r=getbigint_from_remote(&A,sck_idn);

    Slika 5.1.23. Posluitelj prima parametar A Funkcija getbigint_from_remote poziva receiveMessage funkciju preko koje dohvaca broj koji je klijent poslao posluitelju. Osim toga kontrolira da li je vrijednost primljenog parametra A razlicita od 0. Ukoliko je parametar A jednak 0, funkcija vraca vrijednost 0. Negativna povratna vrijednost oznacava probleme s TCP / IP vezom. int getbigint_from_remote(struct bigInt* A,struct srp_connection *xk) { int r; r=receiveMessage(xk); if(r==-1) { printf("ne mogu nista da procitam sa socketa\n"); return -1; } mpz_set_str(A->br,xk->data_buffer,16); if( !mpz_cmp_ui(A->br,0)) return 0; else return 1; };

    init_f(&sid,&rst); /* generiraj broj */ rand_f(&rst,&a,(uint32)cc->common.NBITS); /** generirani broj a treba biti > log g N */ add_bigInt(&a,&a,&npola); bigInt_powm(&A,&g,&a,&N); /* A=g^a%N */

  • 35

    /* char(salt)-> bigInt(s) */ set_bigInt_str(&s,_user.salt); /* char(verifier)->bigInt(v) */ set_bigInt_str(&v,_user.verifier); genRandB(&wc->common._param,v.br,b.br,&B);

    Slika 5.1.24. Funkcija get_bigint_from_remote

    Posluitelj ispituje povratnu informaciju get_bigint_from_remote funkcije, te u slucaju da je vrijednost manja ili jednaka nuli prekida obradu trenutnog zahtjeva, oslobada resurse, zatvara socket i obraduje slijedeci zahtjev ukoliko on postoji. Pod pretpostavkom da je parametar A uspjeno poslan i razlicit od 0, posluitelj racuna parametar B. Vrijednost parametra B odredena je formulom

    NbvB )%( += . Varijabla b predstavlja slucajan broj. Postupak generiranja slucajnog broja b identican je postupku generiranja slucajnog broja a. Slucajno generiran broj b mora zadovoljavati uvjet da je b > log

    gN. Uvjet je zadovoljen na identican nacin

    kao prilikom generiranja parametra a.Funkcija genRandB racuna parametar B, nakon to su svi ulazni parametri poznati.

    Slika 5.1.25. Generiranje parametra B U slijedecem koraku posluitelj alje klijentu parametar B. PAM SRP modul, koji implementira klijent komponentu SRP protokola poziva funkciju get_bigint_from_remote te na taj nacin prima parametar B. Ukoliko funkcija get_bigint_from_remote vraca cijeli broj manji ili jednak nula, PAM SRP modul oslobada resurse, zatvara socket, te kao rezultat pam_sm_authenticate funkcije vraca PAM_AUTH_ERR. Ukoliko su parametri A i B razliciti od nule i uspjeno razmijenjeni, protokol se nastavlja. PAM SRP modul zna vrijednost parametra salt i posjeduje korisnicko ime i zaporku korisnika koji se autentificira. Klijent ima sve potrebne vrijednosti za generiranje parametra X koji se racuna prema formuli:

    X = SHA ( SHA ( korisnicko ime:zaporka ) | salt ).

    Funkcija calcPasswdHash racuna parametar X. Vrijednost parametra X odreduje tijek autentifikacije, jer u ovom trenutku do izraaja dolazi zaporka koju je korisnik ponudio. Malo je vjerojatno, ako ne i nemoguce da stvarni korisnik

  • 36

    D_printf("Parametri X",modRada,LOG_DEBUG, konvr); D_printf(uname,modRada,LOG_DEBUG,konvr); D_printf(passwd,modRada,LOG_DEBUG,konvr); r = calcPasswdHash(&X,uname,passwd,uint8s,size);

    koristeci pogrenu zaporku prode postupak autentifikacije.

    Slika 5.1.26. Funkcija calcPasswdHash Parametar X je jedan od ulaznih argumenata funkcije genS_ckey koja racuna sjednicki kljuc, tj. parametar S. PAM SRP modul i posluitelj koriste razlicite argumente za racunanje parametra S. Neovisno o tome rezultat mora biti identican. PAM SRP modul poziva funkciju genS_ckey koja racuna parametar S prema formuli:

    S = (B - g^x) ^ (a + u * x) % N

    genS_ckey(&S,&cc->common._param,&B,&a,&X);

    Slika 5.1.27 Izracun sjednickog kljuca na klijent strani Posluitelj poziva funkciju genS_key koja racuna parametar S prema formuli:

    S = (A * v^u) ^ b % N

    genS_key(&S,&A,&v,&B,&b,&wc->common._param.N);

    Slika 5.1.28 Izracun sjednickog kljuca na strani posluitelja

    Nakon to su izracunali parametar S, PAM SRP modul i posluitelj generiraju tajni kljuc duine 320 bita. Postupak je identican na obje strane i sastoji se od poziva interleaveSHA funkcije koja kao ulazni argument prima parametar S. Prije poziva intreleaveSHA funkcije parametar S potrebno je prikazati kao niz bajtova.

    uint8S=toUint8Number(&S); uint8A=toUint8Number(&A); uint8B=toUint8Number(&B); uint8s=toUint8Number(&s);

    printf("Generiran parametar S\n");

    /* generiraj zajednicki kljuc */

    K=interleaveSha(uint8S->br,uint8S->len);

  • 37

    Slika 5.1.29 Generiranje tajnog kljuca

    Funkcija interleaveSHA iz ulaznog niza, generira dva niza. Niz bajtova s parnim indeksom i niz bajtova s neparnim indeksom, te racuna saetak svakog niza.

    . . . memset(em,0x00,r/2); memset(om,0x00,r/2); while(i(8*(3-(i%8)/2)); i++;

  • 38

    result[i]=_pr2.h[i/8]>>(8*(3-(i%8)/2)); i++; }

    Slika 5.1.31 Mjeanje rezultata Trenutno stanje, fazu u kojoj se klijent i posluitelj nalaze moguce je pratiti na zaslonu racunala.

    here to serve:srpServer 127.0.0.1 9002 SRP POSLUITELJ pokrenut Cekam novi zahtjev Klijent je poslao korisnicko ime Klijent je poslao SHA1 sazetak imena baze korisnika Baza korisnika je pronadena Traim korisnika Korisnik pronadjen Primljen parametar A Generiran parametar B Generiran parametar S Generiran tajni kljuc

    Slika 5.1.32. Ispis na zaslonu posluitelja

    here to serve:app_simple otvaram /home/gronker/dipl/client/ Konfiguracijski parametri klijenta username: drazen password: Parametar A : Generiran Parametar B: Uspjesno primljen Parametar S: Generiran Tajni kljuc K: Generiran

    Slika 5.1.33. Ispis na zaslonu aplikacije

    Slijedeca funkcija koju klijent, odnosno posluitelj poziva je genChallengeHash. Funkcija genChallengeHash generira 20 bajtova informacije kojom se klijent autentificira posluitelju prema formuli:

  • 39

    M = SHA(SHA(N) XOR SHA(g) | SHA(U) | s | A | B | K)

    Klijent alje posluitelju rezultat genChallengeHash funkcije. Nakon to ih primi posluitelj ih usporeduje s lokalno generiranim parametrom M. r=receiveMessage(sck_idn); log_message("SRP posluitelj","autentifikacijski niz prihvacen",LOG_DEBUG); if(0>r) { log_message("SRP posluitelj","nisam dobio M hash",LOG_ERR); close(sck_idn->sck_inet); free(M); free(K); free(_user.user); free(db_hash); free(pass_file); freeUint8(uint8A); freeUint8(uint8B); freeUint8(uint8s); freeUint8(uint8S); continue; } if(memcmp(sck_idn->data_buffer,M,20)!=0) {

    log_message("SRP posluitelj","Autenitifikacija nije us }

    Slika 5.1.34. Provjera

    Ukoliko vrijednosti nisu identicne posluitelj funkcijom log_message tu informaciju zapisuje u /var/log/messages datoteku. Osim toga oslobada resurse, zatvara socket i oslukuje nove zahtjeve. Drugi slucaj znaci da je autentifikacija korisnika uspjela i da je sada red na posluitelju da dokae svoj identitet.

  • 40

    V=genVerifierHash(uint8A,M,K); memcpy(extVer,V,20); extVer[20]=0; r=sendMessage(sck_idn,extVer);

    Slika 5.1.35. Pokuaj obostrane autentifikacije

    Kako bi dokazao svoj identitet posluitelj generira saetak niza bajtova A | M | K, te ga alje klijentu. Klijent provjerava povratnu vrijednost funkcije receiveMessage. Pozitivna vrijednost znaci da je jednostrana autentifikacija uspjeno izvedena. Klijent usporeduje lokalno generiran s primljenim saetkom.

    R_b=receiveMessage(xk); printf( Autentifikacija uspjena\n); D_printf(Generiram verifier, \ modRada,LOG_DEBUG,konvr); V=genVerifierHash(uint8A,M,K); if(!memcmp(V,xk->dana_buffer,20)) { r=PAM_SUCCESS; D_printf(authentication \ success,modRada,LOG_DEBUG,konvr); printf(Obostrana autentifikacija uspjena\n); } else { r=PAM_AUTH_ERR; D_printf(authentication \ failed,modRada,LOG_DEBUG,konvr); printf(Posluitelj se nije autentificirao\n); }

    Slika 5.1.36. Rezultat obostrane autentifikacije

    Izgled zaslona posluitelja i aplikacije nakon uspjene autentifikacije korisnika prikazan je na slikama u nastavku.

    here to serve:app_simple otvaram /home/gronker/dipl/client/src/srp.conf datoteku Konfiguracijski parametri klijenta dohvaceni username: drazen password:

  • 41

    Parametar A : Generiran Parametar B: Uspjesno primljen Parametar S: Generiran Tajni kljuc K: Generiran aljem autentifikacijsku znacku Autentifikacija uspjena Obostrana autentifikacija uspjena Hvala to koristite uslugu tocnog vremenaMon Sep 5 01:06:33 2005 here to serve:

    Slika 5.1.37 Rezultat uspjene autentifikacije

    here to serve:srpServer 127.0.0.1 9002 SRP POSLUITELJ pokrenut Cekam novi zahtjev Klijent je poslao korisnicko ime Klijent je poslao SHA1 sazetak imena baze korisnika Baza korisnika je pronadena Traim korisnika Korisnik pronadjen Primljen parametar A Generiran parametar B Generiran parametar S Generiran tajni kljuc Generiran parametar M server status 20 bajtova Cekam novi zahtjev

    Slika 5.1.38. Ispis na posluitelju nakon uspjene autentifikacije

  • 42

    5.2 Strukture podataka koritene u implementaciji SRP modula Struktura srp_params enkapsulira dva parametra neophodna za implementaciju SRP protokola. Parametri g i N, odgovaraju istoimenim parametrima navedenim u opisu SRP protokola. Definicija srp_params strukture prikazana je na slici 5.2.1.

    struct srp_params {

    struct bigInt g; struct bigInt N;

    };

    Slika 5.2.1. Definicija srp_params strukture

  • 43

    Struktura work_conf definira osnovne konfiguracijske parametre klijenta i posluitelja. Slika 5.2.2. prikazuje work_conf strukturu.

    struct work_conf {

    int NBITS; int RAND_METHOD; int SEED_SOURCE; char sFILE[60]; int BUFFER_SIZE; struct srp_params _param;

    };

    Slika 5.2.2. Definicija work_conf strukture

    Klijent i posluitelj imaju razlicite funkcije, a u skladu s time i razlicite parametre. Konfiguracija posluitelja sadrana je u server_conf strukturi, a konfiguracija klijenta predstavljena je client_conf strukturom. Definicija strukture client_conf prikazana je na slici 5.2.3, a strukture server_conf prikazana je na slici 5.2.4.

    Slika 5.2.3. Definicija client_conf strukture

    struct server_conf { int REQ_BUFFER; char SRP_PASS[60];

    struct client_conf { int CLIENT_PORT; int SERVER_PORT; char CLIENT_IP[16]; char SERVER_IP[16]; struct work_conf common; };

  • 44

    struct work_conf common; };

    Slika 5.2.4. Definicija server_conf strukture BigInt struktura implementira velike brojeve. Definicija bigInt_strukture prikazana je na slici 5.2.5.

    struct bigInt { mpz_t br;

    };

    Slika 5.2.5.Definicija bigInt strukture Funkcije za rad s velikim brojevima su deklarirane i definirane u bigInt.h, odnosno bigInt.c datoteci. Prema slici 5.2.5 bigInt struktura sadri samo cjelobrojnu mpz_t varijablu. Definicija mpz_t strukture nalazi se u GNU gmp biblioteci. Struktura uint8_number predstavlja veliki broj kao niz bajtova. Struktura osim niza bajtova sadri informaciju o duljini niza bajtova. Definicija uint8_number strukture prikazana je na slici 5.2.6.

    struct uint8_number {

    int len; uint8 *br;

    };

    Slika 5.2.6. Definicija uint8_number strukture

  • 45

    Funkcija toUint8 transformira broj predstavljen bigInt strukturom u broj reprezentiran uint8_number strukturom. User_entry struktura definirana je u skladu s formatom zapisa baze korisnika. Format baze korisnika je { ,,}. Definicija user_entry strukture prikazana je slikom 5.2.7.

    struct user_entry { char *user; char *salt; char *verifier; };

    Slika 5.2.7. Definicija user_entry strukture Funkcija getUserCredentials prima kao ulazni parametar korisnicko ime i neinicijaliziranu user_entry strukturu. Funkcija pretrauje bazu kako bi pronala zapis ciji kljuc odgovara vrijednosti ulaznog parametra korisnickog imena. Ukoliko je zapis pronaden, funkcija inicijalizira user_entry strukturu podacima iz pronadenog zapisa. Struktura seed enkapsulira informaciju o vrijednosti sjemena koje se upotrebljava za inicijalizaciju generatora slucajnih brojeva. Slika 5.2.8 prikazuje definiciju seed strukture.

    struct seed { int status; union{ ssize_t st; uint8 *ls; } };

    Slika 5.2.8. Definicija seed strukture Slucajni broj je moguce generirati na dva nacina, koritenjem dva razlicita generatora. Stanje generatora opisano je strukturom randstate. Definicija

  • 46

    randstate strukture prikazana je na slici 5.2.9.

    struct randstate

    { gmp_randstate_t gmpst; SPC_MRNG_CTX prngst;

    };

    Slika 5.2.9. Definicija randstate strukture Srp_connection struktura definirana je u srp_struct.h zaglavlju i prikazana na slici 5.2.10.

    struct srp_connection { struct sockaddr_in local; struct sockaddr_in remote; char *data_buffer; int buffer_size; int sck_inet; };

    Slika 5.2.10. Definicija srp_connection strukture Parametar data_buffer predstavlja ulazno-izlazni spremnik. Spremnik ima tocno definiranu velicinu odredenu parametrom buffer_size.

    5.3 Primijenjeni algoritmi

    5.3.1 Sha1 (Secure Hash Algorithm) SHA1 algoritam generira 160 bitni saetak poruke. Implementacija algoritma je u skladu s RFC3174 specifikacijom. Generiranje saetka poruke zahtjeva pozive SHA_Init, SHA_Update i SHA_Final funkcija. SHA_Init kao ulazni argument prima pokazivac na SHA_cntxt strukturu. Definicija SHA_cntxt strukture prikazana je na slici 5.3.1. struct mm { uint32 len[2]; /* duzina poruke u bitovima */

  • 47

    uint32 h[5]; /* rezultat hash operacije nad pojedinim blokom */ uint8 lo[64]; /* buffer koji sadrzi posljednji blok */ uint32 ix; /* indeks posljednjeg bajta u bloku koji treba da */ se procesira };

    Slika 5.3.1 SHA_cntxt struktura

    SHA_Update generira saetak poruke, obradujuci ju blok po blok. Ukoliko tijekom obrade posljednji ulazni blok nije popunjen, obradu nastavlja funkcija SHA_Final. SHA_Final pohranjuje saetak na lokaciju na koju prvi argument SHA_Final funkcije pokazuje. Ukoliko je argument NULL saetak je pohranjen u SHA_cntxt strukturu.

    5.3.2 Hmac HMAC algoritam implementiran je koritenjem SHA1 funkcijskih poziva i upotrebom tajnog kljuca. HMAC algoritam se koristi prilikom realizacije generatora slucajnih brojeva. Implementacija HMAC algoritma odgovara specifikaciji RFC2104. Na slici 5.3.2.1 nalazi se pseudokod HMAC algoritma.

    dodaj nul bajtove kljucu kako bi dobili string

    bajtova duine B, S = string duine B

    r = XOR( S,ipad )

    r = strcat (r,data)

    hash=H(r), generiraj saetak rezultata 3 koraka

  • 48

    p = XOR( S, opad )

    p = strcat (p, hash)

    result = H(p),generiraj saetak rezultata 6 koraka

    Slika 5.3.2.1. Pseudokod HMAC algoritma Ova implementacija HMAC algoritma koristi SHA1 algoritam saimanja to znaci da je velicina bloka 64 bajta. Varijable i njhova namjena objanjene su u rfc2104 dokumentu.

    5.3.3 Linerano kongruentan generator slucajnih brojeva GNU gmp biblioteka implementira linearno kongruentan generator slucajnih brojeva.

    X = (a x X + c) mod m

    Slika 5.2.3.1. Pseudokod LC generatora Cilj generatora je generirati to veci niz razlicitih slucajnih brojeva. Period ponavljanja generiranih brojeva odreden je parametrima a, c i m. Maksimalan period odgovara vrijednosti parametra m, ali ga nije uvijek moguce ostvariti. GNU gmp biblioteka parametar m implementira kao potenciju broja 2. Ovakav pristup je uobicajen u praksi, ali umanjuje stupanj slucajnosti generiranog broja.

  • 49

    Ukoliko postoji broj d, djelitelj broja m i on je npr. velicine 4 bita, pokazuje se da je koritenjem jednostavne formule moguce tocno odrediti posljednja 4 bita broja koji ce biti generiran. Tocnije posljednja 4 bita ponaaju se po principu linearno kongruentnog generatora. Sigurnije, ali ne i prakticnije bi bilo za m koristiti veliki prost broj. Sigurnost i kvalitetu LC generatora moguce je postici pridravanjem zahtjeva iznesenih u knjizi D.Knutha ,Art of the computer programming, Vol.2, Semi-numerical algorithms. GNU gmp implementacija omogucava inicijalizaciju pocetnog stanja generatora, odabir algoritma ( trenutna verzija sadri samo 1 algoritam ), te generiranje slucajnog broja. Inicijalizacija generatora ostvarena je funkcijskim pozivom gmp_randinit_default koji kao ulazni argument prima gmp_randstate_t strukturu koja sadri informaciju o pocetnom stanju generatora, kao i algoritam koji generator koristi. Pocetno stanje generatora postavlja se funkcijskim pozivima gmp_randseed_ui ili gmp_randseed. Funkcionalnost gmp generatora enkapsulirana je u funkcijama init_randtime i gen_randtime. Funkcija init_randtime incijalizira generator. Slucajni broj se generira funkcijom gen_randtime, koja rezultat gmp funkcije mpz_urandomb enkapsulira u strukturu bigInt i vraca kao traeni broj.

    5.3.4 Pseudo generator slucajnih brojeva utemeljen na HMAC algoritmu Implementacija HMAC generatora preuzeta je iz knjige Secure Programming Cookbook for C and C++. Princip rada HMAC generatora zasniva se na primjeni Hmac algoritma. Generator kao ulazni parametar prima broj bajtova koji treba generirati. U svakom ciklusu generator generira 20 bajtova i pridodaje izlaznom nizu. Broj ciklusa koje generatora mora izvesti ovisi o vrijednosti broja bajtova koje mora generirati. Generator pomocu HMAC algoritma racuna saetak indeksa pojedinog bloka poruke. Generator se inicijalizira funkcijskim pozivom spc_mprng_init. spc_hmac_init funkcija kao ulazni parametar prima sjeme, te generira 20 bajtova informacije kojom se inicijalizira SHA_cntxt. Pocetno stanje generatora moguce

  • 50

    je promijeniti novim pozivom funkcije spc_hmac_init, ali s razlicitim ulaznim parametrom. Blok bajtova koji se procesira ima duinu odredenu parametrom MAC_OUT_SZ. Svaka iteracija umanjuje ostatak bajtova koje treba generirati . Nakon prve iteracije potrebno je generirati N-MAC_OUT_SZ bajtova ( uz pretpostavku N > MAC_OUT_SZ ) , a indeks bloka je 0. Rezultat HMAC algoritma, 20 bajtova, dodaje se u izlazni niz. Sada je indeks bloka 1 i u slijedecem krugu HMAC prima parametar 1. Inicijalizacija generatora, odnosno generiranje slucajnih brojeva, ostvareno je kroz funkcijske pozive init_randhash i gen_randhash. Osim generatora jednako vaan faktor pri generiranju slucajnih brojeva je sjeme. Problem je kako odrediti nedeterministicku informaciju na racunalu. Jedan od nacina je koristiti vanjski uredaj koji na temelju mjernih uredaja i prikladnih A/D pretvaraca, informacije iz vanjskog svijeta pretvara u digitalni oblik i alje racunalu. Na vecini unix platformi, pa tako i linuxu postoji /dev/random uredaj koji sadri entropiju sustava. Prilikom koritenja racunala, podizanja operacijskog sustava dolazi do interakcije komponenata racunala. Korisnik se prijavljuje za rad na racunalu, koristi razne alate, slua glazbu, gleda filmove. Sve te akcije bilo da je rijec o stisnutoj tipci na tipkovnici, pomaku mia cine entropiju sustava. Pristup /dev/random uredaju i citanje s /dev/random uredaja prikazano je linijama koda na slici 5.2.1. Entropija je mjera koja kae koliko je generirana informacija nedeterministicka. . . . . . . . . . . . fd = open(/dev/random,O_RDONLY); .......... read( fd,buffer,knt ) Slika 5.3.4.1. Uporaba /dev/random uredaja

    5.4 Instalacija PAM SRP modula PAM klijent i posluitelj ne moraju se nalaziti na istim racunalima, stoga je izvorni kod klijenta odvojen od izvornog koda posluitelja u zasebnu datoteku. Dvije komponente znace dvije razlicite instalacije. Instalacija PAM SRP modula zahtjeva od korisnika root ovlasti. Izvorni kod klijenta PAM SRP modula nalazi se u pamsrpklijent.tar.gz datoteci. Kako bi se postupak instalacije nastavio modul je potrebno dekompresirati i dearhivirati to se postie naredbama:

    gunzip pamsrpklijent.tar.gz (1) tar -xvf pamsrpklijent.tar (2)

  • 51

    Nakon izvrenih naredbi u trenutno direktoriju, gdje je smjetena pamsrpklijent.tar.gz datoteka kreiran je poddirektorij srp_klijent. Administrator se zatim premjeta u srp_klijent direktorij naredbom: cd srp_klijent. Srp_klijent direktorij izmedu ostalog sadri Makefile datoteku. Implementacija klijenta ima odredene zahtjeve koje se odnose na biblioteke potrebne za rad SRP PAM modula. Testiranje da li su zahtjevi zadovoljeni postie se pozivom make programa, tocnije make check. sh ./test.sh make check pretpostavlja da su PAM biblioteka i GNU gmp biblioteka instalirane na za to standradna mjesta sto znaci da je libpamc.so.xx u /lib direktoriju odnosno da je gmp u /usr/local/lib PAM installed Pam application header found Pam module header found GMP installed Gmp header found here to serve: Administrator pokrece program make, koji prevodi datoteke izvornog koda u izvrni oblik i povezuje ih sve u jednu konacnu izvrnu datoteku, kao to je prikazano u nastavku. here to serve:make gcc -c newpam.c -o newpam.o gcc -c client_f.c -o client_f.o gcc -c srpshare.c -o srpshare.o gcc -c PRNG.c -o PRNG.o PRNG.c:3: warning: static declaration for `spc_increment_mcounter' follows non-static gcc -c misc.c -o misc.o misc.c: In function `D_printf': misc.c:392: warning: passing arg 1 of `free' discards qualifiers from pointer target type gcc -c entropy.c -o entropy.o gcc -c hmac.c -o hmac.o gcc -c bigInt.c -o bigInt.o gcc -c sha1.c -o sha1.o gcc -shared -Xlinker -x -o newpam.so newpam.o client_f.o srpshare.o PRNG.o misc.o entropy.o hmac.o bigInt.o sha1.o -lgmp here to serve: Vecina Linux distribucija definira lokaciju na kojoj se PAM moduli nalaze. Mandrake Linux je tu funkciju namijenio /lib/security direktoriju, dok Suse distribucija koristi /usr/lib/security.

  • 52

    Naredba make install kopira modul na za njega predvidenu lokaciju. Dodatna opcija je make clean. Funkcija je jednostavna. Obrisati izvrne datoteke komponenti koje cine modul. Nakon instalacije SRP posluitelja potrebno je izvesti program seedfile. Program seedfile generira saetak dijela entropije sustava u trenutku njegova izvodenja. Dobiveni saetak sprema u datoteku definiranu parametrom SFILE specificiranim u konfiguracijskoj datoteci modula.

    5.5 Instalacija SRP posluitelja Izvorni kod posluitelja PAM SRP modula nalazi se u pamsrpserver.tar.gz datoteci. Instalacija SRP posluitelja od korisnika zahtjeva root ovlasti. Instalacija posluitelja se nastavlja nakon to administrator izvede slijedece naredbe:

    gunzip pamsrpserver.tar.gz (1) tar -xvf pamsrpserver.tar (2)

    Rezultat izvodenja gornjih naredbi je srp_server poddirektorij. Naredbom cd srp_server administrator se pozicionira u srp_server direktorij.

  • 53

    Srp_server direktorij sadri Makefile datoteku. Makefile datoteka sadri pravila na temelju kojih GNU make program generira izvrne datoteke iz izvornog koda. Posluitelj komponenta u radu zahtjeva GNU gmp biblioteku. Prije no to instalira posluitelj, administrator provjerava da li su sve biblioteke o kojima posluitelj komponenta ovisi, na racunalu instalirane. Naredba make check obavlja provjeru. here to serve:make check sh ./test.sh make check pretpostavlja da je GNU gmp biblioteka instalirana na za to standradno mjesto odnosno da je gmp u /usr/local/lib GMP installed Gmp header found here to serve: Naredba make prevodi izvorni kod SRP posluitelja i komponenti o kojima SRP posluitelj ovisi u izvrni oblik. here to serve:make gcc -c newserver.c -o newserver.o gcc -c srp_server.c -o srp_server.o gcc -c srpshare.c -o srpshare.o gcc -c misc.c -o misc.o gcc -c entropy.c -o entropy.o gcc -c PRNG.c -o PRNG.o gcc -c hmac.c -o hmac.o gcc -c bigInt.c -o bigInt.o gcc -c sha1.c -o sha1.o gcc -o srpServer newserver.o srp_server.o srpshare.o misc.o entropy.o PRNG.o hmac.o bigInt.o sha1.o -lgmp here to serve: Nakon instalacije SRP posluitelja potrebno je izvesti program seedfile. Program seedfile racuna saetak dijela entropije sustava u trenutku izvodenja programa. Rezultat zapisuje u datoteku odredenu parametrom SFILE definiranim u konfiguracijskoj datoteci posluitelja.

    6. Programski sustav koji demonstrira primjenu PAM SRP modula

    6.1 Opis aplikacije Primjena Srp Pam modula demonstrirana je pomocu aplikacije app_simple. Funkcija aplikacije app_simple je da autentificiranim korisnicima omoguci pristup informaciji o tocnom vremenu. Zadatak autentifikacije korisnika aplikacija preputa PAM SRP modulu i okolini. Aplikacija app_simple koristi PAM modul

  • 54

    to znaci da mora implementirati funkciju razgovora. Inicijalizacija PAM okoline je jedan od preduvjeta koritenja PAM modula i ostvaruje se funkcijskim pozivom pam_start. Nakon uspjene inicijalizacije okoline, aplikacija poziva pam_authenticate funkciju. Ovisno o povratnoj vrijednosti pam_authenticate funkcije korisnik je ili autentificiran ili nije. Ukoliko je korisnik autentificiran na zaslonu racunala na kojem se nalazi ispisuje se tocno vrijeme, a ukoliko je autentifikacija bila neuspjena ispisuje se poruka Autentifikacija, ne. status=PAM_ABORT; retval=pam_start(service,user,&konv,&pamh); if(retval==PAM_SUCCESS) { val=pam_authenticate(pamh,0); if(val==PAM_SUCCESS) { printf(Welcome to exact time Service\n); tc=time(NULL); printf(%s\n,ctime(&tc)); status=PAM_SUCCESS; } else { printf(Autentifikacija,ne!); } pam_end(pamh,status); }

    Slika 6.1.1 Dio izvornog koda app_simple aplikacije

    6.2 Instalacija aplikacije Aplikacija je sadrana u appPam.tar.gz datoteci. Administrator izvodi naredbe:

    gunzip appPam.tar.gz (1) tar -xvf appPam.tar (2)

    Rezultat je poddirektorij app_simple. Promjena trenutnog direktorija u app_simple ostvarena je naredbom cd app_simple.

  • 55

    Naredba make check provjerava da li su sve biblioteke o kojima aplikaciji ovisi instalirane. Naredba make prevodi izvorni kod app_simple.c datoteke u izvrni. Naredba make install kopira osnovnu konfiguracijsku datoteku app_simple aplikacije u /etc/pam.d/ direktorij.

    6.3 Konfiguracija aplikacije Konfiguracijska datoteka app_simple aplikacije je /etc/pam.d/app_simple. Osnovna konfiguracija prikazana je na slici 6.3.1.

    Auth required /lib/security/pamsrp.so pass_file nexus.txt

    Slika 6.3.1 Sadraj /etc/pam.d/app_simple datoteke

  • 56

    6.4 Primjer koritenja aplikacije Demonstracija rada aplikacije zahtjeva pokrenut SRP posluitelj, na racunalu i portu specificiranom /etc/pam_clientsrp.conf datotekom, te SRP PAM modul pamsrp.so u /lib/security direktoriju.

  • 57

    Slika 6.4.1 Koritenje aplikacije

    Slika 6.4.2 Korisnik je upitan za lozinku

  • 58

    Slika 6.4.3 Korisnik je unio lozinku

    Slika 6.4.4 Autentifikacija uspjena

  • 59

    7. Analiza rjeenja PAM SRP modul povezuje fleksibilnost PAM modula i sigurnost Srp protokola u jednu kompaktnu cjelinu. Modul u obicajnom reimu rada zahtjeva koritenje prostih brojeva. Trenutna implementacija koristi unaprijed generirane brojeve, pohranjene u konfiguracijsku datoteku. Generiranje novog para primarnih brojeva u realnom vremenu koritenjem GNU gmp datoteke nije idealno rjeenje. Izvori entropije sustava nisu super nedeterministicki. Implementacija modula u C++ donijela bi jo malo estetike, ali i kompleksnosti zbog mijeanja C i C++ programskih jezika. Koritenjem raznih struktura pokuano je dobiti na modularnosti i sposobnosti nadogradnje modula. Naruena je sigurnost algoritma za generiranje saetka koji modul koristi. Prvo poboljanje koje se namece je koritenje drugog algoritma generiranja saetka, kao to je npr. RIPEMD. Potpunija verzija ukljucivala bi dodatne vanjske uredaje, kako za generiranje slucajnih brojeva, tako i za prikupljanje entropije.

  • 60

    8. Zakljucak U ovom diplomskom radu ostvaren je PAM autentifikacijski modul koji implementira SRP protokol. Ostvaren je u programskom jeziku C. Implementaciju bi moglo poboljati koritenjem nove biblioteke koja bi upravljala alokacijom i oslobadanjem memorije. Nakon instalacije koja je pomalo zahtjevna, jer zahtjeva instalaciju i konfiguraciju i posluitelja, PAM SRP modul je moguce koristiti kao i svaki drugi autentifikacijski modul. Ostvareni modul namijenjen je manjim korisnickim sredinama. Generiranje veceg broja zahtjeva odjednom, zbog ogranicene velicine reda u koji ih posluitelj smjeta rezultiralo bi neuspjehom.

  • 61

    Literatura 1. V. Samar, R. Schemers, RFC86 : Unified Login with Pluggable Authentication

    Modules ( PAM ), 1995 2. T. Wu, RFC2945: The SRP Authentication and Key Exchange System, 2000 3. M. Bellare, H. Krawczyk, R. Canetti RFC2104: HMAC : Keyed-Hashing for

    message authentication, 1997 4. D. Eastlake 3rd, P. Jones RFC 3174: SHA US Secure Hash Algortihm (

    SHA1 ), 2001 5. Donald Knuth,Art of the computer programming, volume 2, Semi-numerical

    algorithms 6. John Vega, Zachary Girouard, Matt Messier, Secure Programming Cookbook

    for C and C++ 7. Andrew G. Morgan,The Linux-PAM System Administrator Guide 8. Andrew G. Morgan,The Linux-PAM Module Writer's Guide 9. Andrew G. Morgan,The Linux-PAM Application Developers' Guide 10. Savio Fernandes, KLM Reddy, Securing Applications on Linux with PAM 11. Brian Jones, Understanding PAM 12. Charles P. Pfleeger, Shari Lawrence Pfleeger, Security in Computing, 2002