Mobil One Time Password Linux PAM rendszerhez

A minap akadtam rá a Mobile-OTP oldalra, ami leginkább - de nem kizárólag - a mobiltelefonra telepíthető klienssel való jelszógenerálásról szól.

A lényeg dióhéjban:

  • van egy 16 karakteres véletlenszerű betű-szám sor, ezt meg kell adni a kliensnek és a szervernek
  • a 4 jegyű PIN-t a szervernek kell ismernie és a felhasználónak
  • majd a rendszer veszi a UNIX epoch-tól számított időt másodpercben (10-es osztással)
  • a 16 karakterből, 4 jegyű PIN-ből és az időből képez a rendszer egy md5 hash-t
  • ennek a hash-nek az első 6 jegye lesz a belépő kód
  • a szerveren van egy ±3 perces ablak, amire ellenőrzi a klienstől kapott felhasználó által begépelt 6 karaktert. Érdemes az eszközök óráját szinkronban tartani
  • sikeres bejelentkezés esetén a szerver az aktuálisan megadott belépő kódot elmenti, ettől lesz one-time, és még egyszer nem lehet ezt használni

Nekem sikerült pam_exec-kel működésre bírni az oldalról letölthető scriptet, kisebb módosítással. A weboldalon lévő pam modult nem sikerült lefordítani Ubuntun, a pam_script megoldás esetlegesen működött.

A script a pam konfigokkal, bővebb leírással itt.

Hozzászólások

Esetleg „required” helyett „sufficient”-ként állítod be, és beállítasz utána valami alternatív autentikációs módszert. Ekkor nincs más dolgod, mint rossz kódot beírni, és akkor ugrik a következőre. Gondolom, lehet még bonyolítani.

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

ubuntu lucid alatt siman fordul a nativ pam modul.

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Kéne valami olyan, ami fejben kiszámolható: a gép megadja a függvény bemenetét, mi ebből kiszámoljuk fejben a visszatérési értéket, az a jelszó. Már volt abból problémám, hogy le volt merülve a mobilom, amikor e-mailt/fácsét akartam nézni… :-)

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

Mondjuk atan(0.47)?

Egyik egyetemi tanárnőm nem használt számológépet, 2 tizedesig fejben nyomta a végeredményt.

Ismerte a taylor sort, fejben osztott, szorzott és mondta a megoldást. Azóta is talány nekem, hogy hogyan tud valaki fejben 2 tizedesig exponenciális és trigonometrikus függvényeket számolni.

Kezdetben hitetlenkedtünk, hogy blöfföl és előre megtanulta, de mikor mi kérdeztünk, az is ment neki.

Nem vagyok otthon a hashelésben, de gondolom az atan()-nál egyszerűbbek is vannak… :-) – Persze ahhoz elég erős brute force-védelem kell, mert mintha több hashfüggvénnyel pont az lenne a probléma, hogy túl gyorsan kiszámolható.

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

Fejben számolásról volt szó, erről jutott eszembe egyik tanárom.

Hasonló, mint mikor mindenféle szám/betű krikszkrakszokat kirak az oldal a képernyőre és neked be kell írnod ugyanazt.

Képzeld el csavargatott betűkkel leírva mondjuk, hogy "árkúsz tángens nullaegísz negyvenhít".
Neked meg be kell írni 2 tizedesig a megoldást.

:)

Ezt mi jó régóta használjuk, az exchange owa elé tett apache reverse proxy-ra tettük plusz hitelesítésnek, nagyon jól működik. Probléma csak a userek miatt van, amikor kézzel állítgatják a telefonjukon az időt óraátállításkor.

Előnye, hogy szinte minden létező eszközre van program, a java verzió miatt. Amíg nem volt natív androidos kliens, a midlet azon is beizzítható volt, még az összes szutyok 15 éves nokián is.

Készítettem egy kis kibővített moduláris python scriptet PAM-hoz. A felhasználó magának tudja állítani az adatait. A script itt.