mail gateway corre o exchange
TRANSCRIPT
MAIL GATEWAY LINUX CON FILTRO
ANTISPAM PARA MICROSOFT
EXCHANGE SERVER
Juan José López - Junio 2007
Mail Gateway para Exchange Server
_____________________________________________________________________________
2/18
INDICE
1 OBJETIVOS.................................................................................................................................. 3 2 DIAGRAMA DE RED.................................................................................................................. 4 3 INSTALACIÓN DEL SISTEMA ................................................................................................ 5 4 INSTALACIÓN DE SERVIDOR DNS BIND9 .......................................................................... 5 5 INSTALACIÓN DE POSTFIX.................................................................................................... 6
5.1 INSTALAMOS SASL PARA AUTENTICACIÓN DE USUARIOS.................................... 6
5.2 CONFIGURACIÓN DE POSTFIX PARA AUTENTICACIÓN CON SASL....................... 8
5.3 AÑADIR TLS A POSTFIX .................................................................................................... 9
5.4 REENVIAR TODO EL CORREO AL EXCHANGE .......................................................... 11
6 FILTRO DE CONTENIDOS PARA POSTFIX....................................................................... 12 6.1 COMO HACER QUE SPAMASSASSIN APRENDA......................................................... 14
7 AÑADIENDO SEGURIDAD A POSTFIX ............................................................................... 17 8 NOTAS......................................................................................................................................... 18
Mail Gateway para Exchange Server
_____________________________________________________________________________
3/18
1 OBJETIVOS
El objeto del presente documento es detallar la Instalación de un servidor Mail Gateway para
Exchange Server integrado en un dominio con Active Directory y con filtro AntiSpam.
El principal objetivo de este proyecto es añadir seguridad de un servidor de correo Exchange
Server publicado en Internet. Para ello instalaremos un sistema de correo más seguro delante del
Exchange que tenga propiedades de firewall, y filtro de contenidos. Estas medias también podrían
implementarse en un sistema Windows, pero optamos por un sistema Linux por su robustez , sus
implementaciones contrastadas de seguridad y su bajo coste. Todas las herramientas necesarias para la
implantación del sistema serán gratuitas, bajo licencia GNU.
Como requisito imprescindible tendremos el no realizar ninguna modificación en la configuración
de los usuarios para enviar y recibir correo, ni realizar ninguna modificación en el servidor de
Exchange. Para ello, el nuevo servidor de correo debe reenviar los correos al servidor de Exchange, y
cualquier usuario que necesite enviar correo deberá autenticarse con sus credenciales del Dominio de
midominio.com.
Añadiremos seguridad en el envío y recepción de correos con la instalación de un servidor de
certificados que pueda hacer que el intercambio entre el usuario y el servidor de correo se haga a
través de una conexión segura cifrada a través de certificados de servidor.
Nuestro servidor de correo es también nuestro servidor de DNS primario en Internet. Por esto
debemos migrar también el servicio de DNS al nuevo servidor. Para ello utilizaremos el servidor
Bind9, previamente como servidor Secundario de todas las zonas de midominio.com y posteriormente
poniéndolo como Primario para estas mismas zonas.
Mail Gateway para Exchange Server
_____________________________________________________________________________
4/18
2 DIAGRAMA DE RED
INTERNET ISP
MAIL: Windows 2000 Server.
Exchange 2000 Server
POSTMAIL : Debian Linux 4.0 Etch.
DNS: BIND 9.3.4. Master dominios: midominio.com.
MAIL: Servidor de Correo Postfix 2.3.8.
Filtro Anti-Spam: Spamassassin 3.1.7. gestionado por MailScanner
FIREWALL: Iptables 1.3.6 con shorewall 3.4.
DMZ
LAN
Peticiones DNS, SMTP, POP3
Peticiones SMTP, POP3
Respuestas SMTP, POP3, IMAP
Respuestas DNS, SMTP, POP3
IP: 10.10.1.20
IP: 10.10.1.1
IP: 192.168.1.9
IP: 192.168.1.104
IP-EXTERNA
Respuestas SMTP, POP3
Peticiones SMTP, POP3, IMAP
DMZ ACCEPT net:10.10.1.20 loc:192.168.1.104 tcp 25,110 (smpt,pop3)
ACCEPT net:10.10.1.20 loc:192.168.1.114 tcp 389 (ldap a CONTROLADOR DOMINIO)
ACCEPT net:10.10.1.20 loc:192.168.1.114 udp 389 (ldap a CONTROLADOR DOMINIO)
ACCEPT net:10.10.1.20 loc:192.168.1.114 tcp 3268 (ldap a CONTROLADOR DOMINIO)
Peticiones SMTP, POP3, IMAP
Respuestas SMTP, POP3, IMAP
Mail Gateway para Exchange Server
_____________________________________________________________________________
5/18
3 INSTALACIÓN DEL SISTEMA
Instalamos el sistema base de Debian 4.0 Etch, sin entorno gráfico ni servidores.
Instalamos los siguientes paquetes necesarios:
- openssh-server
- vsftpd
- libnet-ssleay-perl
- webmin
Cambiamos la configuración de vsftpd (vi /etc/vsftpd.conf):
- anonymous_enable=NO
- local_enable=YES
- write_enable=YES
Cambiamos la configuración de WEBMIN:
- Cambiamos lenguaje: ESPAÑOL
- Configuración de RED:
� nombre máquina: smtp.midominio.com
� IP: 192.168.1.103/24
� GW: 192.168.1.124
Cambiamos las contraseñas por defecto "admin" de root.
4 INSTALACIÓN DE SERVIDOR DNS BIND9
Necesitaremos un servidor de DNS primario para sustituir el DNS de Windows. Para ello
configuraremos previamente un servidor de DNS secundario de nuestro primario en la IP-Externa y
posteriormente lo pasaremos a primario.
Instalamos Bind9:
apt-get install bind9 bind9-doc dnsutils
Mail Gateway para Exchange Server
_____________________________________________________________________________
6/18
Configuramos Bind9 para que sea servidor de nombres secundario de midominio.com:
• Creamos una nueva zona secundaria en BIND cuyo servidor master sea IP-Externa.
• Debemos indicar al DNS de Windows para que permita la transferencia de zona al IP-Interna
del servidor.
5 INSTALACIÓN DE POSTFIX
Instalamos los paquetes necesarios, necesitamos soporte ssl (para certificados) y ldap para
autenticarnos:
- apt-get install postfix: En la instalación de postfix nos hará una serie de preguntas:
� Tipo de servidor: "sitio de Internet".
� Nombre del servidor: "smtp.midominio.com".
� Resto de opciones por defecto.
- apt-get install postfix-ldap
- apt-get install postfix-doc
- apt-get install postfix-pcre
- apt-get install postfix-tls (me dice que ya se ha instalado con postfix).
NOTA: Al instalar postfix, se instala también el soporte TLS. Para ello se instala automáticamente
Openssl y ssl-cert
- probamos que el servidor contesta: telnet smtp.midominio.com 25.
5.1 INSTALAMOS SASL PARA AUTENTICACIÓN DE USUARIOS
Para la autenticación de usuarios utilizaremos SASL que contiene soporte LDAP
apt-get install sasl2-bin
apt-get install libsasl2-modules.
Al instalar este paquete nos sugiere instalar también lo siguiente:
libsasl2-modules-opt
libsasl2-modules-ldap
Mail Gateway para Exchange Server
_____________________________________________________________________________
7/18
libsasl2-modules-sql
libsasl2-modules--gssapi-mit
Nosotros queremos usar SASL para autenticación de usuarios contra un Active Directory. Para
ello necesitamos que SASL soporte LDAP. Instalamos por tanto libsasl2-modules-ldap
apt-get install libsasl2-modules-ldap
Para que SASL funcione con LDAP debemos crear el siguiente fichero /etc/saslauthd.conf (vi
/etc/saslauthd.conf) con el siguiente contenido:
ldap_servers: ldap://192.168.1.1/ \\ servidor donde está el servicio LDAP
ldap_bind_dn: [email protected] \\ usuario con permisos de consulta en la BD
ldap_bind_pw: password \\ contraseña del usuario con permisos de lectura en la BD
ldap_version: 3
ldap_search_base: CN=Users,DC=MIDOMINIO,DC=COM
ldap_filter: (&(objectclass=user)(sAMAccountName=%u))
Nos falta decirle al demonio de saslauthd que se ejecute al inicio, Para ello debemos cambiar
el fichero /etc/default/saslauthd:
START=yes
y que se ejecute con soporte LDAP. Para ello debemos cambiar el fichero /etc/default/saslauthd,
donde pone "pam" cambiamos a "ldap":
MECHANISMS="ldap"
reiniciamos el demonio de saslauthd:
/etc/inid.d/saslauthd start ó restart
Comprobamos que el demonio está corriendo con soporte ldap. para ello usamos ps -ax | grep
sasl y debe aparecer:
Mail Gateway para Exchange Server
_____________________________________________________________________________
8/18
4465 ? Ss 0:00 /usr/sbin/saslauthd -a ldap -c -n 5
4466 ? S 0:00 /usr/sbin/saslauthd -a ldap -c -n 5
4467 ? S 0:00 /usr/sbin/saslauthd -a ldap -c -n 5
4468 ? S 0:00 /usr/sbin/saslauthd -a ldap -c -n 5
4469 ? S 0:00 /usr/sbin/saslauthd -a ldap -c -n 5
4486 pts/1 S+ 0:00 grep sasl
Realizamos una prueba para consultar en la base de datos de LDAP del Active Directory:
smtp:/etc# testsaslauthd -u ldap -p password
0: OK "Success."
Si cambiamos el password nos debe dar error. También podemos usar un sniffer en el
controlador de dominio para ver si le están llegando peticiones LDAP.
5.2 CONFIGURACIÓN DE POSTFIX PARA AUTENTICACIÓN CON SASL
Quitamos el CHROOT a postfix para que pueda coger toda la configuración de /etc. Para
editamos el fichero /etc/postfix/master.cf y cambiamos la línea smtp y en el campo chroot ponemos
"n":
#
=================================================== ==========
=============
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
#
=================================================== ==========
=============
smtp inet n - n - - smtpd
Revisamos la configuración básica. Para ello utilizamos el comando dpkg-recofigure postfix:
Tipo de servidor: "sitio de Internet".
correo para superusuario: "[email protected]"
Nombre del servidor: "smtp.midominio.com"
Mail Gateway para Exchange Server
_____________________________________________________________________________
9/18
Redes locales: "127.0.0.0/8 192.168.1.0/24"
entrega local: "usar procmail"
resto de opciones por defecto
Añadimos soporte SASL a postfix. Para ello utilizamos el comando postconf -e:
postconf -e "smtpd_sasl_local_domain ="
postconf -e "smtpd_sasl_auth_enable = yes"
postconf -e "smtpd_sasl_security_options = noanonymous"
postconf -e "broken_sasl_auth_clients = yes"
postconf -e "smtpd_recipient_restrictions =
permit_sasl_authenticated,permit_mynetworks,
reject_unauth_destination"
postconf -e "inet_interfaces = all"
Después añadimos el fichero smtpd.conf para que postfix tome el tipo de autenticación:
echo "pwcheck_method: saslauthd" >> /etc/postfix/sasl/smtpd.conf
echo "mech_list: plain login" >> /etc/postfix/sasl/smtpd.conf
y añadimos permisos a postfix para poder leer los ficheros de saslauthd:
adduser postfix sasl
Con esto debemos poder enviar correo autenticado contra un servidor LDAP con Active Directory.
5.3 AÑADIR TLS A POSTFIX
Para añadir seguridad a postfix debemos hacer que el intercambio de credenciales sea seguro.
Para ello se implementará un tunel TLS a través de certificados de Servidor que podremos usar en
cualquier cliente SMTP con soporte SSL:
- creamos el directorio donde se almacenarán las claves y los certificados de servidor:
mkdir /etc/postfix/ssl
Mail Gateway para Exchange Server
_____________________________________________________________________________
10/18
- Nos cambiamos de a ese directorio y utilizamos las rutinas de openssl para crear los certificados. Nos
pedirá una clave cada vez que generemos la clave pública. Siempre usaremos la clave "mipassword"
cd /etc/postfix/ssl/
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
- Configuramos Postfix para que soporte TLS:
postconf -e 'smtpd_tls_auth_only = no'
postconf -e 'smtp_use_tls = yes'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtp_tls_note_starttls_offer = yes'
postconf -e 'smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt'
postconf -e 'smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem'
postconf -e 'smtpd_tls_loglevel = 1'
postconf -e 'smtpd_tls_received_header = yes'
postconf -e 'smtpd_tls_session_cache_timeout = 3600s'
postconf -e 'tls_random_source = dev:/dev/urandom'
- reiniciamos postfix: /etc/init.d/postfix restart
Mail Gateway para Exchange Server
_____________________________________________________________________________
11/18
5.4 REENVIAR TODO EL CORREO AL EXCHANGE
- Para enviar todo el correo al Exchange debemos crear el fichero /etc/postfix/transport
vi transport
- Añadimos la siguiente línea:
midominio.com smtp:192.168.1.104
- ejecutamos postmap transport. Esto nos crea el fichero /etc/postfix/transport.db
- Le decimos a postfix que busque aquí:
postconf -e "transport_maps=hash:/etc/postfix/transport"
- Reiniciamos postfix. De esta forma todo el correo CORRECTO se reenviará al exchange.
Debemos realizar unos cambios para que POSTFIX acepte correo que no sea para ningún
usuario local (debemos recordar que todo el correo debe enviarse al Exchange y que por tanto el
postfix no tendrá dados de alta los usuarios que reciben el correo). Para ello debemos añadir en
/etc/postfix/main.cf:
local_recipient_maps =
Al dejar esta directiva vacía, postfix aceptará todo el correo que sea de Internet. Ahora solo
queda revisar los dominios que acepta postfix. Esto lo veremos en la directiva MYDESTINATION.
Aquí debemos incluir todos los dominios que acepta postifx, tanto a nivel de máquina como a nivel de
dominio. Debe quedar así:
mydestination = smtp.midominio.com, midominio.com,localhost
Mail Gateway para Exchange Server
_____________________________________________________________________________
12/18
6 FILTRO DE CONTENIDOS PARA POSTFIX
Una vez que hemos comprobado que funciona correctamente el envío y recepción de correo a a
través de POSTFIX, incluyendo la seguridad (a través de TLS) instalaremos un filtro de contenidos
para evitar el SPAM. Para poder filtrar por contenidos debemos instalar una aplicación que interactue
entre Postfix y el filtro de contenidos. Para ello usaremos Mailscanner como intermediario y
Spamassassin como filtro de contenidos.
- Instalamos SPAMASSASSIN.
apt-get install spamassassin spamc
- Debemos cambiar algunos parámetros en su fichero de configuración. Para ello nos vamos a
/etc/mail/spamassasin/local.cf:
report_safe 1
required_score 5.0
use_bayes 1
bayes_auto_learn 1
Nos hace falta un componente que interactue entre Postfix y Spamassassin. Para ello
instalaremos MAILSCANNER. Previamente debemos parar postfix:
/etc/init.d/postfix stop
apt-get install mailscanner
Cambiamos los siguientes parámetros del fichero de configuración de MailScanner para que
funcione con Postfix:
Run As User=postfix
Run As Group=postfix
Incoming Queue Dir=/var/spool/postfix/hold
Outgoing Queue Dir=/var/spool/postfix/incoming
MTA=postfix
Mail Gateway para Exchange Server
_____________________________________________________________________________
13/18
Debemos asegurarnos de que el usuario postfix puede escribir en todos los ficheros de
configuración de MailScanner. Para ello cambiamos el propietario y el grupo de los siguientes
directorios de la siguiente forma:
chown postfix.postfix /var/spool/MailScanner/incoming
chown postfix.postfix /var/spool/MailScanner/quarantine
NOTA: Cuando arranquemos MailScanner veremos como nos dice que el usuario no es correcto para
varios directorios más. Solamente tenemos que utilizar chown para cambiar el propietario y el grupo
de todos los que nos pida.
Ahora solamente nos queda hacer una modificación en Postfix para que MailScanner pueda
funcionar correctamente. Si observamos en las líneas anteriores le hemos dicho a MailScanner que la
cola de entrada (Incoming Queue) es la cola Hold de Postfix, y que la cola de salida de MailScanner es
la cola de incoming de Postfix. Esto es así porque cualquier correo que reciba Postfix, lo pondrá en su
cola HOLD. De aquí lo cogerá MailScanner, lo analizará y lo pondrá en la cola de incoming de
Postfix, que seguirá su proceso normal.
Para decirle a Postfix que ponga todos los correos recibidos en la cola HOLD debemos hacer
lo siguiente:
- editamos el fichero (no existe, lo creamos) /etc/postfix/header_checks y añadimos:
/^Recived:/ HOLD
- Luego añadimos una línea a /etc/postfix/main.cf
header_checks=regexp:/etc/postfix/header_checks
- Arrancamos Postfix y MailScanner
/etc/init.d/postfix start
/etc/init.d/mailscanner start
Para probarlo nos enviamos un mail y en las cabeceras debemos ver entradas de MailScanner.
Cualquier correo que identifique como SPAM lo marcará cambiando el subjet por {Spam?}.
Mail Gateway para Exchange Server
_____________________________________________________________________________
14/18
6.1 COMO HACER QUE SPAMASSASSIN APRENDA
Ahora nos queda ver como Spamassassin puede aprender que correos son buenos y cuales no.
Para ello tenemos que indicarle durante un tiempo que correos son SPAM y cuales HAM (buenos). En
el entorno donde nosotros estamos haciendo la instalación vemos que no tenemos usuarios locales.
Todos los usuarios son del EXCHANGE. Por ello nos vamos a crear un usuario que pueda leer un
buzón donde iremos metiendo correo SPAM y correo HAM. Para ello seguiremos los siguientes
pasos:
- Instalamos un cliente de correo IMAP que pueda acceder al Exchange:
apt-get install fetchmail
- Creamos un usuario local para leer estos correos:
adduser mailrd
- En el HOME de este usuario modificamos el .procmailrc y el .fetchmailrc de la siguiente forma
.procmailrc:
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/Inbox
LOGFILE=$MAILDIR/logfile.txt
SHELL=/bin/sh
:0:
Inbox
.fetchmailrc:
poll 192.168.1.104 protocol imap username ham password password
- creamos en el Exchange el usuario ham con password password, y dos carpetas en el buzón del
usuario, una carpeta llamada spam (donde iremos metiendo correo basura) y otra carpeta llamada ham
(donde iremos metiendo correos buenos).
- creamos y damos los permisos necesarios a los directorios que hemos establecido:
Mail Gateway para Exchange Server
_____________________________________________________________________________
15/18
mkdir Mail
mkdir Mail/Inbox
chown -R mailrd.mailrd Mail/
chmod -R 710 Mail/
Para probar si funciona enviamos un correo desde un usuario local al usuario mailrd, por
ejemplo desde root hacemos lo siguiente:
echo hola | mail mailrd
nos debe llegar un correo al $HOME/Mail/Inbox
En el crontab de mailrd, nos creamos un scritp que recoja el correo del buzón de HAM y lo
envíe a Spamassassin para que aprenda. El script sería:
#!/bin/bash
#################################################
# #
#learnspam #
#################################################
date
rm ~/Mail/Inbox
touch ~/Mail/Inbox
fetchmail --folder inbox/spam --all
INBOXSIZE="uno.." # lo que sea menos 0
NEWSIZE="0"
while [ "$INBOXSIZE" != "$NEWSIZE" ]
do
INBOXSIZE="$NEWSIZE"
sleep 5
NEWSIZE=`ls -l ~/Mail/Inbox | awk '{ print $5 }'`
Mail Gateway para Exchange Server
_____________________________________________________________________________
16/18
done
sa-learn --mbox --no-sync --spam ~/Mail/Inbox
rm ~/Mail/Inbox
touch ~/Mail/Inbox
fetchmail --folder inbox/ham --all
INBOXSIZE="uno.." # lo que sea menos 0
NEWSIZE="0"
while [ "$INBOXSIZE" != "$NEWSIZE" ]
do
INBOXSIZE="$NEWSIZE"
sleep 5
NEWSIZE=`ls -l ~/Mail/Inbox | awk '{ print $5 }'`
done
sa-learn --mbox --no-sync --ham ~/Mail/Inbox
rm ~/Mail/Inbox
touch ~/Mail/Inbox
sa-learn --sync
Este script lo planificamos para que se ejecute cada hora: crontab -e
5 * * * * /home/mailrd/learnspam >> ~/loglearning.txt 2>/dev/null
Es importante destacar que para que fetchmail pueda recoger el correo del Exchange debe hacer
uso de postfix. Por ello debemos decirle que para el usuario que estamos usando (mailrd) cualquier
correo se entregue en local. Debemos modificar por tanto el transport de Postfix.
Mail Gateway para Exchange Server
_____________________________________________________________________________
17/18
7 AÑADIENDO SEGURIDAD A POSTFIX
Vamos a añadirles una serie de normas standarizadas con las cuales vamos a eliminar la mayor
parte del correo basura. Para ver el significado de cada una de las etiquetas debemos revisar la web de
postfix en http://www.postfix.org/uce.html. Para añadir estas restricciones, abrimos el fichero
/etc/postfix/main.cf y añadimos las siguientes etiquetas:
# Medidas antispam (anti-UCE)
smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
smtpd_recipient_restrictions =
reject_invalid_hostname,
# reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client dul.dnsbl.sorbs.net,
reject_rbl_client dnsbl.sorbs.net,
permit
smtpd_data_restrictions =
reject_unauth_pipelining,
permit
Mail Gateway para Exchange Server
_____________________________________________________________________________
18/18
8 NOTAS
1: reject_non_fqdn_hostname lo tengo que quitar porque si no desde equipos que se llamen
EQUIPO1, EQUIPO2, CORREO, que son nombres de host no FQDN no se puede enviar correo.
2: Cambio en MailScanner la etiqueta SpamScore Number Instead Of Stars = yes para que muestre en
formato numérico la puntuación que le da SpamAssassin al correo en vez de mostrar "S".
3: cambio esto para que no aparezca disarmed en el asunto de estos correos
Disarmed Modify Subject = no