Linux: hol van a felhasználóm jelszava?

írta: BoB, 7 éve

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:::

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