Creando un Helper para autenticar Squid mediante POP3

Imagen de iknaxio

Tema: 

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:

Comentarios

La necesidad

Imagen de iknaxio

La necesidad es la madre de los inventos. Y yo necesitaba autenticarme contra un zimbra, pero como el puerto ldap no estaba publicado al exterior, me tocó inventarme lo del pop3.

"Transporta un puñado de tierra todos los días y construirás una montaña" - Confucio
floss.iknaxio.net