PAM + SSH + google auth kérdés [SOLVED]

Fórumok

Sziasztok!

Szórakoztam ma a google-authenticator nevű csomaggal. Sikerült konfigurálni a /etc/pam.d/ssh-d úgy, hogy a "keyboard-interactive" metódus bekérje a jelszót és a google auth kulcsot is. Valahogy így:

auth required pam_unix.so no_warn try_first_pass
auth required /usr/local/lib/pam_google_authenticator.so

Ezek után, ha a /etc/ssh/sshd_config-ba ezt teszem:

Match User someuser
AuthenticationMethods keyboard-interactive

Akkor bekéri a jelszót és a google auth kódot is. Namost én azon gondolkozom, hogy a wheel csoportban levő (su -zni képes) felhasználóknál kérek be ssh kulcsot, jelszót és google auth kódot is. Ezt így lehetne elérni:

Match User someuser
AuthenticationMethods publickey,keyboard-interactive

Viszont azt is szeretném, ha a "sima" felhasználók ssh kulcs + google auth key megadásával tudnának bemenni. Jelszó nélkül. (Tudom hogy ez nem jó ötlet, de tegyük föl hogy ezt szeretném.) Namármost, az ssh config-ban vagy megadom a keyboard-interactive-ot, vagy nem adom meg. Ha megadom, akkor a jelszót is be kell írni, ha nem akkor meg a google auth kódot se kell beírni.

Nyilván ha a pam.d-ből kiszedem a pam_unix.so sort, akkor a jelszót nem kell beírni - de ez sajnos nem egy felhasználóra vonatkozik, hanem az összesre.

Nekem olyan megoldás kellene, ami egy adott user-re mindent bekér (ssh kulcs, jelszó, google auth key), egy másik adott user-re pedig csak ssh kulcs + google auth kódot.

Lehetséges ez?

Hozzászólások

Vagy ha ez nem megy, akkor legalább azt szeretném elérni, hogy a su parancsnál /etc/pam.d/su állományban elő tudjam írni a google auth kód ellenőrzését a "root" user-re. De sajnos ezt sem tudom. Az a legnagyobb gond, hogy például a "su" parancs ugyan azt a policy-t írja elő minden user-re. Valami olyasmi kellene nekem, hogy ha a user = root, akkor a végére betegyen még egy auth module-t. De sehol nem találtam ilyet.

A rendszer alapértelmezett config állományban van ugyan egy ilyen:

auth requisite pam_group.so no_warn group=wheel root_only fail_safe ruser

és ez olyan, mintha root_only -ra működne, de ez a pam_group.so modul egy option-ja. A pam.d(5) manual szerint:

MODULE OPTIONS
Some PAM library functions may alter their behavior when called by a ser-
vice module if certain module options were specified, regardless of
whether the module itself accords them any importance. One such option
is debug, which causes the dispatcher to enable debugging messages before
calling each service function, and disable them afterwards (unless they
were already enabled). Other special options include:

De konkrétan a pam_google_authenticator.so modulhoz semmi ilyesmit nem találtam. Itt van a modul leírása:

https://github.com/google/google-authenticator/tree/master/libpam

Az egyedüli user-re vonatkozó beállítás azt mondja meg, hogy hol tárolja a kulcsokat a szerver.

lehet csinalni tobb match blockot sshd configban

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

Tipp: csinálsz egy file-t, ami soronként listázza azokat a csoportokat, akik számára megköveteled a google auth-ot, majd a google authenticator-os sor elé:

auth sufficient pam_listfile.so item=group sense=deny onerr=??? file=/etc/csoportok

Van viszont pam_group, de azzal sem tudom megcsinálni. Itt a manual:

https://www.freebsd.org/cgi/man.cgi?query=pam_group&sektion=8&manpath=f…

A probléma az, hogy a "scufficient" úgy működik ahogy:

sufficient If this module succeeds, the chain is broken and the result
is success. If it fails, the rest of the chain still runs,
but the final result will be failure unless a later module
succeeds.

Ez azt jelenti, hogy ha a teszt sikeres, akkor a következő auth modul (google auth) le sem fut. Ha pedig sikertelen, akkor a google auth is lefut, de teljesen mindegy hogy milyen eredménnyel, mert úgysem fog beengedni. A "sikertelen" ág nekem nem jó! :-(

"unless a later module succeeds" - vagy mégis, csak nem olvastam el rendesen :-p

Szóval ez lenne az ideális:

auth sufficient pam_user.so target=non_root
auth required /usr/local/pam_google_authenticator.so

A pam_user.so sikeres lenne, ha a cél user nem root. Ha viszont root, akkor a következő modullal folytatná.

pam_user.so sem létezik FreeBSD alatt. A pam_group-nál pedig azt lehetne megadni, hogy "group=wheel". De olyat nem lehet megadni, hogy "not wheel".

"A pam_group-nál pedig azt lehetne megadni, hogy "group=wheel". De olyat nem lehet megadni, hogy "not wheel"."

deny
Reverse the meaning of the test, i.e., reject the applicant if
and only if he or she is a member of the specified group.
This can be useful to exclude certain groups of users from
certain services.

Akkor a pam_exec lehet a megoldás.

http://blather.michaelwlucas.com/archives/2573

Nos, nem egészen értem hogy milyen megfontolásból került bele a FreeBSD alap PAM moduljai közé a pam_exec úgy, hogy a pam_listfile meg hiányzik? Tök jó lenne ha nem kellene programokat írni ahhoz, hogy ilyen egyszerű dolgot be lehessen állítani.

SIKER!!!!

/usr/sbin/pam_not_root.sh -be:

#!/bin/sh
if [ $PAM_USER != "root" ]
then
exit 0
else
exit 1
fi

Utolsó auth sor /etc/pam.d/su és etc/pam.d/login -be:

auth include system

Utolsó két sor /etc/pam.d/system -be:

# google auth
auth sufficient pam_exec.so /usr/sbin/pam_not_root.sh
auth required /usr/local/lib/pam_google_authenticator.so

A shell script a PAM_USER környezeti változóban megkapja a cél user nevét, és ha az nem root, akkor a visszatérési értéke 1. Ennek hatására a chain megszakad, és sikeres a bejelentkezés. Ha viszont root, akkor a visszatérési érték nulla, és a pam_google_authenticator-nak is sikeresnek KELL lennie. Jobb lett volna a pam_listfiles.so. de az nincs FreeBSD-ben. Hát ez van!

Köszönöm a segítséget!