Squid nos permite crear los denominados helpers de autenticación para validar bajo nuestras propias reglas a los usuarios que requieren de autorización para acceder a ciertas páginas.
El presente post demuestra como crear un helper usando PHP y PEAR para autenticar Squid mediante POP3.
- IMPORTANTE: Estoy partiendo del hecho de que tengo instalado un Squid (Version 2.7.STABLE9) sobre un Debian 6.0.1.
Procedimiento:
Instalar (sino los tenemos ya) los paquetes de línea de comandos para PHP y de los componentes base de PEAR:
apt-get install php5-cli php-pear
Instalar a través del cliente PEAR el paquete Net_POP3 para interactuar con servidores POP3:
pear install pear/Net_POP3
Creamos el archivo del helper en el directorio de configuración de squid (esto es por comodidad, puede ir en cualquier lado):
nano /etc/squid/auth_pop3.php
Colocamos dentro el siguiente código:
<?php include('Net/POP3.php'); $host='mail.midominio.com.ec'; $port="110"; $pop3 =& new Net_POP3(); while (!feof(STDIN)) { $line = trim(fgets(STDIN)); $fields = explode(' ', $line); $username = rawurldecode($fields[0]); $password = rawurldecode($fields[1]); if($pop3->connect($host , $port ) ) { if(PEAR::isError( $pop3->login($username , $password,'USER' ) ) ) { fwrite(STDOUT, "ERR\n"); } else { fwrite(STDOUT, "OK\n"); } } else { fwrite(STDOUT, "ERR\n"); } } $pop3->disconnect(); ?>
Editamos el archivo de configuración squid.conf
nano /etc/squid/squid.conf
Y agregamos las siguientes líneas en la sección "OPTIONS FOR AUTHENTICATION":
auth_param basic program /usr/bin/php /etc/squid/auth_pop3.php auth_param basic children 20 auth_param basic realm Usuario y Password auth_param basic credentialsttl 5 hours
En donde:
- program: Cómo se ejecuta el helper. En este caso es a través del interprete de PHP.
- children: Número de procesos para atender autenticaciones concurrentes para todos los clientes.
- realm: Es el texto que se mostrará al usuario en la ventana de autenticación.
- credentialsttl: Tiempo de vigencia de las credenciales de autenticación. Pasado este lapso se pedirá nuevamente al usuario que se autentique.
En el mismo archivo creamos unas ACL's de prueba:
acl client30 src 192.168.3.204/255.255.255.255 acl usuarios_auth proxy_auth REQUIRED
Y agregamos una regla que las use:
http_access allow client30 usuarios_auth
Guardamos los cambios y Reiniciamos el servicio respectivo:
/etc/init.d/squid restart
Listo, con esto cada vez que quiera acceder a internet desde el equipo client30 se me pedirá autenticarme con las credenciales que uso para el correo electrónico ;)
PD: El código del helper puede ser mejorado, se me ocurre por ejemplo que puede recibir como parámetros el nombre del servidor y el puerto.
Referencias: