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:
- Su distribución mediante medios electrónicos es libre, siempre y
cuando se conserve el texto íntegro y en su formato HTML original, haciendo
especial mención a la conservación del mensaje de copyright
- El autor y dueño del copyright cede los derechos de publicación impresa
a Prensa Técnica S.A., autorizando a ésta a realizar las modificaciones al
texto que considere oportunas para su publicación
- La distribución o copia, total o parcial, en cualquier medio impreso por
parte ajena a Prensa Técnica S.A. Está expresamente prohibida
- Ningún particular podrá publicar este fichero en un servidor Web de acceso
público sin el consentimiento expreso del autor y de Prensa Técnica S.A.
Indice:
- Introducción
- El entorno de trabajo de sendmail
- Usando sendmail
- El fichero de configuración
- Reglas de reescritura
- Configurando sendmail
- Resumen. Conclusiones
- 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
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
- Recogida de correo procedente de un agente de usuario de correo
o MUA ( elm, pine, Eudora, etc ) o bien de otro sendmail
- Elección de la estrategia de routing del correo: desvio hacia
un agente local, hacia otro sendmail, a través de una linea UUCP, etc
- En su caso, encolamiento del mensaje para un posterior proceso
- Ajustar las cabeceras del correo de manera que sea compatible
con el siguiente agente de transporte de la cadena
- Resolución de aliases, expansión de listas, etc
- Aunque casi no se use más que para debugging, sendmail también
puede ser usado como agente de correo de usuario (MUA)
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
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
- Binarios y ejecutables
- /usr/bin/sendmail Ejecutable de sendmail
- /usr/bin/mailq Muestra el estado de la cola de
correo pendiente. Es un enlace simbólico a sendmail y
equivale a /usr/lib/sendmail -bp
- /usr/bin/newaliases Recompila la base de datos
de aliases de correo. Equivale a /usr/lib/sendmail -bi
y como en el caso anterior es tambien un enlace simbólico
a sendmail
- Directorios
- /usr/lib/sendmail-cf directorio que incluye
las utilidades de configuración de sendmail
- /etc/mail Directorio donde se guardan los diversos
ficheros de configuración de sendmail. Actualmente muchos
ficheros residen todavía bajo /etc, pero a partir de
la release 9.0 este directorio será el nuevo estándard
- /var/spool/mail Directorio donde se guarda el
correo local
- /var/spool/mqueue Directorio donde se guarda la
cola de mensajes pendientes de envio
- Ficheros
- /etc/sendmail.cf Fichero de configuración de
sendmail
- /etc/aliases Fichero de aliases de correo
- /etc/sendmail.cw
- /etc/sendmail.cT Diversos ficheros de configuración
cuyo uso se describirá posteriormente
- /var/run/sendmail.pid Fichero lock que indica el
process-ID del sendmail que actualmente está en ejecución
- /var/log/maillog Fichero de logging de eventos de
sendmail
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
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
- -bd Ejecuta sendmail como "demonio" del sistema. Esta
es la manera habitual de ejecución de sendmail.
- -v Pone sendmail en modo "verboso". Sirve para monitorizar
todos los procesos que ejecuta sendmail a la hora de enviar correo:
expansión de aliases, conexión via SMTP con el servidor remoto, etc.
Se utiliza sobre todo para verificar que las conexiones y envio de
correo de nuestro sendmail local se ejecutan correctamente
- -bi Recompila el fichero de aliases. El comando
newaliases es equivalente a esta opción
- -bt Ejecuta sendmail en modo interactivo como expansor de
reglas de reescritura de direcciones. Este método sirve para comprobar
que la configuración que hemos creado para sendmail es correcta. ( en
un apartado posterior se detallan las reglas de reescritura )
- -f user Indica a sendmail que el sender del correo
es el usuario especificado. Sólo los usuarios clasificados en el
fichero de configuración como "trusted" están autorizados para
utilizar este comando
- -dcategoría.nivel Pone sendmail en modo traza. Sendmail
especifica diversos niveles y tipos de trazas, que desafortunadamente
varían de una versión a otra. Consultar la documentación de cada
versión respecto de los niveles de depuración
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:
- - dfxxxxxx Cuerpos de los mensajes, sin cabeceras
- - qfxxxxxx Información de proceso de trabajos
- - tfxxxxxx Ficheros temporales de proceso de mensajes
- - xfxxxxxx Ficheros de log de sesion de cada mensaje
Ahora que ya conocemos el comportamiento de sendmail, vamos
a proceder a estudiar y a aprender a configurar dicho sistema.
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:
- Definición de diversas macros y clases ( grupos de tokens )
- Definición de las diversas opciones de funcionamiento
- Descripción de los formatos de las cabeceras que sendmail
debe generar.
- Definiciones sobre la prioridad de los mensajes
- Identificación de los usuarios de "confianza" ( trusted users )
- Declaración de los diversos agentes de transporte de correo
- Declaración de reglas de reescritura de las cabeceras
- Declaración de prioridades
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.
- Las opciones de funcionamiento, definen los valores de las
diversas posibilidades de modos de ejecución de sendmail. Algunas de
estas opciones pueden ser re-definidas en línea de comandos, o bien
mediante la opcion "-O option=valor". Se declaran en el fichero
sendmail.cf mediante líneas que empiezan por "O"
- Los formatos de las cabeceras se definen con lineas que empiezan
por "H". Así por ejemplo "HReceived: by $j id $i; $b" indica el
formato del campo "Received" que genera sendmail al pasar un mensaje
a su través
- Los "Trusted Users" son usuarios a quienes sendmail les permite
hacer ciertas cosas que no están -por motivos de seguridad- permitidas.
Un caso típico es el de cambiar la dirección del remitente -con la
opcion "-f" de la línea de comandos- . Sendmail comprueba si el
userid de quien lo invoca corresponde con alguno de estos usuarios
privilegiados, y en caso afirmativo lo autoriza. En el fichero de
configuración se declaran estos usuarios con lineas que empiezan por "T"
- Los agentes de correo son los diversos programas que sendmail
puede invocar para rutar el correo saliente, en función de la
dirección destino de cada mensaje. La definición de un Mailer empieza
por la letra "M". Dejamos su explicación para el apartado donde se
explican las reglas de reescritura.
- Las prioridades se declaran de la forma "Pident=value" donde
"ident" son los textos que aparecen en las cabeceras "Priority: ", y
"value" son valores numéricos que indican la prioridad relativa entre
los diversos identificadores
- Una macro es una asignación de un valor a una variable.
Así por ejemplo:
D$jdit.upm.es
Indica que la variable "j" tiene el valor "dit.upm.es". Este caso
corresponde a una de las variables pre-definidas por sendmail. Las nuevas
versiones de sendmail permiten nombres de variables de más de una letra
expresándolas de la forma ${nombre_de_variable}. El listado 3 indica las
variables pre-definidas para uso interno de sendmail. Algunas de ellas
no son editables por el usuario, pero otras deben ser expresamente
declaradas en el fichero de configuración
- $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 |
- Una clase es una agrupación de tokens. Puede ser esta
literal, dada por el identificador "CXvalor1 valor2 ..." o bien puede extraerse
dicha agrupación de un fichero externo, en cuyo caso el identificador es
la letra "F". La tendencia actual es a agrupar dichas clases en ficheros, para
modificar lo menos posible el fichero de configuración. Así en lugar de la
declaración anterior, pondremos los campos "valor1,valor2, etc" en un fichero
"/etc/mail/sendmail.cX" y declararemos la clase como "FX/etc/mail/sendmail.cX"
Para referenciar a un token de una clase, diferenciandolo de una
variable, lo expresaremos con la sintaxis $=X
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:
- Ruleset 3: Preprocesado de la dirección entrante y conversión
a un formato común
- Ruleset 0: Funciones de selección del mailer adecuado
- Ruleset 1: Reescritura de la dirección del remitente
- Ruleset 2: Reescritura de la dirección del destinatario
- Ruleset 4: Post proceso de las direcciones
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...")
|
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:
- La izquierda ( LHS ) que indica el pattern con el que se debe
hacer matching para aceptar esta regla
- La derecha ( RHS ) que indica cómo debe ser reescrita esta
dirección
- El tercer campo es opcional y se interpreta como comentario,
siendo ignorado por sendmail
- Además hay una serie de simbolos auxiliares:
- $+ Indica una o más repeticiones de un token
- $* Indica cero o más repeticiones de un token
- $- Indica exactamente una aparición de un token
- $X Indica la macro X
- $=X Indica que el token pertenece a la clase "X"
- $~X Indica que el token no pertenece a la clase "X"
- $?X A $| B $ es una expresión condicional que
indica que si la macro -o clase- X está definida usaremos
la expresion A, y si no la B ( el "else" es opcional )
- $n siendo n un número indica el token reconocido
en n-ésimo lugar. solo se utiliza en la RHS de las reglas
- $: Indica que esta regla solo se debe procesar
una vez (RHS)
- $@ Indica que con esta reescritura se ha acabado
el procesado de la ruleset en curso
- $>n (RHS) Indica que se debe ejecutar la
ruleset "n"
- $#xxxx (RuleSet 0) Especifica que se debe utilizar
el mailer xxxxx con el LHS especificado
- $[xxxx] Especifica que el valor xxxx referencia
a un nombre o dirección IP de la que el DNS debe obtener su
valor A ( address ) en lugar de buscar el valor MX ( mail
exchanger )
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:
- Todo sendmail debe tener definición de al menos tres mailers:
"prog" como shell para lanzar la ejecución de comandos;
"local" para enrutar mensajes locales; y "error" para indicar a
sendmail qué hacer cuando se produce un error.
- La definición de un mailer tiene el formato:
Mmailer P=programa, F=flags, S=ruleset, R=ruleset, A=arguments, E=eolchars
Donde:
- "mailer" es el nombre que le damos al agente de correo
- "programa es el nombre del ejecutable a lanzar". Si se
especifica "[SMTP]" o "[IPC]" le indicamos a sendmail que se
trata de una conexión SMTP que puede él gestionar directamente
- "flags" son una serie de caracteres que indican las
posibilidades y requerimientos del mailer. Consultar la
documentación de sendmail para encontrar la descripción
completa de dichos flags
- Ruleset S especifica el conjunto de reglas que debe
aplicar sendmail al resultado de la ruleset 1 para ajustar el
valor del sender en el mailer
- Ruleset R indica la regla a aplicar para que el mailer
utilice el resultado de la ruleset 2
- "arguments" indica la linea de comandos con que se
invoca el mailer.
- "eolchars" indica la secuencia de caracteres que identifica
el fin de linea en el mailer
Por ejemplo, una definición extraída de sendmail es la siguiente:
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10, R=20
Msmtp, P=[IPC], F=mDFMuX, S=11, R=21, E=\r\n
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:
- La herramienta de pre-proceso M4
- La utilidad Make de berkeley ( pmake ). El make de GNU no nos
vale en este caso...
- El paquete sendmail-cf. En caso de no tenerlo, lo podremos
instalar desde el CD-Rom
En el directorio /usr/lib/sendmail-cf residen todas las
herramientas de configuración. Encontramos los directorios:
- cf Directorio de trabajo donde residen los ficheros
de configuración maestros. En el directorio se incluyen multitud
de ejemplos, para ser usados a modo de templates
- domain Ficheros de definiciones relacionadas con los
dominios y la resolución de nombres
- ostype Definiciones relacionadas con el sistema operativo,
normalmente referidas a las localizaciones de ficheros
- m4 Conjunto de reglas maestras de generación de todas
las opciones del fichero de configuración
- mailer Conjunto de reglas de definición de los diversos
mailers
- siteconfig Reglas de generación de las diversas opciones
( reglas O ) del sendmail.cf
- feature Macros de generación de las diversas capacidades
del sendmail.cf
- hack Diversas macros para "trucos" y reglas especiales
Para generar un fichero de configuración, el proceso será el siguiente:
- En el directorio "cf" editamos el fichero ".mc" maestro
- Compilamos el fichero ".cf" resultante mediante el comando
"pmake xxxxx.cf" siendo xxxxx el nombre del fichero maestro
en caso de no disponer de la utilidad "pmake" el comando
"m4 ../m4/cf.m4 file.mc > file.cf" hará el mismo efecto
- copiamos el fichero .cf resultante a /etc/sendmail.cf
- relanzamos el sendmail
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:
- Una entrada OSTYPE, que defina el sistema operativo. El valor
"unknown" deja al make la opción de escogerlo automáticamente
- Una o varias FEATURE's que definen las funcionalidades que
va a tener esta configuración
- Diversas entradas de declaración de los mailers que va a tener
definidos este sistema. Al menos un mailer debe estar definido
- Declaracion opcional de los diversos "trucos" que utiliza el
sistema. En el ejemplo de RedHat, los hacks definen las diversas
opciones que controlan el acceso y verificación de los remitentes
y destinatarios del correo
- En el caso de querer especificar una línea del sendmail,cf
de manera literal, declararemos la entrada LOCAL_RULESET_XXXX
y a continuación aquello que queramos que figure en el fichero
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
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
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