Autentificación de usuarios con sendmail en FreeBSD

Autor: Emilio Florido
Fecha: 07/11/2002


El punto de partida

En mi trabajo tenemos una máquina FreeBSD conectada de forma permanente a Internet mediante una línea ADSL. Entre otros, esta máquina da servicio de correo electrónico (tanto de entrada como de salida) para el dominio que tenemos contratado. Dicho de otra forma, el "router" ADSL redirige cualquier petición de correo que le llega de Internet -a su dirección de red pública- hacia la dirección de red privada de la máquina FreeBSD para que esta la resuelva.

El problema

Aunque mientras un usuario dado de alta en la máquina FreeBSD que está en su puesto de trabajo y conectado a ella puede tanto enviar como recibir correo electrónico desde o hacia cualquier otra máquina (ya sea de Internet o del resto de nuestra red privada), cuando esos mismos usuarios están en sus casas y desean usar como "servidor de correo saliente" la máquina FreeBSD (conectándose a ella con cualquiera de los proveedores habituales de Internet) esta siempre les contesta que Relay denied, algo así como Reenvío denegado.

Más concretamente, los usuarios que pertenecen a la misma red que aquella en la que está la máquina FreeBSD no tienen problemas con el correo saliente y los que pertenecen a cualquier otra red no pueden usarlo.

Que se cuenta aquí

En este documento lo que pretendo es contar como en mi caso concreto he resuelto este problema. Es decir, como permitir el reenvío de correo saliente desde una máquina externa a la red a la que pertenece la máquina FreeBSD. Insisto nuevamente, solo me referiré al correo saliente, pues el correo entrante no debería dar ningún problema de este tipo.

También me gustaría dejar claro que esto es lo que yo he hecho y que al menos hasta ahora funciona perfectamente. Lógicamente no puedo garantizar que funcione en otras situaciones o con otras configuraciones, pero si estoy abierto a preguntas o sugerencias de cualquier tipo.

Por otra parte, este método exige poder conectarse como administrador a la máquina FreeBSD para retocar varios ficheros "importantes", exige recompilar varios programas y por supuesto lleva un riesgo de estropearlo todo y tener que reinstalar de nuevo… así que ya estás avisado. No me puedo considerar responsable de cualquier problema que te surja si sigues adelante, pero tampoco tiene por que ocurrir nada de esto, así que tú decides.

La configuración de partida

Aunque FreeBSD instala sendmail para la gestión del correo electrónico, al menos con la RELEASE 4.7 la compilación que viene por defecto NO incluye la posibilidad de realizar autenticación de usuarios. Si quieres comprobar si en tu caso concreto tu sendmail dispones o no de autenticación basta con que hagas un "telnet" al puerto 25 de tu máquina (algo así como telnet tumaquina.com 25). Cuando sendmail te salude tú le dices ehlo usuario y fíjate en lo que te contesta. Debería ser algo como esto:

 
220 tumaquina.com ESMTP Sendmail 8.12.3/8.12.6; Thu, 7 Nov 2002 17:18:25 +0100
(CET)
ehlo usuario
250-tumaquina.com Hello [192.168.1.10], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP

La línea importante es la que pone AUTH LOGIN PLAIN. Si NO la tienes, sigue leyendo pues este documento te puede interesar. Si ya la tienes, enhorabuena, tu sendmail ya dispone de autenticación, aún así, puedes leer el resto para hacer que sendmail haga uso de la autenticación.

Antes de seguir

Si ojeas un rato por Internet verás que para resolver este mismo problema del correo saliente hay algunas otras formas. Una muy socorrida es pop-before-smtp (basta con que escribas esto en google y verás que hay miles de referencias a ella).

A groso modo, pop-before-smtp consiste en aprovechar que para recibir el correo (no para enviarlo) es necesario identificarse (es decir, proporcionar el usuario y la contraseña). Basándose en esto y haciendo "malabarismos" con los ficheros /var/log/maillog, /etc/mail/access e imagino que con algún otro, se incorpora a la lista de máquinas a las que se permite hacer "reenvío" de correo, la máquina desde la que accede un determinado usuario, eso si, siempre que su validación en la recepción de correo haya sido correcta.

Esta inserción de la nueva máquina en la lista de "reenvío" es sólo durante un determinado tiempo (por ejemplo durante 10 minutos) y mientras dure, el usuario en cuestión podrá usar el correo saliente. Pasado el tiempo estipulado (usando por ejemplo cron para controlarlo) se "saca" la máquina añadida de la lista de máquinas autorizadas para el "reenvío" y la situación queda como al principio.

Aunque puede parecer buena idea, intenté instalarlo y me dio muchos problemas en FreeBSD pues la versión que encontré en sourceforge de pop-before-smtp debía ser para Linux (aunque ponía que era independiente de la plataforma) y no conseguí que funcionase. También he leído que como muchos programas de correo (por ejemplo Outlook) primero envían el correo y luego lo reciben, la primera vez que se usa da error (pues aún no estará incluida la máquina en la lista de máquinas autorizadas), aunque la verdad es que no lo he probado, pero si te animas, no me importaría leer tus experiencias…

Preparándose para el proceso

Bueno, pues manos a la obra. Lo primero será obtener los fuentes de sendmail para poder compilarlos. Yo recomiendo, aprovechando de que tenemos un FreeBSD entre manos, usar Internet y recurrir a cvs para hacernos con ellos. Si no sabes como hacerlo, puedes pasarte por http://www.eldemonio.org/docs/freebsd/make.html y, o bien leer entero el documento (cosa que recomiendo encarecidamente pues no tiene desperdicio), o bien ir directamente al apartado 5 en donde se habla concretamente de cómo actualizar los ports. En este caso concreto necesitamos al menos los ports relativos a mail.

Compilando sendmail

Sitúate en el directorio /usr/ports/mail/sendmail (si has dejado todo por defecto, y si no ajústalo a tu caso concreto) y edita el fichero Makefile que allí encontrarás.

Busca una línea que pone: SENDMAIL_WITH_SASL=yes y si está comentada (que es lo normal) descoméntala, de forma que cuando se compile se incluya el soporte para SASL, pues lo necesitaremos.

Ahora es el momento de escribir:

# make 

Esto hará que comience el proceso de compilación. Es normal que para poder realizarlo deban obtenerse algunos ports más, pero la máquina sola se encargará de obtenerlos.

Una vez terminada la compilación y si no ha habido errores, bastará con que escribas:

# make install 

Esto instalará el nuevo sendmail. Eso si, al menos en mi caso concreto la ubicación del nuevo sendmail no era la misma que tenía el que venía por defecto. Aunque en un principio pensé en mover a mano el nuevo y eliminar el antiguo, luego pensé que quizás no estaría de más dejar el antiguo por si acaso, y retocando el fichero /etc/mail/mailer.conf corregí la nueva ruta para sendmail. Yo te recomendaría hacer lo mismo, pues no cuesta apenas trabajo. Para ser más concretos, en mi fichero mailer.conf decía que sendmail (y todos los "alias" que tiene) estaban en /usr/libexec/sendmail/sendmail mientras que el recién compilado estaba en /usr/local/sbin/sendmail  (sobre este detalle puedes leer al final algunas aportaciones que he recibido).

Retocando la configuración de sendmail

Bueno, pues hecho lo más difícil, ahora queda la parte más sencilla. Asegúrate de que en el fichero /etc/access no tienes ninguna línea de RELAY. Esto es fácil, si quieres, basta con que no tengas ninguna línea en /etc/access (solo con que exista el fichero ya es suficiente).

Ahora es el turno del fichero tumaquina.mc. ¿Cómo?, ¿Qué no tienes un fichero como ese?. Pues no importa, por defecto FreeBSD usará el fichero freebsd.mc que seguro que tienes en /etc/mail. Si quieres tener un fichero mc propio, me refiero a que se llame tumaquina.mc basta con que lo crees -copiando por ejemplo el freebsd.mc - y que luego en /etc/make.conf añadas la siguiente línea (por cierto, si no existe /etc/make.conf no dudes en crearlo):

SENDMAIL_MC=/etc/mail/tumaquina.mc

Es más, si lees la documentación verás que hay otro fichero llamado freebsd.submit.mc con el que se puede hacer lo mismo, aunque por ahora no nos hará falta. Bueno, a lo que íbamos, en el fichero tumáquina.mc (o freebsd.mc) añade las siguientes líneas:

define(`confAUTH_OPTIONS', `A')dnl
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

Fíjate bien en el sentido de las comillas. Las primeras se obtienen pulsando la tecla que hay a la derecha de la P (en el teclado español, claro) y las segundas están justo a la derecha de la tecla 0

Otros ficheros que retocar

Aún faltan un par de ficheros más donde "retocar". Uno es /etc/pam.conf y en él debes añadir lo siguiente:

smtp   auth     required    pam_unix.so   try_first_pass
smtp   account  required    pam_unix.so   try_first_pass

y el otro es /usr/local/lib/sasl/Sendmail.conf (ojo! la S en mayúscula) y basta con que tenga una única línea como esta:

pwcheck_method: pam

Ahora a poner todo en marcha

Bueno, pues por fin está todo. Es el momento de situarse en /etc/mail y teclear:

# make all 

Esto regenerará todos los ficheros necesarios para sendmail (sendmail usa, en lugar de ficheros de texto simplones como los que hemos retocado, otros más extraños -da un vistazo a cualquier fichero terminado en cf y sabrás a lo que me refiero- ).

Si todo ha ido bien es el momento de hacer:

# make install
# make stop 
# make start 

y debería pararse tu antiguo sendmail sin soporte para autenticación y arrancar el nuevo con el soporte para autenticación. Puedes comprobar que es así haciendo el telnet tumaquina.com 25 que te decía al principio y comprobar ahora lo que te contesta.

La prueba de fuego

Ya solo queda intentar por ejemplo, desde una máquina Windows con Outlook y conectado a Internet por medio de un proveedor cualquiera, configurar como servidor de correo saliente la máquina FreeBSD y eso si, sin olvidar activar la casilla Mi servidor requiere autenticación al configurar la cuenta de correo, ver que tal funciona.

Agradecimientos

Aunque ya se lo dije a él en "directo", creo que el trabajo de koji@ciberteca.com al crear el documento http://www.eldemonio.org/docs/freebsd/make.html es sencillamente extraordinario. Insisto en recomendar su lectura para actualizar FreeBSD por Internet automáticamente y no sólo para los ports como yo comentaba más arriba.

También es muy recomendable la página http://www.linux-sxs.org/smailauth.html pues casi todo lo que aquí cuento, ya lo ha contado rpaiz@indahaus.com , aunque a mi me parece que está más enfocado a Linux…

Aportaciones

Raúl Romero del grupo BOSC me ha hecho llegar el siguiente comentario que me parece interesante incluir. Justo después de compilar sendmail yo decía más arriba que era necesario "retocar" el fichero /etc/mail/mailer.conf para hacer que "señalara" hacia el nuevo sendmail, pues el antiguo estaba en otra ubicación. Raúl me comenta que si no se quiere hacer esta operación "a mano" como yo proponía, él ha comprobado que es posible teclear desde /usr/ports/sendmail

# make mailer.conf

para que no sea necesario "editar" las rutas y que sea el propio make el que lo haga automáticamente. Aunque personalmente no lo he comprobado, esta idea de Raúl me parece que podría simplificar algo el proceso y evitar posibles errores de tecleo. Gracias Raúl.

 

Juan Becerril, me ha comentado que tras seguir todos los pasos aquí indicados, aunque todo funcionaba correctamente, al iniciar  sendmail recibía el siguiente mensaje en el fichero  /var/log/maillog

dns sendmail[14971]: error:
safesasl(/usr/local/etc/sasldb.db) failed: Permission denied

Después de dar un vistazo a http://www.sendmail.org/~ca/email/auth.html#sasldb tanto Juan como yo mismo hemos comprobado que haciendo:

# chown root:wheel /usr/local/etc/sasldb.db

el error dejaba de aparecer. Gracias Juan.

 


Emilio Florido (eflorido@iesmajuelo.com)