Linux rendszereken hogyan vannak tárolva a felhasználók jelszavai? Valószínűleg felmerült már ez a kérdés abban, aki már legalább egyszer elfelejtette . Ezt mutatom be röviden, így egy magától értetődő jelszócserélési metódus is felmerül. (A bejegyzés lényege nem a jelszó megváltoztatása, azt egyszerűbben is meg lehet oldani; hanem annak bemutatása hogyan van tárolva - amolyan ma is tanultam valamit - , az már csak egy kellemes mellékhatás)
A jelszavak nem "plain text", azaz egyszerű szövegként vannak elmentve, hiszen így könnyen kiolvashatóvá és megszerezhetővé válnának. Ehelyett, ezek hash-e (hasítófüggvény által generált karaktersorozat) van tárolva a /etc/shadow fájlban, mégpedig "sózva" (salt).
Ha megnyitjuk látható hogy minden sorban egy-egy felhasználó van. Egy sorban összesen 9 mező helyezkedik el, ezek kettősponttal vannak elválasztva, melyek rendre:
1 felhasználónév
2 jelszó
3 legutolsó_jelszócsere_időpontja
4 mikor_lehet_legkorábban_jelszót_váltani
5 mennyi_idő_után_kötelező_jelszót_cserélni
6 lejáró_jelszóra_figyelmeztetés_ideje
7 lejárt_jelszóval_még_mennyi_ideig_lehessen_belépni
8 felhasználói_fiók_lejárati_ideje
9 nem_használt
Például egy teljes sor így néz ki:
b@b-Standard-PC-i440FX-PIIX-1996 ~ % sudo cat /etc/shadow
[...]
b:$6$qotOpHGz$7hWOJvQ4Hcrm5qbHGMm.UAUEXr7Ncd4rSKmXjTgesQtQ593deQJpPV5Jjr6EPxWHaJ0SouAHmKqXqfe4YETuq1:17271:0:99999:7:::
Hirdetés
Látható hogy nem minden mező van használva, mert nem mindegyik kötelező (pl a felhasználói fiók lehet "örök életű")
A példában a felhasználó b
, és ami számunkra az érdekes, az a második mező.
Legelől a $6
a hasítófüggvény képzés során felhasznált kriptográfiai algoritmusra utal. Ezek a következőek lehetnek:
1 MD5
2a Blowfish
5 SHA-256
6 SHA-512
Tehát a mi esetünkben SHA-512 volt használva. (Szerintem mostanára nagyjából minden Linux disztribúcióban ez lett az alapbeállítás)
A következő két dollár jel között a "sózáshoz" használt karaktersor található: qotOpHGz
.
Majd jön a jelszó hash-e: 7hWOJvQ4Hcrm5qbHGMm.UAUEXr7Ncd4rSKmXjTgesQtQ593deQJpPV5Jjr6EPxWHaJ0SouAHmKqXqfe4YETuq1
Ennek a felhasználónak a jelszava a
.
A hasítófüggvények tulajdonsága, hogy azonos bemenetre azonos kimenetet kapunk, valamint ez a transzformáció csak egyirányú. Azaz a hash-t nem lehet visszaalakítani, így lehetőségünk van leellenőrizni hogy a felhasználó valóban a megfelelő jelszót írta-e be, anélkül, hogy azt valahol tárolnánk.
Lássuk az SHA-512 algoritmussal, qotOpHGz
sóval ugyanezt kapjuk-e!
b@b-Standard-PC-i440FX-PIIX-1996 ~ % mkpasswd -m sha-512 -S qotOpHGz -s <<< a
$6$qotOpHGz$7hWOJvQ4Hcrm5qbHGMm.UAUEXr7Ncd4rSKmXjTgesQtQ593deQJpPV5Jjr6EPxWHaJ0SouAHmKqXqfe4YETuq1
(Megjegyzés: az mkpasswd egy crypt(3) front end. Kezdőknek: a népszerű Ubuntu disztribúción a whois csomag tartalmazza.)
Perl alternatíva:perl -e 'print crypt("jelszo","\$6\$saltsalt\$") . "\n"'
Python alternatíva:python -c 'import crypt; print(crypt.crypt("jelszo", "$6$saltsalt"))'
(Jleszó egyértelmű hova megy, sózás a "saltsalt" helyére)
Egyezik. Ha egyszerűen egy szövegszerkesztő segítségével kicseréljük a karaktersorozatot, értelemszerűen megváltoztatjuk a felhasználó jelszavát. Az "a" karakter helyére beírva a kívánt jelszót előállítjuk azt tartalmat, amit már közvetlenül elhelyezhetünk a shadow fáljban. Továbbá, a salt-ot (só) is tetszőlegesen átírhatjuk, vagy azt kihagyva egy véletlen generáltat csatol hozzá a rendszer automatikusan.
Ha ténylegesen elfelejtettük a jelszavunk, meglévő rendszeren a fájl egyszerűen átírható egy "Live Linux-os" pendrive segítségével.
További infók:
man 5 shadow
man 3 crypt