Configuración del Correo autenticado
C@mpus - @cademia Linux

Introducción 

En algunos casos, si no es que en la mayora, es importante tener un control absoluto no sólo de dónde, cuándo o a dónde si no que también es necesario a quién. En este punto es cuando la autenticación de SMTP toma lugar.

Postfix, como el MTA permite hacer relay a los equipos que cumplan alguna de las siguientes condiciones:

  • Equipos especificados en el parámetro mynetoworks,
  • Equipos que tengan como destinatario algún dominio especificado en mydestination

Sin embargo, esta relación de confianza no contempla a usuarios externos cuyo de la dirección IP no está especificada en mynetworks y no escriben a un usuario local. Para esto se debe realizar otra relación de confianza que permita hacer relay a cualquier usuario autenticado sin importar su origen ni a quién escribe.


Paquetes necesarios

  • cyrus-sasl
  • libsasl2-plug-ntlm
  • libsasl2
  • libsasl2-plug-login
  • libsasl2-plug-gssapi
  • libsasl2-plug-plain
  • libsasl2-plug-anonymous

Nota: Este procedimiento sólo es posible en MDK 9.2 o superior. Mandrake 9.0 queda descartado por la versión de SASL que trae en la distribución que no soporta todos los mecanismos necesarios.

El paquete libsasl2-plug-ldapdb no debe estar instalado. 


Configuración

Para lograr que SASL autentique contra el árbol LDAP utilizaremos PAM. Aunque SASL soporta directamente LDAP, por motivos de compatibilidad con los servicios que dependen de él se utilizará PAM.

Para lograr esto se tendrá que editar el archivo /etc/sysconfig/saslauthd con el siguiente contenido:

/etc/sysconfig/saslauthd

SASL Authd
SASL_AUTHMECH=
SASL_MECH_OPTIONS=
SASLAUTHD_OPTS= "-a ldap -O /etc/saslauthd.conf -n 5"

El archivo saslauthd.conf debe contener al menos la siguiente información. 

/etc/saslauthd.conf

ldap_servers: ldap://127.0.0.1/
ldap_search_base: ou=People,dc=linuxchange,dc=com

Y se deber reiniciar el servicio con service saslauthd restart.

Para probar la configuración utilizaremos el comando testsaslauthd con la siguiente sintaxis:

testsaslauthd -u usuario -p contrasea

Si la prueba tiene éxito una leyenda similar a esta deber aparecer: 0: OK "Success."

Una vez con SASL configurado se tendrá que dar de alta los servicios SMTPD y SMTP para que sepa qué es lo que debe de hacer. Para esto primero se configurara el servicio SMTP vía PAM añadiendo el archivo /etc/pam.d/smtp con el siguiente contenido:

/etc/pam.d/smtp

#%PAM-1.0

auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth 

Nótese que system-auth debe estar correctamente configurado. Esta información se cubre en el contenido de instalación común .

También se deber crear un archivo con nombre smtpd.conf y colocar una copia en los directorios que indiquen el parmetro smtpd_sasl_path del archivo de configuracin de Postfix. Hay que recordar que los demonios están enjaulados por lo tanto si se especifica una ruta como /usr/lib/sasl2/ también deber existir una copia en la jaula, que generalmente está ubicada en /var/spool/postfix/. Esto es copiar el archivo en /var/spool/postfix/usr/lib/sasl2/.

El contenido deber ser el siguiente:

/etc/postfix/sasl/smtpd.conf

pwcheck_method: saslauthd
mech_list: plain login 

Para habilitar la autenticación por SMTP se tendrán que añadir o modificar las siguientes líneas en el archivo main.cf del MTA.

/etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
smtpd_sasl_application_name = smtpd
smtpd_sasl_path = smtpd
smtp_sasl_mechanism_filter = plain, login
smtpd_sasl_security_options = noanonymous

# Las siguientes líneas son un ejemplo, no deben ser literales
smtpd_recipient_restrictions =        check_recipient_access ldap:/etc/postfix/ldap-relay-toin.cf,
        check_sender_access ldap:/etc/postfix/ldap-relay-fromin.cf,
        permit_sasl_authenticated,
        reject
smtpd_sender_restrictions =
        check_recipient_access ldap:/etc/postfix/ldap-relay-toout.cf,
        check_sender_access ldap:/etc/postfix/ldap-relay-fromout.cf,
        permit_sasl_authenticated

La siguiente línea es como ejemplo, sólo se deber añadir permit_sasl_authenticated a la ya dispuesta en su MTA.

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject

smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject

Es importante que el parámetro permit_sasl_authenticated esté en ambas opciones.

El siguiente parámetro es opcional y deber utilizarse o no dependiendo si el MTA funciona con la autenticación. Generalmente su omisión trabaja.

smtp_sasl_auth_enable = yes

El parmetro smtpd_sasl_auth_enable indica a Postfix que anunciara con el encabezado SMTP AUTH.

Como LXE sólo da soporte aun dominio, es importante que smtpd_sasl_local_domain esté en blanco de lo contrario la autenticacin fallará. SASL tiene la capacidad de mantener usuarios diferentes con el mismo nombre siempre y cuando tengan diferente dominio. Sin embargo esta es una capacidad que no depende del LDAP sino más bien de su archivo de base de datos local.

Utilizamos smtpd_sasl_security_options = noanonymous para indicarle a Postfix que debe existir una autenticación forzosa por parte de todos los clientes.

Microsoft Outlook Express contiene un error en el diseo el cual no soporta estrictamente el protocolo SMTP en cuanto a autenticacin se refiere. Para esto la lnea broken_sasl_auth_clients aade encabezados ms flexibles a la respuesta del MTA para que este tipo de clientes soporte el servicio.


Prueba de la configuración 

Para probar la siguiente configuración se tendrá que realizar una conexión con el comando telnet al servidor de correo de la siguiente forma:

telnet mail.linuxchange.com 25

Y esto regresará un mensaje similar al siguiente:

Connected to mail.linuxchange.com (192.168.3.1).
Escape character is '^]'.
220 tao.linuxchange.com ESMTP Postfix (2.1.1) (Mandrake Linux)

Con esta leyenda para verificar la autenticación se necesitar saludar al servidor introduciendo el siguiente comando:

EHLO <nombre del equipo cliente>

Por ejemplo: EHLO beta.linuxchange.com

Este comando regresar unas leyendas similares:

Connected to mail.linuxchange.com (192.168.3.1).
Escape character is '^]'.
220 tao.linuxchange.com ESMTP Postfix (2.1.1) (Mandrake Linux)250-mail.linuxchange.com
EHLO beta.linuxchange.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
AUTH PLAIN Z1x1Y2lvA039GWNpbwBlMjcw90c5
235 Authentication successful

Hasta el momento sólo se ha comprobado que el servidor acepta autenticación.

Es necesario introducir un comando para comprobar que el servidor este trabajando correctamente con la nueva configuración. Para esto se necesita introducir un comando de la forma AUTH PLAIN <base64>. La forma base64 es una cadena codificada en base64 que contiene el nombre del usuario y la contrasea en el siguiente formato: usuario\000usuario\000contrasea. El triple 000 previene de una mala interpretación de perl con el sistema octal.  De esta forma para comprobar el usuario john con contraseña j0993nn la cadena antes de ser codificada estará de la siguiente forma: john\0john\oj0993nn. La codificación rápida a base64 se ejecutará con uno de los siguientes comandos:

printf '<cadena sin codificar>' | mmencode

o

perl -MMIME::Base64 -e 'print encode_base64("<cadena sin codificar>");'

Ambas opciones codificarán la cadena prevista a base64 y esta tendrá que ser introducida con el comando AUTH PLAIN de la siguiente forma:

AUTH PLAIN Z1x1Y2lvA039GWNpbwBlMjcw90c5

Postfix tendrá que responder con el siguiente mensaje:

235 Authentication successful


Detalles sobre la autenticación

Debido a que toda la autenticación finalmente se hace vía LDAP. OpenLDAP carece de métodos de cifrado en la transmisión de sus datos. Esto es como funciona CRAM, CHAP, por mencionar algunos ejemplos.

Para utilizar la autenticación, los clientes deben utilizar la opción PLAIN. Esto podra llegar a presentar un problema de seguridad debido a la transmisión de la contrasea en texto plano. Sin embargo Postfix soporta mecanismos para el cifrado del canal tales como TLS que podrían configurarse posteriormente.