Apr 17 2008

Come realizzare un modulo di autenticazione per Squid

PJ @ 15:19Categorie: Linux

Squid è il software più famoso e diffuso per la realizzazione di un proxy Web o FTP, utile sia per creare una cache e accelerare così la navigazione su Internet che per proteggere la propria rete locale (ha opzioni per l’analisi e il filtraggio dei contenuti, degli IP e dei protocolli sorgente o destinazione). Attraverso l’utilizzo di moduli esterni consente di accettare connessioni solo a seguito di una corretta autenticazione, che può essere realizzata con l’aiuto di un database MySQL, un file di testo con le password in chiaro, un server LDAP o RADIUS, o qualsiasi altra cosa ci possa venire in mente.

Mi è capitato recentemente di dover realizzare un modulo personalizzato per l’autentificazione su un server LDAP dotato di istanze distinte per la gestione di studenti, docenti e dipendenti. In pratica non potevo utilizzare il modulo LDAP standard fornito con la distribuzione, ma ho dovuto riscrivermene uno di mio in PHP.

I moduli di autenticazione di Squid sono infatti degli eseguibili (programmi in C oppure script in PHP, PERL o altro) che accettano ciclicamente in input login e password dell’utente, fornendo una linea con l’esito dell’operazione di verifica dell’accesso. Vediamo quindi come costruirci un modulo di autenticazione e come configurare Squid per utilizzarlo.

Prima fase: la realizzazione del modulo

Come avevo accennato prima, il modulo è un eseguibile che deve accettare dallo standard input una riga contenente login e password codificate secondo l’RFC 1738 e separate da uno spazio, per poi restituire una riga contenente una delle parole OK o ERR a seconda dell’esito dell’operazione di autenticazione. Una volta restituita la riga col risultato, deve rimettersi in attesa di un nuovo input. La risposta ERR può essere seguita da una frase indicante il tipo di errore: tale frase può essere visualizzata all’utente tramite il parametro %m nella pagina di errore del proxy.

Vediamo quindi come possiamo realizzare un semplicissimo modulo in PHP, che si limita a verificare che l’utente inserisca come login la parola pippo e come password la parola pluto:

<?
while (!feof(STDIN))
      {
      $line = trim(fgets(STDIN));
      $fields = explode(' ', $line);
      $username = rawurldecode($fields[0]); // RFC 1738
      $password = rawurldecode($fields[1]); // RFC 1738

      if ($username == 'pippo' and $password == 'pluto')
         echo "OK\n";
        else
         echo "ERR\n";
}
?>

Con queste poche righe ci siamo già assicurati un sistema di controllo sugli accessi al nostro proxy; sta ora alla fantasia del programmatore arricchirlo col codice necessario per verificare l’identità dell’utente.

Seconda fase: la configurazione di Squid

Una volta realizzato il modulo occorre istruire Squid affinché lo utilizzi quando necessario. Per fare questo, dobbiamo creare una apposita ACL all’interno del file di configurazione:

auth_param basic program /usr/lib/squid/foo_auth
auth_param basic children 5
auth_param basic realm Autenticazione per l'accesso all'esterno
auth_param basic credentialsttl 5 minute
acl foo-auth proxy_auth REQUIRED

Il parametro program deve puntare allo script che abbiamo appena creato, comprensivo del percorso completo per raggiungerlo; children invece è il numero di processi di validazione che Squid attiva al suo avvio: questo parametro deve essere pesato in base alla frequenza di autenticazioni realizzate sul proxy durante la giornata. Il parametro realm indica il testo da visualizzare al momento della richiesta di login e password, mentre credentialttl indica il tempo di durata delle credenziali prima di riprocedere con la verifica.

A questo punto possiamo utilizzare l’ACL appena creata in maniera analoga a tutte le altre, ad esempio per chiedere la password quando un utente della rete locale cerca di accedere ad Internet:

acl from_local src 192.168.0.0/16
acl to_local dst 192.168.0.0/16
http_access allow from_local !to_local foo-auth