Enkratna gesla - večja varnost

Objavljeno: 30.9.2007 19:38 | Avtor: Marko Hölbl | Kategorija: Preizkusi | Revija: September 2007

Prijava v lasten strežnik z oddaljenega kraja odpira določena tveganja, saj je v računalniku, ki ga uporabljamo, morda nameščen beležnik tipkanja (key logger). Napadalec lahko ob pomoči beležnika pridobi podatke za dostop do našega domačega strežnika. Da bi se temu izognili, lahko uporabljamo enkratna gesla (angl. one-time-password). Vzpostavitev sistema enkratnih gesel v lastnem strežniku zahteva le nekaj korakov.

Poglavitna prednost enkratnih gesel je ta, da jih je mogoče uporabiti samo enkrat, saj po uporabi postanejo neveljavna. Napadalec se naknadno ne more prijaviti z enakim geslom. Dodatna lastnost enkratnih gesel je njihova "naključnost". Nemogoče je namreč iz trenutnega enkratnega gesla napovedati ali ugotoviti prihodnja. Klub temu je tudi princip enkratnih gesel mogoče napasti s t. i. vmesnim napadom (angl. Man-in-the-middle). Vendar je tak napad manj verjeten, saj zahteva dobro pripravo in veliko truda. Vmesni napad deluje tako, da se napadalec vrine med strežnik in odjemalec. Odjemalca prepriča, da je strežnik, in, nasprotno, strežnik, da je odjemalec. Tako se dokoplje do gesel ali drugih občutljivih podatkov.

Za izvedbo bomo uporabili program OPIE (One-time Passwords In Everything), ki ga je razvil United States Naval Research Laboratory (NRL). Strežniški del OPIE ustvari sekvenčno številko in seme (ang. Seed), ki rabita kot vhod v OTP kalkulator (kalkulator enkratnih gesel). Ta ob pomoči omenjenih podatkov in "statičnega" gesla izračuna enkratno geslo. Statično geslo (dolgo je 10 znakov) vnese sam uporabnik. S tem enkratnim geslom se uporabnik nato prijavi v strežnik.

Slika0; Shema delovanja strežniškega dela.

Namestitev, nastavitev in zagon strežnika OPIE

OPIE je namenjen Linuxu, vse nastavitve v članku pa se nanašajo na Ubuntu Linux 7.04. Poti, ki so uporabljene, so del distribucije Ubuntu Linux 7.04 in se ob uporabi drugih distribucij Linuxa lahko razlikujejo. Ker overjanje (prijava) v Linuxu temelji na t. i. Standard Pluggable Authentication Module (PAM), je mogoče standardni način prijave (uporabniško ime in geslo) preprosto zamenjati ali spremeniti. Tako lahko poljubno overjanje, v našem primeru overjanje SSH, nadgradimo z enkratnimi gesli. Seveda je treba za vse omenjene nastavitve imeti upraviteljske pravice (root).

Najprej je treba namestiti programsko opreme OPIE (strežniški in odjemalski del). Možno jo je dobiti predpripravljeno za številne distribucije, tudi za Ubuntu Linux 7.04:

apt-get install opie-client

apt-get install opie-server

V imeniku /etc/pam.d/ so konfiguracijske datoteke za overitvene storitve. Če imamo nameščen tudi SSH, Sambo ali druge storitve, so v imeniku ustrezne konfiguracijske datoteke. Konfiguracijska datoteka za SSH se imenuje ssh. V datoteki /etc/pam.d/ssh je torej treba vrstico @include common-auth zamenjati z:

auth sufficient pam_unix.so

auth sufficient pam_opie.so

auth required pam_deny.so

S tem smo OPIE dovolili uporabo v SSH.

Slika1; Spletna različica kalkulatorja OTP

Nadalje je treba omogočiti postopek poziv-odgovor (angl. challenge-response). To storimo tako, da v imeniku /etc/ssh/sshd_config nastavimo vrstico ChallengeResponseAuthentication yes. Nato nastavitve shranimo in na novo zaženemo storitev SSH (/etc/init.d/ssh restart). Zdaj moramo še ustrezno nastaviti OPIE, da bomo lahko za prijavo uporabili enkratna gesla. Izvedemo ukaz opiepasswd -c in tako omogočimo uporabo prijave z enkratnimi gesli trenutnemu (prijavljenemu) uporabniku. Program nas pozove, naj vnesemo vsaj desetmestno geslo, ki se bo uporabljalo za generiranje enkratnih gesel. Primer odgovora, ki ga program izpiše:

ID marko OTP key ist 499 ma1617

ROB ME UP DUCK CRY AQUA

Številka 499 predstavlja zaporedno številko, ma1617 pa seme. Druga vrstica predstavlja ustrezno enkratno geslo, sestavljeno iz šestih delov.

Pri prijavi v strežnik nam le-ta izpiše zaporedno številko in seme, ki rabita kot vhod v kalkulator OTP (skupaj z desetmestnim statičnim geslom). Če uporabljamo kalkulator, priložen programski opremi OPIE, izvedemo ukaz opiekey 498 wl3899. Težava nastane, ko nimamo dostopa do računalnika z opiekey kalkulatorjem. V tem primeru si lahko pomagamo s "tehniko listkov" (vnaprej si izračunamo gesla in jih natisnemo). Če želimo izračunati 20 enkratnih gesel, to storimo z naslednjim ukazom (glede na zgornji poziv):

dab@server:/etc/pam.d$ opiekey -n 20 499 ma1617

Using the MD5 algorithm to compute response.

Enter secret pass phrase:

480: HILL ELK AMOK NOOK CITY FIRM

481: MOOR BELT LYE JOB AHEM END

...

499: ROIL PEG LUKE RUSE DAWN ADD

Druga možnost je uporaba spletnih kalkulatorjev OPIE (npr. The Java OTP Calculator). Tretja, najbolj "elegantna" rešitev, pa je uporaba mobilnega telefona. Lastniki mobilnih telefonov, ki podpirajo javo, lahko uporabijo javansko izvedbo kalkulatorja OTP za mobilne telefone, imenovano jotp. Ob pomoči kalkulatorja, sekvenčne številke in semena nam mobilni telefon izračuna enkratno geslo. OTP kalkulator za mobilne telefone jotp je mogoče dobiti v več različicah. Najpreprostejše različice lahko izvajamo na skoraj vsakem mobilnem telefonu, ki podpira Java Micro Edition (JME).

Slika2; OTP kalkulator na mobilnem telefonu

Kaj narediti, ko odjemalca SSH ni na voljo?

Ker odjemalec SSH ni standardna programska oprema v okenskih računalnikih, ga tam pogosto ni. V tem primeru si pomagamo z Ajaxterm, ki omogoča prikaz ukazne vrstice oz. lupine SSH prek spletnega vmesnika v spletnem brskalniku. Za prijavo v domači strežnik tako potrebujemo le spletni brskalnik.

Namestitev Ajaxterma je preprosta: apt-get install ajaxterm. Storitev privzeto posluša na vratih 8022, vendar samo za krajevni promet (angl. local traffic). Zato je treba uporabiti posrednika (angl. proxy), ki ustrezno preusmerja omrežni promet. Dodatno je priporočljivo promet med odjemalcem (npr. v cybercafeju) in strežnikom šifrirati. Dobro znan spletni strežnik Apache, ki je privzeto že nameščen v številnih Linux distribucijah (tudi Ubuntu), ponudi tako SSL kot posredniške funkcionalnosti. Če nimamo nameščenega strežnika Apache2, ga namestimo z ukazom apt-get install apache2. Če želimo uporabljati SSL (HTTPS), je treba namestiti še certifikat. To opravi ukaz apache2-ssl-certificate. Če ukaz ne deluje, si lahko pomagamo z ukazi:

openssl genrsa -out apache.key 1024

openssl req -new -key apache.key -out apache.csr

openssl x509 -in apache.csr -out apache.pem -req -signkey apache.key -days 730

V obeh primerih je treba odgovoriti na zastavljena vprašanja. Certifikat ima omejeno veljavnost (730 dni). Po poteku veljavnosti ga je treba znova generirati. Za konec je treba SSL in posredniški modul še aktivirati:

a2enmod ssl

a2enmod proxy

Dodatne nastavitve

Ker smo rešili težave z odjemalci, lahko nadaljujemo s konfiguracijo strežnika. V datoteki /etc/apache2/port.conf je najprej treba dodati vrstico Listen 443. Za delovanje navideznega strežnika na vratih 443 (HTTPS) strežnik Apache potrebuje konfiguracijsko datoteko. Najpreprosteje je, če kopiramo datoteko, ki se uporablja za vrata 80 (standardni spletni strežnik):

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl

ln -s /etc/apache2/sites-available/ssl /etc/apache2/sites-enabled/ssl

Nato datoteko /etc/apache2/site-available/ssl ustrezno prilagodimo:

<VirtualHost *:443>

ServerName localhost

SSLEngine On

SSLCertificateKeyFile ssl/apache.pem

SSLCertificateFile ssl/apache.pem

ProxyRequests Off

<Proxy *>

Order deny,allow

Allow from all

</Proxy>

ProxyPass /ajaxterm/ http://localhost:8022/

ProxyPassReverse /ajaxterm/ http://localhost:8022/

</VirtualHost>

V osnovi je možno kot vrata HTTPS uporabiti tudi poljubna druga vrata, vendar se morajo vrata iz obeh datotek ujemati (ssl in ports.conf). Z ukazom a2ensite ssl aktiviramo SSL z novo konfiguracijsko datoteko. Praktične nasvete za konfiguracijo je možno dobiti tudi na spletni strani Ajaxterma. V zgornjem primeru uporabljamo pot /ajaxterm/ za preusmeritev. S tem je mogoče uporabljati SSL za "standardne" spletne strani in hkrati uporabljati Ajaxterm prek SSL. Ko uporabljamo Ajaxterm, preprosto dodamo pot ajaxterm/ k naslovu našega strežnika: https://www.example.com/ajaxterm/. Da lahko uporabljamo nove nastavitve, je seveda treba znova zagnati spletni strežnik (/etc/init.d/apache2 restart).

Slika3; Uporaba Ajaxterma omogoča dostop SSH do domačega strežnika tudi brez odjemalca SSH.

Za konec

Pri delu na daljavo je treba biti pazljiv, da ne izvajamo ukazov, ki potrebujejo upraviteljska pravila, saj v tem primeru v lupino vnesemo geslo, ki ga lahko zazna morebitni beležnik tipkanja. Privzeto je sicer mogoče, da uporabljamo tudi "klasično" prijavo v naš strežnik (hkrati s prijavo OTP), vendar je priporočljivo strežnik nastaviti tako, da dovolimo normalno prijavo samo krajevno, vse prijave na daljavo pa morajo potekati prek enkratnih gesel.

Tudi ko uporabljamo povezavo SSL, moramo biti pazljivi pri potrjevanju sprejemanja certifikatov. Kot že rečeno, nas zaščita z enkratnimi gesli ne obvaruje pred vmesnimi napadi. Sicer pa velja, da popolne zaščite tako ali tako ni mogoče doseči.

Koristne povezave

Wikipedia:One-time password, en.wikipedia.org/wiki/One-time_password

One Time Passwords in Everything (OPIE), www.inner.net/opie

Linux-PAM, www.kernel.org/pub/linux/libs/pam

Ubuntu Linux 7.04, www.ubuntu.com

Apache2 SSL setup howto, ubuntuforums.org/archive/index.php/t-4466.htm,
https://help.ubuntu.com/community/forum/server/apache2/SSL

Spletni OTP kalkulator "The Java OTP Calculator", www.cs.umd.edu/~harry/jotp

JOTP za J2ME, www.ii.uib.no/~janfrode/jotp

Spletna stran Ajaxterma, antony.lesuisse.org/qweb/trac/wiki/AjaxTerm

Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!
Prijava

ph

Komentirajo lahko le prijavljeni uporabniki