Compilare pam-u2f e integrarlo nell'autenticazione in Linux

Premetto che su CentOS 6 questo è ancora un work in progess, probabilmente sbaglierò io qualcosa, ma i binari e le librerie prodotte non riescono a instaurare una comunicazione corretta tra bus USB e sistema, anche se la Yubikey viene vista correttamente dal sistema.
La compilazione di pam-u2f richiede parecchie dipendenze e le librerie necessarie non sono disponibile nei repo ufficiali (incluso epel).

Preso dalla frustrazione ho tirato su una VM CentOS 7 e con grande soddisfazione ho trovato alcune librerie necessarie (json-c e hidapi) in epel. In questo caso la compilazione va a buon fine in maniera semplice semplice e possibile applicare il modulo pam-u2f a tutte quelle applicazioni pam-aware. Lo stesso vale per Debian 8.

Nel caso non sapeste cosa e come funzioni PAM, consiglio la lettura di questo ottimo articolo. Vi darà un'infarinatura generale sulle potenzialità di PAM, uno strumento spesso non considerato.

INSTALLAZIONE

Per prima cosa installiamo un po' di pacchetti necessari, per la guida prenderò in considerazione installazioni CentOS 6 e CentOS 7:

yum groupinstall "Development Tools"
yum install epel-release json-c json-c-devel hidapi hidapi-devel gengetopt help2man openssl openssl-devel check check-devel pam-devel

Da tenere in considerazione che alcuni pacchetti come json-c (presente nei repo, ma non adeguato) e hidapi non sono disponibili nei repo ufficiali di CentOS 6. Fare riferimento alla nota a piè di pagina.

Ora andiamo a scaricare il software Yubico

git clone https://github.com/Yubico/libu2f-host
git clone https://github.com/Yubico/libu2f-server
git clone https://github.com/Yubico/pam-u2f

I primi due pacchetti vanno compilati allo stesso modo. Basta entrare in ogni cartella e dare i seguenti comandi:

autoreconf --install
./configure
make check
make install

Arrivati a pam-u2f sarà necessario creare dei link simbolici per pkg-config (nel caso non fosse presente bisognerà installarlo).

ln -s /usr/local/lib/pkgconfig/u2f-*.pc /usr/share/pkgconfig/
cd pam-u2f
autoreconf --install
./configure
make check
make install

Il modulo pam_u2f.so verrà installato in /lib/security/ (32 bit) o /lib/x86_64-linux-gnu/security/ (64 bit). Controlliamo che il modulo abbia i permessi di esecuzione e andiamo avanti.
Verrà installato anche un piccolo binario (pamu2fcfg) che tornerà molto utile nella configurazione del modulo.

Ricordate che se non utilizzate l'utente root dovete inserire in /etc/udev/rules.d la regoletta udev che permette anche agli utenti non-root di accedere al device. Nel pacchetto libu2f-host sono presenti due regole 70-u2f.rules, una per le versioni più recenti di udev e uno per quelle più datate.

Per fare il reload delle rules di udev basta dare il comando:

udevadm control --reload-rules

CONFIGURAZIONE

A questo punto il grosso del lavoro è stato fatto. Però prima di mettere mano al file pam del servizio su cui vogliamo attestare il secondo fattore di autenticazione (ad esempio /etc/pam.d/sshd), dobbiamo andare a creare una mappa che associa la chiave x ad determinato utente.
Per fare questo andiamo a creare un /etc un file u2f_mappings (potete chiamarlo come volete) al cui interno andremo a metterci l'output dell'utility pamu2fcfg.
Ad ogni utente potranno essere associate più chiavi, basterà separare la tupla KeyHandle e UserKey con dei :

Quando andremo a lanciare il comando pamu2fcfg la nostra Yubikey inizierà a lampeggiare, basterà toccarla per far comparire sullo schermo le informazioni di cui avremmo bisogno. Se nessun parametro aggiuntivo viene fornito la Yubikey sarà associata all'account correntemente loggato e come appid e origin sarà utilizzato il valore della variabile d'ambiente $HOSTNAME.

Per attivare il secondo fattore di autenticazione U2F andiamo a inserire questa riga nel file di configurazione PAM.

auth sufficient pam_u2f.so authfile=/etc/u2f_mappings debug

Questo è solamente un esempio, poi sta a voi associare il corretto control flag e la PAM activity.

L'elenco degli argomenti che pam_u2f accetta sono disponibili a questa pagina.

Una piccola nota conclusiva.
U2F è sicuramente un protocollo di autenticazione interessante. Però si vede lontano un miglio che è pensato per essere applicato al mondo web. E quindi da il suo meglio quando viene implementato tra un webserver e un browser. Per carità pam_u2f funziona. Però difficilmente può essere implementato come sistema di autenticazione per accedere a una macchina remota. Esistono già delle patch per integrare U2F in OpenSSH, ma secondo me questo è un ottimo sistema per farsi del male, tanto tanto male.

UPDATE CentOS 6

Alla fine ho scoperto l'inghippo nelle distribuzioni CentOS 6. Semplicemente con il kernel 2.6.32, di default presente in tutte le CentOS 6, le yubikey non viene riconosciuta. Probabilmente qualche problema con libusb o hidapi. Utilizzando un Kernel 3.10 o addirittura 4.1 (disponibili su ElRepo) tutto funziona like a charm.

Alcuni pacchetti come hidapi e json-c non sono disponibili e quindi vanno compilati a mano.

https://github.com/signal11/hidapi
https://github.com/json-c/json-c

Anche in questo caso, una volta compilati e installate queste librerie sarà necessario creare dei link simbolici dei file .pc installati ("find / | grep -i hidapi | grep -i *.pc") per il pkg-config. I link andranno creati in in /usr/share/pkgconfig/.
La compilazione di questi due pacchetti è la prima cosa da fare in una CentOS 6 in quanto sono necessari per le librerie u2f.