Bueno, hoy tenemos correo gratis y extraordinario en la red: gmail, yahoo, terra, ... Incluso gmail ya con el dominio que tú le indiques. Evidentemente, no lo queremos para proporcionar a alumnos y profesores una dirección de correo personal. La necesidad surge de la propia concepción de un Servidor: se realizarán chequeos, avisos de seguridad, ... que se enviarán a través de un servidor de correo interno al administrador. Es imprescindible un correo en localhost. Y, por otro lado, si pensamos montar una plataforma educativa como moodle o un portal de contenidos (como es php-nuke), el correo es fundamental para registrarse, enviar avisos, ... Y, por supuesto, es conveniente tener unas direcciones de correo corporativas para recibir sugerencias, consultas, ... y enviar respuestas.
Vamos al grano: vamos a instalar lo que se denomina un MTA o Agente de Transferencia de Correo. Éste funciona como un servicio que está esperando peticiones en el puerto 25 y que contempla el protocolo smtp. Por eso se denominan Servidores de Correo SMTP y el puerto 25 se denomina "smtp=25".
Nosotros instalaremos postfix. El Servidor de Correo postfix recibe correos desde un MUA (Agente de Usuario para Correo) como es evolution o desde otro servidor SMTP externo. Ese correo puede estar dirigido a otra máquina, de modo que lo enviará a un Servidor SMTP externo o a nuestra propia máquina, en cuyo caso actuará como MDA (Agente de Entrega de Correo) y lo depositará en el buzón del usuario destinatario. Más o menos...
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:
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 <CR><LF>.<CR><LF>
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: <loli@web.iesdelgadohernandez.es>
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 <colego>; 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.
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
# newaliasesDebemos 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
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: <palabra_para_poder_usar_smtp.key>
Verifying - Enter pass phrase for smtpd.key: <repetimos_palabra_para_poder_usar_smtp.key>
# chmod 600 smtpd.key
# openssl req -new -key smtpd.key -out smtpd.csr
Enter pass phrase for smtpd.key: <la_clave_antes_introducida>
........................
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 []: <pulsamos_intro>
An optional company name []: <pulsamos_intro>
# openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
.........................
Enter pass phrase for smtpd.key:<palabra_para_poder_usar_smtp.key>
# openssl rsa -in smtpd.key -out smtpd.key.unencripted
Enter pass phrase for smtpd.key:<palabra_para_poder_usar_smtp.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
# /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.
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.
Como hemos ya visto en la sección LAMP, lo hacemos con el asistente de Mandriva, ejecutando drakfirewall. Ante la pregunta "¿A qué servicios debería permitirse acceder desde Internet?" comprobaremos que está deshabilitada la opción Todo (sin cortafuegos) y marcamos la opción Servidor de correo que abre el puerto 25. Basta ya con dar en aceptar para que el firewall, que en Mandriva viene gestionado por defecto mediante shorewall quede configurado.