sábado, 16 de marzo de 2013

Creando un Helper para autenticar Squid mediante POP3


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:

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