SMTP-AUTH


Que SMTP tiene un problema con la autenticación es obvio: no dispone de ella. Para añadirla en el servidor Qmail, tuvimos que :

  • Añadir al sistema el grupo ‘nofiles’ (si no existe) para lo que ejecutamos la orden “addgroup nofiles”
  • Cambiamos al directorio de los fuentes ( /usr/src/qmail-src/qmail-1.03) y aplicamos el parche para SMTP-AUTH (ejecutamos install_smtpd-auth.sh que viene en el comprimido que descargamos de http://www.fehcom.de/qmail/auth/qmail-smtpd-auth-059_tgz.bin y que previamente hemos descomprimido en /usr/src/qmail-src/qmail-1.03)
  • En el fichero error.h incluimos la línea: #include “errno.h”
  • Compilamos los fuentes (make)
  • Paramos el servidor (/etc/init.d/qmail stop)
  • Instalamos los nuevos programas parcheados (make setup check)
  • Copiamos el fichero ldap_auth.pl al directorio /usr/bin. Este fichero está modificado para que, además de que consulte nuestros servidores de LDAP, las búsquedas las realice con un usuario y no con conexiones anónimas. Las línes modificadas para esto son:
   $ldap = Net::LDAP->new(
                          $ldap_server,
                          port => $ldap_port
                         ) or &mydie();
   $mesg = $ldap->bind( "uid=usuario LDAP", password => "contraseña");
   if ( $mesg->code ) {
       warn "error: ", $mesg->error;
       &mydie($mesg->code);
   }
  • Además, para que solo pudieran enviar correos los usuarios pertenecientes al grupo correo, se añadió el siguiente código a la función ldap_auth:
           # Comprobar el grupo
           $ldap = Net::LDAP->new(
                          $ldap_server,
                          port => $ldap_port
                         ) or &mydie();
           $mesg = $ldap->bind("uid=usuario LDAP", password => "contraseña del usuario");
           if ( $mesg->code ) {
                      warn "Error: ", $mesg->error;
                      &mydie($mesg->code);
           }
           #@attrs = ['uniquermember'];
           $mesg = $ldap->search( base => "cn=groupo,
                                 scope => 'base',
                                 filter => "(uniquemember=$dn)"
                        );
           $mesg->code && &mydie($mesg->error);
           my $codigo = $mesg->count;
           $ldap->unbind;   # take down session
           if ( $codigo ) {
               #return $resp_unacceptable;
               return $resp_ok;
           }
           else {
               #return $resp_ok;
               return $resp_unacceptable;
           }
  • Iniciamos el servidor: /etc/init.d/qmail start

Con esto, tuvimos QMail configurado para que aceptara solo correos cuyos usuarios se autentican correctamente contra nuestro LDAP. Para que funcionara bajo TLS:

  • apt-get install libssl-dev
  • Descarga y aplicación del pacrhe qmail-1.03-tls-20021228-renato.patch
  • Compilación e instalación (make setup check)
  • Creación de los certificados: make -f Makefile-cert
  • Descarga y aplicación del parche ucspi-tcp-0.88.errno.patch
  • Compilación e instalación en el directorio /usr/src/ucspi-tcp-src/ucspi-tcp-0.88 (make && make setup check)
  • Descarga y descompresión de ucspi-ssl-0.70.tar.gz
  • apt-get install libperl-dev
  • Cambiamos al directorio: cd directoriodesdeelquedescomprimimos/host/superscript.com/net/ucspi-ssl-0.70y ejecutamos:
      #package/compile
      #package/rts
      #package/install
  • Reiniciamos el servidor y pasamos a probarlo apoyándonos en un cliente de correo o con comandos como ” openssl s_client -starttls smtp -crlf -connect localhost:25 -quiet -debug”

Y, para acabar, tuvimos que retocar el script de inicio del servicio qmail-smtp-auth. Dicho script se basa en el original del qmail para el puerto 25, es decir, /etcd/init.d/qmail. Por ello, a partir de dicho fichero se crea el script /etc/init.d/qmail-smtp-auth, que escuchará el puerto 587. Las modificaciones respecto al original son las siguientes:

 case "$1" in
   start)
 	echo -n "Starting mail-transfer agent with smtp-auth: qmail-smtp-auth" $rblmsg
 	if [ "`pidof /usr/sbin/qmail-send`" ] ; then  # Solo se lanza si ya se lanzó el qmail-send por el qmail-smtp del puerto 25
 	         sh -c "start-stop-daemon --start --quiet --user qmaild \
 		    --pidfile /var/run/tcpserver_smtp-auth.pid --make-pidfile \
 	            --exec /usr/bin/tcpserver -- -R -H \
 	            -u `id -u qmaild` -g `id -g nobody` -x /etc/tcp.smtp-auth.cdb 0 587 \
         	    $rblsmtpd /usr/sbin/qmail-smtpd /usr/bin/ldap_auth.pl /bin/true 2>&1 \
 	            | $logger &"
 		echo "   OK"
 	else
 	        echo "ERROR: qmail-smtp is not running"
 	fi	
 	;;
   stop)
 	echo -n "Stopping mail-transfer agent with smtp-auth: qmail-smtp-auth" $rblmsg
 	    start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_smtp-auth.pid --exec /usr/bin/tcpserver 
 	echo ""
 	;;
   restart)
 	$0 stop
 	$0 start
 	;;
   cdb)
  	echo "Rebuilding tcp.smtp-auth.cdb."
 	cd /etc
 	tcprules tcp.smtp-auth.cdb tcp.smtp-auth.temp < tcp.smtp-auth
 	;;
   flush)
       /usr/sbin/qmail-tcpok
       start-stop-daemon --stop --quiet --oknodo --signal ALRM --exec /usr/sbin/qmail-send
       echo "Queue flushed."
       ;;
   stat)
       /usr/sbin/qmail-qread
       /usr/sbin/qmail-qstat
       ;;
   reload|force-reload)
 	echo "Reloading 'locals' and 'virtualdomains' control files."
 	start-stop-daemon --stop --quiet --oknodo --signal HUP --exec /usr/sbin/qmail-send
 	;;
   *)
 	echo 'Usage: /etc/init.d/qmail {start|stop|stat|cdb|restart|reload}'
 	exit 1
 esac

También tuvismo que definir las reglas específicas para que el proceso tcpserver filtrara las conexiones, en concreto en el fichero /etc/tcp.smtp-auth:

 127.0.0.1:allow,RELAYCLIENT=""
 :allow,SMTPAUTH="AUTHREQUIRED",NOPBS=""
 :deny

Dicho fichero se compiló mediante la orden:

 tcprules tcp.smtp-auth.cdb tcp.smtp-auth.temp < tcp.smtp-auth
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s