Postfix y Postfix Admin GUI

http://tuxjm.net/docs/mailserver-howto/mysql-based/xhtml/ch04s04.html

http://www.scribd.com/doc/8699418/Manual-de-instalacion-y-configuracion-del-Servidor-de-correo-POSTFIX-

Test mail

telnet ipdelservidor 25
helo test
mail from: tudireccion@ferretools.com
rcpt to: tudireccion@ferretools.com
data
Subject: Test de email

.

(termina con dos ENTERS un punto y dos ENTERS de nuevo)



Instalación de postfix

Hay muchos Servidores de Correo. Algunos: sendmail, exim, qmail, postfix. Éste es el elegido. Instalamos postfix:

[root@3000xp ~]# urpmi postfix
Para satisfacer las dependencias, se instalarán los paquetes siguientes:
libpostfix1-2.2.5-7mdk.i586
postfix-2.2.5-7mdk.i586
¿Está todo bien? (S/n) s
...........................................
Terminando el registro del núcleo: [ OK ]
Terminando el registro del sistema: [ OK ]
Iniciando el registro del sistema: [ OK ]
Iniciando el registro del núcleo: [ OK ]

Lo ponemos en marcha y vemos que va todo bien:

root@3000xp ~]# /etc/init.d/postfix start
Iniciando postfix: [OK]

Puertos en escucha:

# netstat -puta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 web:10026 *:* LISTEN 19274/master
tcp 0 0 web:smtp *:* LISTEN 19274/master

Vemos que master (postfix) está escuchando en el puerto smtp (25) del servidor. El otro (10026) lo veremos al estudiar los filtros.

Echemos un vistazo a archivos y directorios importantes:

* /etc/postfix/main.cf, que es el fundamental de configuración de postfix
* /etc/postfix/master.cf, el segundo fundamental y complejo (mejor no toquetearlo)
* /etc/postfix/aliases, que es el archivo para crear alias (redirecciones de correo). Por ejemplo, el correo dirigido a root debería leerlo un usuario del sistema, como puede ser pepito.
* /etc/postfix/sasl/smtp.conf es el archivo para configurar la autenticación ante el servidor de los usuarios
* /var/spool/postix/ es el directorio donde trabaja enjaulado Postfix. Observa cómo ha copiado hasta los archivos básicos de /etc que necesita para funcionar.

Prueba de funcionamiento

Ahora vamos a enviar un correo a pelo: nos conectaremos al puerto 25 (smtp) diremos que somos loli (y se lo creerá) y le enviaremos un correo al usuario colego (ambos son usuarios del sistema donde se ha instalado postfix). Esto hará que se cree en el directorio /var/spool/mail/ un fichero llamado colego que contendrá ese correo. Éste es el buzón de correo del usuario, y tal y como está configurado postfix ahora ahí vendrán a parar todos los correos, añadiéndose al final del archivo de cada usuario, engordando ilimitadamente si no vamos borrando los sucesivos mensajes que recibamos, y si no configuramos cuotas.

$telnet localhost 25
Trying 127.0.0.1...
Connected to web.iesdelgadohernandez.es (127.0.0.1).
Escape character is '^]'.
220 web.iesdelgadohernandez.es ESMTP Postfix (2.2.5) (Mandriva Linux)
helo localhost
250 web.iesdelgadohernandez.es
mail from: loli
250 Ok
rcpt to: colego
250 Ok
data
354 End data with .
subject: primer correo enviado de prueba
from: loli
to: colego
Este es el primer correo que te envio. Es una prueba. Adios.
.
250 Ok: queued as 830FE136DD4
quit
221 Bye
Connection closed by foreign host.

Ahora se conecta colego:

$ su colego
You have mail in /var/spool/mail/colego

Fijémonos cómo nos avisa de que tenemos un correo. Vamos a leerlo:

$ cat /var/spool/mail/colego
From loli@web.iesdelgadohernandez.es Mon Feb 13 21:32:57 2006
Return-Path:
X-Original-To: colego
Delivered-To: colego@web.iesdelgadohernandez.es
Received: from localhost (web.iesdelgadohernandez.es [127.0.0.1])
by web.iesdelgadohernandez.es (Postfix) with SMTP id 830FE136DD4
for ; Mon, 13 Feb 2006 21:31:47 +0100 (CET)
subject: primer correo enviado de prueba
from: loli@web.iesdelgadohernandez.es
to: colego@web.iesdelgadohernandez.es
Message-Id: <20060213203147.830FE136DD4@web.iesdelgadohernandez.es>
Date: Mon, 13 Feb 2006 21:31:47 +0100 (CET)

Este es el primer correo que te envio. Es una prueba. Adios.

Todo va bien (por ahora). Ya podemos mandar correo donde queramos desde nuestro servidor. Pero vamos a configurarlo un poco y a protegerlo.
Alias

Bueno, algo que debe configurarse son los alias o redirecciones que correo. El superusuario root va a recibir muchos mensajes que, por seguridad, nunca recibirá. ¿Quién los recibe ahora? Pues el usuario postfix (sí, se crea el usuario postfix del mismo modo que al instalar el servidor web apache se crea el usuario apache). La idea es que el administrador nunca se conecte como root, sino como un usuario normal y corriente; digamos pealfa.

Todo ello se consigue a través del archivo /etc/aliases y del comando newaliases. Vamos al archivo de alias mencionado y allí cambiamos:

root: postfix

por

root: pealfa

y ejecutamos el comando newaliases
# newaliases
Configuración básica

Debemos modificar algunos parámetros. Para ello dejamos al archivo /etc/postifix/main.cf como sigue:

# CREADO POR EL SCRIPT DE INSTALACIÓN. NO TOCAMOS
readme_directory = /usr/share/doc/postfix-2.2.5/README_FILES
html_directory = /usr/share/doc/postfix-2.2.5/html
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/share/man
daemon_directory = /usr/lib/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
# PARÁMETROS CONFIGURABLES POR EL USUARIO
delay_warning_time = 4h
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) (Mandriva Linux)
unknown_local_recipient_reject_code = 450
smtp-filter_destination_concurrency_limit = 2
lmtp-filter_destination_concurrency_limit = 2
# USAMOS EL FORMATO DE BUZÓN MAILDIR. SERÁ EL BUZÓN PERSONAL DE CADA USUARIO.
home_mailbox = Mail/
# INTERFACES POR LA QUE ESCUCHARÁ PETICIONES(localhost, eth0, all):
inet_interfaces = all
# PARÁMETROS DEL HOST Y DEL DOMINIO
myhostname = web.iesdelgadohernandez.es
mydomain = iesdelgadohernandez.es
# AL ENVIAR UN CORREO, QUÉ QUEREMOS QUE APAREZCA COMO ORIGEN DEL CORREO: $myhostname, $mydomain O LO QUE SEA
myorigin= $mydomain
# EQUIPOS A LOS QUE SE PERMITIRÁ ENVIAR LIBREMENTE EL CORREO. SER RESTRICTIVOS AQUÍ. Y DOMINIOS A ADMINISTRAR:
mynetworks = 127.0.0.0/8
mydestination = localhost, $myhostname, localhost.$mydomain, $mydomain
# LIMITES PARA BUZON Y MENSAJE (20 MB / 5 MB). POR DEFECTO ESTÁ EN (50 / 10 MB).
#mailbox_siza_limit = 20480000
#message_size_limit = 5120000
Atenticación, cifrado y controles anti-spam.

Mantener en funcionamiento un servidor de correo es complejo y una gran responsabilidad. Nada más abrir el puerto 25 en nuestro sistema nos encontraremos un aluvión de intentos de usarlo como open-relay: quieren usarnos como retransmisores de correo basura. El procurar que esto no suceda es NUESTRA RESPONSABILIDAD. Por ello debemos procurar tomas todas las medidas a nuestro alcance para evitarlo. Lo de menos es ser receptores de spam. Lo que debemos procurar es que nuestro servidor no sea un zombi que rápidamente sea incluido en las listas negras como productor de correo no deseado. Aquí vamos a comentar medidas al nivel smtp, que nos dará problemas, pues mi postfix ha rechazado mensajes de servidores mal configurados (por ejemplo, del servicio técnico de empresas que se dedican a productos para redes) al aplicarle las restricciones. Señalo que, por supuesto, he pasado el test de ORDB.org y comprobado que no somos un open-relay.

Vamos a dar soporte a nuestro servidor para SASL (método de autenticación) y TLS (cifrado e integridad para los correos). Esto permitiría usar nuestro Servidor de Correo por aquellos clientes que se identifican mediante un usuario+contraseña ante el servidor smtp y, además, conseguir que tanto esa identificación como toda la comunicación se realice cifrada. Lo he añadido como una capacidad más, pero teniendo en cuenta que lo que pretendemos es dar un servicio de CorreoWeb, no es necesario para resolver el problema de la itinerancia.

Esto se ha realizado siguiendo instrucciones que podemos encontrar en la propia web de mandriva.

A instalar:

# urpmi cyrus-sasl libsasl2 libsasl2-devel libsasl2-plug-plain libsasl2-plug-anonymous libsasl2-plug-crammd5 libsasl2-plug-digestmd5 libsasl2-plug-gssapi libsasl2-plug-login

Bien. Para gestionar los usuarios y las contraseñas hay muchas formas: usando bases de datos mysql, usando el método auxprop (con el que cyrus-sasl mantiene un archivo independiente) y saslauth (se usarán las cuentas del sistema Linux). Este método es el más inseguro y sólo sirve para pocos usuarios. Es precisamente el que vamos a usar porque es el más simple. Y porque tendremos pocos usuarios, no tendrán acceso a la shell, no podrán iniciar sesión y sólo se podrán conectar remotamente vía ssh desde determinados puestos de la intranet... buff esto ya mejora algo la seguridad. De todas formas, estoy pensando lo de implementar en el futuro el uso de mysql.

# cat /etc/postfix/sasl/smtpd.conf
mech_list: plain login
pwcheck_method: saslauthd
saslauthd_path: /var/lib/sasl2/mux

Ahora vamos a utilizar ssl para crear los certificados y poder exigir autenticación tls ante el servidor smtp (postfix) para conectarse a él:

# mkdir /etc/postfix/ssl
# cd /etc/postfix/ssl

# openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
........................
Enter pass phrase for smtpd.key:
Verifying - Enter pass phrase for smtpd.key:

# chmod 600 smtpd.key

# openssl req -new -key smtpd.key -out smtpd.csr
Enter pass phrase for smtpd.key:
........................
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Andalucia
Locality Name (eg, city) []:Bollullos del Condado
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES Delgado Hernández
Organizational Unit Name (eg, section) []:IES Delgado Hernández
Common Name (eg, YOUR name) []:web.iesdelgadohernandez.es
Email Address []:root@iesdelgadohernandez.es
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
.........................
Enter pass phrase for smtpd.key:

# openssl rsa -in smtpd.key -out smtpd.key.unencripted
Enter pass phrase for smtpd.key:
writing RSA key

# mv -f smtpd.keyunencripted smtpd.key

# openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
.........................
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Andalucia
Locality Name (eg, city) []:Bollullos del Condado
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES Delgado Hernández
Organizational Unit Name (eg, section) []:IES Delgado Hernández
Common Name (eg, YOUR name) []:web.iesdelgadohernandez.es
Email Address []:root@iesdelgadohernandez.es

Veamos lo que añadimos ahora a /etc/postfix/main.cf. Observa las medidas anti UBE:

# SASL = "Simple Authentication and Security Layer" o "Capa de Simple de autenticación y seguridad".
# Esto es un método para añadir soporte autenticación a SMTP
smtpd_sasl_path = /etc/postfix/sasl:/usr/lib/sasl2
#smtp_sasl_auth_enable = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
# TLS
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_receveid_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
# CONTROL DEL CORREO ENTRANTE / SALIENTE
# INCLUYE MANEJO DE SAPAM, LISTAS NEGRAS Y RESTRICCIONES EN HELO
# EXIGIMOS HELO Y CUMPLIMIENTO DE LA NORMA RFC821:
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
# RESTRICCIONES
# smtpd_client_restrictions =
# permit_sasl_authenticated,
# permit_mynetworks,
# reject_unknown_client

# smtpd_helo_restrictions =
# reject_invalid_hostname,
# reject_unknown_hostname,
# reject_non_fqdn_hostname

smtpd_sender_restrictions=
check_sender_access hash:/etc/postfix/lista_blanca

smtpd_recipient_restrictions =
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client relays.ordb.org

#Otras posibles listas opm.blitzed.org, list.dsbl.org, sbl.spamhaus.org, relays.mail-abuse.org, cbl.abuseat.org
Reinicio y comprobación:

# /etc/init.d/postfix restart Terminando postfix: [ OK ]
Iniciando postfix: [ OK ]
# /etc/init.d/saslauthd restart
saslauthd no está corriendo
Iniciando saslauthd [ OK ]
Creando enlace duro desde /var/lib/sasl2/mux a /var/spool/postfix/var/lib/sasl2/

Importante esto último: como postfix está enjaulado, se crea ese enlace duro para que pueda autenticar. Nosotros no debemos hacer nada al respecto. Al cerrarse el sistema se borrará y al iniciarse se creará automáticamente

Sabremos que tenemos el soporte TLS porque ahora al conectarnos al sistema apararecerá starttls:

# telnet localhost 25
Trying 127.0.0.1...
Connected to web.iesdelgadohernandez.es (127.0.0.1).
Escape character is '^]'.
220 web.iesdelgadohernandez.es ESMTP Postfix (2.2.5) (Mandriva Linux)
ehlo localhost
250-web.iesdelgadohernandez.es
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

No aparece nada sobre AUTH porque hemos señalado smtpd_tsl_auth_only = yes. Si hubiésemos aceptado comunicación sin exigir tls, colocando smtpd_tsl_auth_only = no entonces aparecería lo que sigue. Obsérvese como la autenticación aparece después de starttls. La autenticación se realiza a través de texto plano en claro, pero no hay problema pues la comunicación ya va encriptada por tls:

# telnet localhost 25
Trying 127.0.0.1...
Connected to web.iesdelgadohernandez.es (127.0.0.1).
Escape character is '^]'.
220 web.iesdelgadohernandez.es ESMTP Postfix (2.2.5) (Mandriva Linux)
ehlo localhost
250-web.iesdelgadohernandez.es
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

Veamos si hay errores o advertencias:

# cat /var/log/mail/errors
# cat /var/log/mail/warnings

Nada de nada. Todo parece correcto.
Puertos

Ya hemos repetido unas cien veces que la conexión a un servidor smtp se realiza por defecto a través del puerto 25. Asegurémosnos de que éste está abierto en nuestro cortafuegos si queremos que se acceda a nuestro Servidor de Correo desde el exterior. Porque hasta ahora está listo para enviar correos, pero no para recibirlos.

Comentarios