Sendmail (II): Configuración y manejo de Sendmail

Autor: Juan Antonio Martínez Castaño
E-Mail: jantonio@drake.dit.upm.es

Copyright

Este artículo es Copyright 1998 de Juan Antonio Martínez Castaño y se distribuye bajo las siguientes condiciones:

Indice:

  1. Introducción
  2. El entorno de trabajo de sendmail
  3. Usando sendmail
  4. El fichero de configuración
  5. Reglas de reescritura
  6. Configurando sendmail
  7. Resumen. Conclusiones
  8. Referencias

Entradilla

En el número anterior de Linux Actual se hizo una introducción al correo electrónico, describiendo el protocolo SMTP, la estructura de un mensaje de correo, y las extensiones MIME al protocolo. En este artículo se describe en detalle el funcionamiento y la configuración de sendmail, describiendo ejemplos reales

Introducción

En el número anterior se hizo una introducción al modo de funcionamiento de sendmail como agente de transporte de correo, y de qué decisiones debía tomar con el mensaje entrante. Recordemos estas funciones En este número de Linux Actual describimos las interioridades de sendmail y cómo este es capaz de llevar a cabo dichas tareas. Del mismo modo aprenderemos a configurar y a personalizar sendmail de manera que se adapte a nuestras necesidades. Por motivos de espacio no se puede hacer una descripción exhaustiva; por ello se recomienda un estido detallado de la abundante documentación que acompaña a sendmail

El entorno de trabajo de sendmail

Echemos un primer vistazo a los ficheros relacionados con sendmail. Detallamos aquí la implementación Linux ( especialmente RedHat 5.1 ). En otros sistemas operativos la distribución puede ser ligeramente distinta Como se ha dicho, la recomendación de sendmail.org es que todos los ficheros de configuración residan bajo /etc/mail. Esto será obligatorio a partir de la version 9.0 ( la release actual en el momento de escribir este artículo es la 8.9.1a )

Normalmente sendmail se ejecuta como demonio del sistema. No obstante, también puede ser lanzado desde inetd

Sendmail puede funcionar como programa autónomo, arrancado desde /etc/rc.d/init.d/sendmail, o bien como programa auxiliar desde el demonio inetd. Cuando el sistema se va a dedicar a servidor de correo o punto de intercambio de éste, se recomienda la útima opción. Sólo tiene sentido lanzarlo desde inetd en el caso de estaciones de trabajo en las que el correo se use raramente

Usando sendmail

El listado 1 muestra las diversas opciones con que se puede invocar sendmail. Como veremos posteriormente, muchas de ellas tienen su correspondiente entrada en el fichero /etc/sendmail.cf. Destacaremos, por su importancia las siguientes
 Parameters:

   -Btype      Set the body type to type. Current legal values 
               7BIT or 8BITMIME.
   -ba         Go into ARPANET mode.  All input lines must end with 
               a CR-LF, and all messages will be generated with a 
               CR-LF at the end. Also, the ``From:'' and ``Sender:'' 
               fields are examined for the name of the sender.
   -bd         Run as a daemon.  This requires Berkeley IPC. Sendmail 
               will fork and run in background listening on socket 25 
               for incoming SMTP connections.  This is normally run 
               from /etc/rc.
   -bD         Same as -bd except runs in foreground.
   -bh         Print the persistent host status database.
   -bH         Purge the persistent host status database.
   -bi         Initialize the alias database.
   -bm         Deliver mail in the usual way (default).                    
   -bp         Print a listing of the queue.
   -bs         Use the SMTP protocol as described in RFC821 on standard 
               input and output.  This flag implies all the operations 
               of the -ba flag that are compatible with SMTP.
   -bt         Run in address test mode.  This mode reads addresses 
               and shows the steps in parsing; it is used for debugging 
               configuration tables.
   -bv         Verify names only - do not try to collect or deliver a 
               message. Verify mode is normally used for validating 
               users or mailing lists.
   -Cfile      Use alternate configuration file.  Sendmail refuses to 
               run as root if an alternate configuration file is 
               specified.
   -dX         Set debugging value to X.
   -Ffullname  Set the full name of the sender.
   -fname      Sets the name of the ``from'' person (i.e., the sender 
               of the mail). -f can only be used by ``trusted'' users 
               (normally root, daemon, and network) or if the person 
               you are trying to become is the same as the person you 
               are.
   -hN         Set the hop count to N. The hop count is incremented 
               every time the mail is processed.  When it reaches a 
               limit, the mail is returned with an error message, the 
               victim of an aliasing loop. If not specified, 
               ``Received:'' lines in the message are counted.
   -i          Ignore dots alone on lines by themselves in incoming 
               messages. This should be set if you are reading data 
               from a file.
   -N dsn      Set delivery status notification conditions to dsn, 
               which can be `never' for no notifications or a comma 
               separated list of the values `failure' to be notified 
               if delivery failed, `delay' to be notified if delivery 
               is delayed, and `success' to be notified when the 
               message is successfully delivered.
   -n          Don't do aliasing.
   -O option=value
               Set option option to the specified value. This form 
               uses long names. See below for more details.
   -ox value   Set option x to the specified value. This form uses 
               single character names only. The short names are not 
               described in this manual page; see the Sendmail 
               Installation and Operation Guide for details.
   -pprotocol  Set the name of the protocol used to receive the 
               message.  This can be a simple protocol name such as 
               ``UUCP'' or a protocol and hostname, such as 
               ``UUCP:ucbvax''.
   -q[time]    Processed saved messages in the queue at given 
               intervals. If time is omitted, process the queue once.  
               Time is given as a tagged number, with `s' being 
               seconds, `m' being minutes, `h' being hours, `d' being 
               days, and `w' being weeks.  For example, `-q1h30m' or 
               `-q90m' would both set the timeout to one hour thirty 
               minutes. If time is specified, sendmail will run in 
               background. This option can be used safely with -bd.
   -qIsubstr   Limit processed jobs to those containing substr as a 
               substring of the queue id.       
   -qRsubstr   Limit processed jobs to those containing substr as a 
               substring of one of the recipients.
   -qSsubstr   Limit processed jobs to those containing substr as a
               substring of the sender.
   -R return   Set the amount of the message to be returned if the 
               message bounces. The return parameter can be `full' 
               to return the entire message or `hdrs' to return only 
               the headers.  
   -rname      An alternate and obsolete form of the -f flag.
   -t          Read message for recipients. To:, Cc:, and Bcc: lines 
               will be scanned for recipient addresses. The Bcc: line 
               will be deleted before transmission. Any addresses in 
               the argument list will be suppressed, that is, they 
               will not receive copies even if listed in the message 
               header.
   -U          Initial (user) submission. This should always be set 
               when called from a user agent such as Mail or exmh and 
               never be set when called by a network delivery agent 
               such as rmail.
   -V envid    Set the original envelope id. This is propagated across 
               SMTP to servers that support DSNs and is returned in 
               DSN-compliant error messages.
   -v          Go into verbose mode.  Alias expansions will be 
               announced, etc.
   -X logfile  Log all traffic in and out of mailers in the indicated 
               log file.  This should only be used as a last resort 
               for debugging mailer bugs. It will log a lot of data 
               very quickly.
Listado 1: Opciones de invocación de sendmail

Realmente, en funcionamiento normal no utilizaremos mas que dos opciones en el momento de arranque: el modo normal de invocación -desde el /etc/rc.d/init.d/sendmail- se ejecuta el comando /usr/bin/sendmail -bd -q1h que le instruye a sendmail para que se ejecute como demonio y que procese la cola de correo cada hora. Cada vez que cambiamos el fichero de alias, deberemos utilizar el comando newaliases para recomilar dicha database. Algunos administradores hacen esto de manera automática desde el cron

Hemos mencionado constantemente el fichero de aliases, pero ¿en qué consiste éste?. No es ni mas ni menos que una tabla de traslación de direcciones "virtuales" a direcciones reales. El formato de este fichero está ilustrado en el listado 2.

Podemos considerar el fichero .forward como un fichero de aliases particular del usuario

Al igual que el fichero de aliases, existe un fichero -opcional- por cada usuario. Si éste tiene un fichero .forward en su ${HOME} sendmail interpreta éste como un fichero alias particular y lo procesa. Evidentemente existen diversas restricciones de seguridad que sendmail impone a los permisos que pueden tener los ficheros /etc/aliases y ${HOME}/.forward

#
#	@(#)aliases	8.2 (Berkeley) 3/5/94
#
#  Aliases in this file will NOT be expanded in the header from
#  Mail, but WILL be visible over networks or from /bin/mail.
#
#	>>>>>>>>>>	The program "newaliases" must be run after
#	>> NOTE >>	this file is updated for any changes to
#	>>>>>>>>>>	show through to sendmail.
#

# Basic system aliases -- these MUST be present.
MAILER-DAEMON:	postmaster
postmaster:	root

# General redirections for pseudo accounts.
bin:		root
daemon:		root
games:		root
ingres:		root
nobody:		root
system:		root
toor:		root
uucp:		root

# Well-known aliases.
manager:	root
dumper:		root
operator:	root

# trap decode to catch security attacks
decode:		root

# Person who should get root's mail
#root:		marc

# sample of mail list: note about the :include: syntax
xmame-list:	:include:/etc/mail/listas/xmame.list

# sample of program redirection
xmame:		| /usr/bin/hypermail

# multiple recipients can be specified in an alias
xmame-owner:	jantonio,jrwdegoede@mail.tudelft.fi.de

Listado 2: Ejemplo de fichero /etc/aliases

Por último, estudiamos la cola de correo: Con el comando mailq obtenemos una lista de mensajes pendientes de envio. En el directorio /var/spool/mqueue podemos observar ficheros con el formato:

Ahora que ya conocemos el comportamiento de sendmail, vamos a proceder a estudiar y a aprender a configurar dicho sistema.

El fichero de configuración

En el número anterior de Linux Actual se describieron las diversas razones de la -aparente- complejidad del fichero de configuración. /etc/sendmail.cf. Veamos a continuación su estructura. Para ello tengamos a mano nuestro linux y visualicemos dicho fichero.
Podemos dividirlo en diversas secciones: Cada apartado se identifica por una letra. Así tenemos que una línea que empieza por D corresponde a una declaración de Macros, una M a una definición de agente de transporte de correo ( mailer ), etc. A continuación describimos en detalle estas secciones.

  • $a Fecha de envio del mensaje en formato RFC822
  • $b Fecha actual en formato RFC822
  • $c Contador de saltos (TTL del mensaje)
  • $d Fecha actual en formato UNIX ctime(2)
  • $e (Obsoleto: substituído por la opción SmtpGreetingMessage ) Mensaje de saludo al establecerse la conexión SMTP
  • $f Dirección de correo entrante del sender ( from )
  • $g Dirección de correo del sender una vez procesada y adaptada para el mailer que debe recibirla
  • $h Direccion destino una vez preprocesada por la RuleSet 0 ( ver explicación de las reglas de reescritura )
  • $i Identificador del mensaje en la cola de envíos pendientes
  • $j Nombre DNS oficial ( no dominios virtuales de correo ) de la máquina donde se ejecuta sendmail
  • $k Nombre del nodo UUCP
  • $l (Obsoleto: substituído por la opción UnixFromLine ) formato de la entrada "From" de la cabecera. Por defecto vale "From $g $d"
  • $m Dominio de DNS de la maquina
  • $n Nombre del demonio de correo para mensajes de error. Por defecto vale "MAILER-DAEMON"
  • $o (Obsoleto: substituído por la opción OperatorChars ) String que contiene la lista de caracteres que son definidos como separadores de tokens a la hora de parsear las reglas de reescritura
  • $p Process-ID del sendmail en ejecución
  • $q Formato de la dirección del remitente
  • $r Protocolo usado para aceptar conexiones, usualmente SMTP o ESMTP
  • $s Hostname del remitente del correo
  • $t Representación numérica de la hora actual
  • $u Direccion del destinatario
  • $v Versión de sendmail
  • $w Nombre oficial de la maquina. Normalmente se verifica que $j es igual a $w.$m
  • $x Nombre completo del remitente
  • $z Home del destinatario, si éste es local
  • $_ Dirección que sendmail valida como dirección real del remitente
  • ${bodytype} Tipo del cuerpo del mensaje ( 7BIT o 8BITMIME )
  • ${client_addr} Dirección IP de la máquina que establece conexión con sendmail
  • ${client_name} Nombre autentificado DNS del host que establece conexión con sendmail
  • ${client_port} Puerto por el que se establece la conexión
  • ${envid} MsgID tal y como figura en la cabecera del mensaje
  • ${opMode} Modo en que está operando sendmail. Definido por la opción -b de la linea de comandos con que se arrancó éste
Listado 3: Macros predefinidas por sendmail

Reglas de reescritura

El resto del fichero sendmail.cf corresponde a las definiciones de las reglas de re-escritura. Para entenderlas hagamos una pequeña introducción.

Normalmente, sendmail no sabe a priori con qué formato le va a dar el cliente las direcciones de correo del remitente y destinatario. direcciones como "Juan Antonio <jantonio@dit.upm.es>" y "jantonio@dit.upm.es ( Juan Antonio Martinez )" son perfectamente válidas y con formatos totalmente diferentes. Es necesario un primer preproceso para establecer la uniformidad entre los diversos posibles formatos entrantes al establecer la conexión.

La misión fundamental de la Rule Set 3 es uniformizar las direcciones que el mailer externo proporciona a sendmail

Una vez que la dirección de correo ha sido uniformizada, sendmail necesita adivinar qué tiene que hacer con dicho mensaje: esto es, buscar un MTA adecuado en función de la dirección que ha obtenido.
Además cada mailer tiene sus propios formatos para el destinatario y el remitente del mensaje. Sendmail debe adaptar este formato interno a los requerimientos del mailer antes de invocarlo.
Por último , en algunos casos es necesario un post-proceso de las direcciones para efectos de introducirlos en las cabeceras, efectuar logs, etc.
Las últimas versiones de sendmail incluyen además una serie de conjuntos de reglas para validar destinatarios y remitentes, aceptar o rechazar el correo, etc. Son las denominadas check_ rules

Por ello sendmail define una serie de conjuntos de reglas de re-escritura de direcciones de correo. son las denominadas "rulesets". cada ruleset viene definido por la letra S y un número que indica la regla a definir. Una ruleset empieza con una declaración Sn y dura hasta la siguiente declaración de otra regla. Las principales son:

Estas reglas son usualmente divididas en diversas sub-reglas que contemplan aspectos específicos de cada una. la figura 1 ilustra el diagrama de flujo que sigue el proceso de re-escritura de direcciones

Además de las rulesets especificadas, cada definición de cada mailer incluye opconalmente una serie de reglas que deben ser aplicadas al resultado de las rulesets 1 y 2, para adaptar las direcciones al mailer. Normalmente las rulesets 1 y 2 suelen estar vacias, usándose sólo para reescrituras particulares (Eric Allman dice que "la mejor ruleset 1 es la que no existe...")

reglas de reescritura
Figura 1: Diagrama de flujo de las reglas de re-escritura

Para procesar una dirección sendmail divide ésta en tokens, utilizando para ello los separadores definidos en el fichero de configuración. Así "<jantonio@dit.upm.es>" es tokenizada en "<" "jantonio" "@" "dit" "." "upm" "." "es" ">"

Cuando invocamos sendmail con la opcion "-bt" entramos en el denominado modo de "test de reglas de re-escritura": indicando el conjunto de reglas deseado, y dando una dirección, podemos ver cómo sendmail procesa ésta, y el resultado obtenido.

En estos momentos estamos ya en condiciones de poder interpretar la sintaxis de los siguientes elementos del fichero de configuración. Para ello habremos de entender que las reglas de reescritura se dividen en dos partes:

Como ejemplo, si encontramos la expresión
R$*<$+@$m>	$@$2<@$w> 
Esta expresión instruye a sendmail a que si encuentra una expresión del tipo "Juan Antonio <jantonio@drake.dit.upm.es>" , y drake.dit.upm.es es el nombre de la máquina donde se ejecuta sendmail, reescriba esta dirección como jantonio<@dit.upm.es> y dé por finalizado el análisis de la dirección

A la hora de procesar una ruleset, sendmail busca sucesivamente cada LHS hasta encontrar una que hace matching con la dirección dada. Entonces convierte ésta a su RHS y repite recursivamente la conversión hasta que no hace matching, o bien la RHS le dice que no debe procesar mas veces esa línea, continuando entonces con la siguiente regla, o bien retornando si así se lo especifica la regla

La reescritura de direcciones se basa en un barrido secuencial de cada regla de una RuleSet dada, buscando expresiones cuya tokenización coincide con la de la dirección que tenemos

Invocando sendmail con la opción "-bt" podemos jugar con las distintas rulesets y ver como son reconocidos los tokens y transformadas las direcciones

Las reglas de definición de mailers son ligeramente distintas:

Configurando Sendmail

Aunque existe una profusa documentación, hoy en día no es de recibo editar un fichero de configuración "a pelo". Lo normal es partir de uno por defecto suministrado por el proveedor del sistema operativo, o bien hacer uso de las utilidades de configuración de que sendmail viene provisto.

Sendmail provee de un potente lenguaje de definición de configuraciones basado en el preprocesador M4

En efecto. Los desarrolladores de sendmail, han previsto un conjunto de reglas pre-fabricadas, junto con un lenguaje de macros, que permite que a partir de un fichero de unas pocas líneas, generar un sendmail.cf completo y funcional, sin la engorrosa tarea de pensarlo y escribirlo.

Antes de empezar a describir dicho lenguaje, nos aseguraremos de tener las herramientas adecuadas. Deberemos tener instalados:

En el directorio /usr/lib/sendmail-cf residen todas las herramientas de configuración. Encontramos los directorios: Para generar un fichero de configuración, el proceso será el siguiente:

El listado 4 nos ilustra el fichero de configuración que utiliza RedHat en sus distribuciones de correo:
divert(-1)
include(`../m4/cf.m4')
define(`confDEF_USER_ID',``8:12'')
OSTYPE(`linux')
undefine(`UUCP_RELAY')
undefine(`BITNET_RELAY')
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(procmail)
MAILER(smtp)
HACK(check_mail3,`hash -a@JUNK /etc/mail/deny')
HACK(use_ip,`/etc/mail/ip_allow')
HACK(use_names,`/etc/mail/name_allow')
HACK(use_relayto,`/etc/mail/relay_allow')
HACK(check_rcpt4)
HACK(check_relay3)                    
Listado 4: Ejemplo de fichero de configuración de sendmail

Todo fichero de definición tendrá los siguientes campos:

Por motivos de espacio es imposible detallar todas las opciones, features, y hacks pre-definidos. Existe un fichero /usr/lib/sendmail.cf/README que incluye la documentación completa, mas otro /usr/lib/sendmail-cf/README.check que define los diversos hacks relacionados con el control del enrutamiento del correo y de las reglas de aceptación de este, para evitar el denominado "mail spamming" o abuso de nuestro servidor de correo para el envio indiscriminado de mail. Como siempre, la recomendación es probar y experimentar antes de dar una configuración por válida

Resumen. Conclusión

El estudio y configuración de sendmail es una de las cosas que distinguen a un auténtico "gurú" de UNIX. Realmente no es difícil, sino que la versatilidad y potencia de sendmail obliga al administrador a saber exactamente qué es lo que desea hacer. El estudio comparativo de diversas configuraciones es obligado.

Hemos dejado a un lado el tema de seguridad. En tiempos Sendmail fué famoso por los múltiples agujeros que presentaba. Hoy en día solo se dan problemas cuando el administrador pone una configuración permisiva, o descuída los permisos de ficheros y directorios. Afortunadamente la versión 8.9.1 y superiores protestan firme y educadamente de los fallos de seguridad, obligando al administrador, a corregir dichos errores o a instruír expresamente a sendmail a obviarlos.

Por otro lado hay que destacar que sendmail depende íntimamente de la resolución de nombres DNS. De hecho existen unas entradas en las databases de DNS denominadas MX ( de Mail eXchanger ) que son exhaustivamente consultadas por sendmail para decidir las rutas a seguir por los mensajes de correo. Una mala configuración del DNS puede hacer caer drásticamente el rendimiento de nuestro sistema de correo, o lo que es peor, hacer que este no funcione en absoluto.

Si los lectores lo desean, dedicaremos un futuro número a una explicación detallada de todas las opciones de configuración de sendmail,

Una última nota: en el número anterior se dijo que el RFC822 no permite caracteres de 8 bits en las cabeceras. Si bien esto es cierto, existe un RFC que describe como se aplica el concepto de extensiones MIME para enviar caracteres de 8 bits en dichas cabeceras, manteniendo las reglas del RFC822

Referencias

Puesto que el correo electrónico es incluso más antiguo que InterNet, está profundamente documentado, existiendo una ampila bibliografía y referencias sobre el tema. Indicamos aquí alguna de las más relevantes:

Referencias sobre TCP-IP y SMTP

Douglas E. Comer
"Internetworking con TCP-IP" Tercera Edición ( tres volúmenes )
Prentice Hall international
ISBN 0-13-474321-0
http://www.phall.com
( una colección que todo administrador de sistemas debe tener en su biblioteca informática )

Referencias sobre Sendmail

Eric Allman,Bryan Costales, Neil Rickert
"Sendmail" Segunda edición
O'Reilly Associates, Inc
ISBN 1-56592-056-2
http://www.ora.com
( considerado como "la biblia de sendmail" es el manual oficial -reconocido como tal por el creador de sendmail- )

RFC's

Consultar el fichero indice incluído en el CD-Rom

Sendmail Home Page && ftp site

http://www.sendmail.org
ftp://ftp.sendmail.org/pub/sendmail
Grupos de News y listas de correo
news:comp.mail.sendmail
mailto:majordomo@lists.sendmail.org
FAQ && Tutorials de sendmail
http://www.informatik.uni-kiel.de/~Eca/faqs/sendmailv8.html
http://www.wcmh.com/uworld/archives/95/tutorial/008/008.txt.html