MakePass v2.0.0 && PassHandler v1.0.0

Pár évvel ezelőtt írtam egy jelszógenerátort, ami egy bemeneti stringből (pl. 'username@domain') tudott generálni egy jó hosszú és kacifántos jelszót (egész pontosan egy Base64-kódolt SHA-1 hash-et csinált a bemenetből). Akkor volt, aki nehezményezte, hogy a cucc nem képes tárolni sem userneveket, sem adott jelszavakat, dehát ezen nincs mit csodálkozni, mert ez egy jelszógenerátor, nem jelszótár. Viszont, volt javaslat arra, hogy mire is alapulhatna egy olyan utility, ami tudná ezt. Ez pedig a dmenu.

(Nem látszanak a képek? Klikk ide.)

Mielőtt azonban rátérnénk a lényegre, azért megemlíteném, hogy az említett jelszógenerátorból (makepass) kijött a v2.0.0-ás verzió, van benne manual (-h, -help, --help kapcsolókkal előcsalható, fel vannak sorolva benne a függőségek (sha1deep, base64, opcionálisan xsel, vagy xclip), most már nem csak vágólapról, vagy pop-up terminálból/Zenity-ből tudja behúzni a phrase-t, hanem argumentumból is és a generált jelszót sem csak a vágólapra tudja visszamásolni, hanem a stdout-ra is ki tudja köpni. A flagek:

  • -Oclip: kimenet a vágólapra
  • -Ostdout: kimenet az stdout-ra
  • -Iprompt: bemenet felugró terminálból vagy Zenity-ből beírva
  • -Iclip: bemenet vágólapról
  • -Iarg: bemenet argumentumból

Letölthető innen: http://oscomp.hu/?details/MakePass_v2.0.0_(CP)_1559

És akkor most rátérhetünk a dmenu-vezérelt password managerre. (Illetve előtte még egy megjegyzés a dmenu-vel kapcsolatban: a topicban akkor megénekelt fontconfig probléma még mindig él és érinti az újabb verziókat is, de szerencsére az akkor a 4.9-hez publikált patchem is jó még mindig; tesztelve lett az azóta kijött 5.0-val és 5.1-gyel is.)

A cuccnak musthave függősége a dmenu (értelemszerűen), valamint a sed. dmenu-ből olyan verzió kell, ami támogatja a -l - azaz a többsoros - opciót. Nem tudom, hogy mikor debütált ez a feature, mert nem találtam sehol changelogot, csak commitlistet, abból meg bányássza vissza a hóhér... A 2017-es 4.7 már tudja ezt, viszont pl. a Solaris 10 alatti CSW-ben lévő 2009-es 4.0 nem és az újakat nem is lehet leforgatni rajta; a ft2build.h hiánya még orvosolható egy export C_INCLUDE_PATH="/usr/sfw/include/:/usr/sfw/include/freetype2" paranccsal, de utána felhajigál még egy tonna hibát...
Update: A 4.1-esben jött be ez az opció és a 4.1.1-est le is lehet forgatni Solaris 10 alatt, csak dmenu.c elejére be kell biggyeszteni a #define _XPG4_2 sort. (A CFLAGS-es megoldások nem működtek.)
(A többi standard CLI tool-t nem sorolom fel, mert úgyis részei minden UNIX alatt az alaptelepítésnek.) Opcionális még - annak függvényében, hogy hogy fogjuk használni a cuccot - az xsel, vagy az xclip (vágólapműveletekhez), az xdotool az űrlapokba/akárhova "begépelésének" automatizálásához, a ccrypt és a base64 a nem generált passwordok titkosításához, a zenity a passwordok titkosításának feloldásához szükséges master password bekéréséhez és - értelemszerűen - a makepass a nem tárolt jelszavak generálásához. (Note: az xdotool érzékeny a billentyűzetkiosztásra, szóval azt feltétlen állítsuk be setxkbmap-pal a megfelelőre, ha nem akarjuk, hogy "gipszjakab" helyett "gipsyjakab"-ot írjon be esetleg...)

A script működéséről a következőket szükséges tudni.

Először is adott a $HOME könyvtárban a .passhandler fájl. Ennek minden egyes sora egy "account". A sorok felépítése úgy néz ki, hogy van négy tabulátorral elválasztott mezője, amik a következőek: Domain, Username, Tabcount, Password. Ebből az első kettő kötelező, lévén ez alapján találja meg a kiválasztott accountot, de ezekből rakja össze a nem tárolt jelszavak phrase-ét is (Username@Domain).

A Tabcount nem kötelező, ha nincs a sorban, akkor 1-nek veszi a script és az alapján fog dolgozni. Maga a mező csak akkor érdekes, ha -OtypeA flag-gel küldjük meg a futtatott scriptet (ld. később). Ekkor ugyanis, miután "begépelte" (xdotool segítségével) a Username mező tartalmát, annyi tabulátort fog "begépelni", amennyi ennek a mezőnek a tartalma. Ez azért van, mert nem minden login űrlap dob át egy TAB betaposása után a jelszó mezőbe (pl. a discuss.haiku-os.org-nál is kettő kellett régebben, mert a srácok berakták az elfelejtett jelszó gombját a két mező közé), így ezt is lehet paraméterezni.
Speciális eset a nulla, ami a "megszakított" "begépelést" eredményezi. (Note: a mezőt a script validálja, csak számokat fogad el.) Van olyan site (mail.gmail.com), ahol nincs két mező, hanem a jelszót a login begépelése után adja csak oda. Ilyen esetekben van az, hogy ha a Tabcount nulla, először "begépeli" a felhasználónevet, majd egy Return-t, utána feldob egy dmenu-s "Hit Return when password can be typed." üzenetet, amit ha megteszel, "begépeli" a jelszót is, majd egy Return-t.

És végül a Password mező sem kötelező. Ha nincs kitöltve, akkor jön képbe a makepass, egyébiránt - értelemszerűen - a - titkosított vagy plaintext - jelszó terpeszkedik itt.
Ha már szóba került a jelszavak titkosítása, az a következőképpen működik. Amennyiben a $HOME könyvtáron belül létezik a .passhandler.pwe, akkor a script úgy veszi, hogy az összes tárolt jelszó ccrypt-tel van titkosítva és base64-gyel encode-olva.

echo -n "PasswordOfDaAccount" | ccrypt -e -K "MasterPassword" | base64 | tr -d "\r\n"

(A végén a tr nem viccből van ott; egynémelyik OS által szállított őskövület base64-ek nem ismerik még a -w kapcsolót, ill. az OpenBSD-é még "\r" karaktert is pakol a kimenet végére; a hajam kihullott, mire leesett, hogy azért "gépel be" a jelszó végén egy sortörést, miközben a newline-ok mindenünnen ki vannak szűrve, mert az nem newline, hanem carriage return...)
Ilyen esetben indításkor ill. újratöltéskor (ld. később) a script a makepass-hoz hasonlóan bekéri a mesterjelszót egy felugró terminálablakkal, vagy a zenity segítségével. (Az utolsó GTK2-es Zenity egyébként még mindig elérhető itt.)
Illetve, amennyiben a .passhandler.pwe file nem üres, akkor úgy veszi, hogy annak a tartalma a mesterjelszó. Ez most így biztos némi szemöldökráncolást eredményez pár embernél, hogy ennek mi értelme van, hiszen ennyi erővel lehetne plaintext a tárolás és kész, de nem ilyen egyszerű. Valószínűleg edge case lehet, de előfordulhat, hogy van egy .passhandler fájlunk, amit több gépen is használunk, viszont ezek közt van olyan gép is, amit csak mi használunk (így ott akár plaintextként is lehet őket tárolni) és olyan is, amit nem (így ott kell a titkosítás). Egyik megoldás az, hogy a biztonságos gépen tényleg plaintextben vannak, hogy ne kérjen mindig mesterjelszót, a többin meg titkosítva, hogy védve legyenek. Ha viszont nem akarunk két verziót tárolni és karbantartani, akkor a biztonságos gépen a .passhandler.pwe-ben ott figyelhet a mesterjelszó és így nem fogja bekérni, a többin meg nem és így ott be fogja kérni.

Itt jegyzem meg, hogy (a Tabcount kivételével) a mezőkben lehet használni a backslash-t escape-elésre.

És akkor most már térjünk rá a tényleges használatra is.
A cucc úgy működik, hogy elindítjuk a scriptet (passhandler -start &) cronból, profilból, a DE indítójából, vagy ahogy akarjuk és miután a script betöltötte a listát (előtte a fentiek függvényében kérvén a mesterjelszót, vagy sem), szépen fejbekólintja saját magát egy SIGSTOP-pal. Ilyenkor a script ugyanazt csinálja, mint bármelyik tisztességes windóz cca. tíz másodperc uptime után: lemerevedik a fárasba. Viszont ellentétben a lefagyott windózokkal ez csak arra vár, hogy parancsot adjunk neki, amit a következőképpen tehetünk meg: meghívjuk még egyszer a scriptet, valamelyik parancsot használva, ami megküldi az eredeti instance-et egy SIGCONT-tal és a megfelelő fájlokba kiírja a fő instance-nek a teendőket. A parancsok a következőek lehetnek:

  • -stop: Nomen est omen, ez leállítja a fő példányt.
  • -reload: Ez újból betölti a fájlokat, ha módosítottuk volna őket.
  • -Oclip: Feldobja a dmenu-vel a listát, a kiválasztott account jelszavát meg bedobja a vágólapra.
  • -Ostdout: Ugyanaz, csak a jelszót a stdout-ra köpi ki.
  • -OtypeP: Ugyanaz, csak a jelszót az xdotool-lal "begépeli".
  • -OtypeU: Ugyanaz, csak itt a felhasználónevet "gépeli be".
  • -OtypeA: Ez a fent részletezett funkció, amikor a Tabcount tartalmától függően mindkettőt "begépeli", vagy először a felhasználónevet, majd a "megszakítás" után a jelszót is.

Tehát, bedrótozzuk a kedvenc hotkey-einkre a funkciókat, majd el lehet indítani a programot. Utána a hotkeyek előcsalják a menüt

és lehet válogatni, hogy melyiket "gépeltessük be", vagy másoltassuk a vágólapra, vagy köpessük ki az stdout-ra, ha a flow-unk olyan, hogy a cucc kimenetét irányítottuk át valahova. Egyébként a dmenu szűrni is tud:

A cucc letölthető innen: http://oscomp.hu/?details/PassHandler_v1.0.0_(CP)_1603
Teszteltem Linux, FreeBSD és OpenBSD alatt. Solaris 10 és 11 alatt is próbáltam, de Solaris 10-en a dmenu miatt meghiúsult a dolog, ahogy írtam, a 11-es alatt meg kb. lehetetlen bármit csinálni, mert C fordító nincs alapból a rendszerben, ha pedig fel akarsz tenni valamit, akkor meg a "pkg install: Chain was rooted in an untrusted self-signed certificate." hibaüzenettel szórakoztat, amire az Oracle-nek az a válasza, hogy vegyél supportot, ha meg akarod oldani...így aztán egyetlen függőséget sem lehet hozzá felrakni, vagy épp lefordítani. (Sun RIP. :( ) De elvileg minden POSIX rendszer alatt mennie kéne, de lehet reportolni, ha nem megy. (Meg, ha valami más nem megy, azt is.)

Hát, ennyi volt, mese volt, döglött windóz benne volt. Aki használatra érdemesnek tartja, annak jó szórakozást. (&& report bugz plz.)