Autenticazione postgresql tramite PAM per winbind e shadow

A volte si vuole far sì che gli utenti del database postgresql siano autenticati su un sistema esterno al database stesso. Per questo postgresql permette di verificare le credenziali tramite LDAP o kerberos o altro ancora, ma quando non c’è un metodo direttamente implementato in postgresql è possibile utilizzare PAM, che ha svariati connettori. In questo esempio prendiamo in considerazione l’autenticazione sul sistema operativo (utenti in /etc/passwd e password in /etc/shadow) e su dominio Windows (tramite winbind).

Nel seguito verrà assunto che l’autenticazione tramite PAM sia già configurata e funzionante. I comandi sono riferiti ad un sistema Debian Jessie.

La prima cosa da fare è definire un database, per esempio alcione, e impostare l’autenticazione via PAM nel file pg_hba.conf di postgresql così:

# TYPE DATABASE USER ADDRESS METHOD
host alcione all 127.0.0.1/8 pam

Alcuni inseriscono qui 127.0.0.1/32 che indica solo un indirizzo, mentre con il /8 si intendono tutti i possibili indirizzi dell’interfaccia loopback di questa macchina. Per i nostri esempi questo non fa differenza.

È possibile specificare un ulteriore parametro dopo la parola pam per indicare quale file di /etc/pam.d utilizzare per la configurazione. Se non lo si indica verrà utilizzato quello chiamato postgresql, se presente, o altrimenti quello other, che è sempre presente. Su Debian quello other non fa altro che includere i vari common-*, ma l’unica impostazione che veramente serve è quella auth. Se avete configurato winbind, ma non volete che gli utenti del dominio Windows accedano a Linux (ad esempio via ssh o X11), e volete che accedano solo a postgresql, allora copiate le istruzioni con winbind da common-auth e spostatele in postgresql e poi usate il comando pam-auth-update per disabilitare winbind dai metodi usati per l’accesso a Linux.

Successivamente, e questo è il passaggio più importante e meno documentato, è necessario bloccare il database e inserire il suo utente proprietario nel gruppo appropriato. Il proprietario del cluster che contiene il database si vede con il comando pg_lsclusters:

# pg_lsclusters 
Ver Cluster Port Status Owner Data directory Log file
9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log

Nel caso più diffuso il proprietario è un utente del sistema operativo chiamato postgres. Questo utente va aggiunto al gruppo shadow o al gruppo winbindd_priv, a seconda dell’autenticazione che si vuole attivare, con il comando:

# adduser postgres winbindd_priv

oppure

# adduser postgres shadow

Per verificare che il nome del gruppo sia proprio quello, potete controllare il gruppo del file /etc/shadow (nel caso vogliate l’autenticazione degli utenti locali), oppure della pipe /run/samba/winbindd_privileged. (nel caso vogliate l’autenticazione dal dominio Windows)

Il motivo per il quale va aggiunto al gruppo è proprio per l’accesso al file /etc/shadow (dove è memorizzata la password cifrata dell’utente locale) oppure per la comunicazione con winbind tramite la pipe (per la verifica completa delle credenziali).

Il motivo per il quale si deve modificare proprio l’utente proprietario del cluster, è che i processi linux che gestiscono quel cluster postgresql sono di quell’utente. Quindi è quell’utente che deve poter accedere al file o alla pipe summenzionate.

Una volta aggiunto l’utente al gruppo è necessario riavviare il cluster postgresql con il comando:

pg_ctlcluster 9.4/main restart

e, a questo punto, collegarsi al database con il proprio client preferito e le credenziali opportune.

Nota: se si cerca di fare il test delle credenziali tramite un client su un altro computer, allora la riga in pg_hba.conf dovrà essere cambiata, o duplicata, in modo che l’indirizzo IP sia quello del client.