miércoles, 28 de mayo de 2008

Servidor de correo con Ubuntu 8.04

En este artículo abordaremos la implementación de un servidor de correo utilizando solamente software libre.

Su sistema operativo será Ubuntu 8.04, y el MTA (Mail Transfer Agent) será Postfix.

Fase I: Instalación del sistema operativo

Bueno, como ya se debe estar pensando, esta fase no presenta ningún problema en sí mismo, dado que la instalación que se seguirá es la del sistema operativo Ubuntu 8.04 Server por omisión.

Comienza con el booteo, se selecciona el lenguaje (yo elegí "English"), luego por la zona en la cual me encuentro (yo elegí "other", y luego "South America - Argentina"), luego por el teclado, donde seguí todas las instrucciones hasta que detectó que el teclado de seguro estaba configurado como "latam".

Configuró sólo la tarjeta de red, y por un error de planificación, levantó su dirección IP desde un servidor de DHCP. Eso no hace sino más interesante la tarea, dado que también debo explicar aquí cómo hacer para que se fije una dirección IP. El nombre que elegí para el servidor, en un esfuerzo de imaginación, fue "mailer".

Luego configuró el reloj, particioné el disco (en la sección "Partition Disks" elegí "Manual", luego generé tres particiones, la /dev/sda1, de sólo 150 MB, para /boot, la /dev/sda2, de 1.5 GB, para swap, y la /dev/sda3, del resto, para /), instaló todos los paquetes básicos del servidor, lo cual me llevó menos de 15 minutos, y me solicitó la creación de un nuevo usuario, que será luego el que hará "sudo" cuando sea necesario.

Luego de eso, le avisé que no estaba usando ningún proxy, se realizó la configuración automática de "apt", me pidió que seleccione qué paquetes de software quería instalar, en base a la función del equipo (DNS, LAMP, Mail, OpenSSH, PostgreSQL, Print ó Samba server, de las cuales no seleccioné ninguna, dado que me ocuparé luego de esa instalación de una forma más personalizada y selectiva de paquetes), comenzó la instalación de software (Select and Install software), realizó automáticamente la instalación del GRUB, y finalizó la instalación, con reboot.

En el primer booteo parecía que el servidor estaba colgado, dado que tardó un poco más de lo normal para un equipo de sus características (casi 15 segundos en dar alguna señal de vida), pero a continuación levantó perfectamente.

El nombre del equipo es, sencillamente, "mailer".

Al realizar un "ifconfig -a" encontré que la dirección IP, efectivamente, coincidía con una del rango del DHCP Server que tengo conectado a la red, por lo que ahora comienza la parte donde configuramos la dirección IP final de la tarjeta de red.

Ingresé como el usuario que había configurado, y cambié mi personalidad (no es recomendable trabajar como root siempre) haciendo "sudo /bin/bash". Me pidió la contraseña mía propia, y pude obtener el tan amado prompt "#". Todas las siguientes tareas serán realizadas mediante la cuenta del usuario generado, y el "sudo /bin/bash".

Edité el archivo "/etc/network/interfaces" para que su contenido sea:

auto lo
iface lo inet loopback

iface eth0 inet static
address 192.9.200.20
netmask 255.255.255.0
gateway 192.9.200.1

network 192.9.200.0
broadcast 192.9.200.255

auto eth0

...dado que la dirección de red que le quiero dar es la 192.9.200.200, suponiendo que esa es una dirección pública válida (obviamente, quien alguna vez tuvo algún contacto con Internet desde el punto de vista serio, sabe que no lo es).

Edité el archivo "/etc/resolv.conf", agregándole los que son mis dos servidores de DNS:

nameserver 200.42.0.108
nameserver 200.42.0.109
domain hecsa.com.ar

Ahora, para verificar que todo quedaba como es debido, relancé los procesos de red mediante "/etc/init.d/networking restart"

El siguiente paso, dentro de lo que es el sistema operativo en sí mismo, consistió en instalarle el paquete OpenSSH Server, lo cual hice como siempre, con "apt-get install openssh-server"

Fase II: Vamos por los paquetes

Ahora, lo jugoso. Se viene la instalación del sistema de correo electrónico, se viene!!!

Vamos a comenzar instalando los paquetes que sean necesarios, y para eso, también como siempre, realizaremos las actualizaciones que correspondan.

Para eso, la receta de cocina adecuada es ejecutar "apt-get update", y "apt-get upgrade", aceptando las actualizaciones que nos proponga nuestro amigo "mailer". Se recomienda, luego de esto, realizar un nuevo reboot, sólo por si las actualizaciones han sido profundas, y sus efectos, luego de un "reboot", son requeridos.

Ahora, con los últims paquetes instalados, procedemos a instalar los que serán necesarios para nuestro servidor de correo electrónico, a través de los siguientes comandos:

# apt-get install postfix courier-imap courier-pop mailx

Pocos paquetes, no? Bueno, esto nos va a dejar bajando cerca de 10 MB de paquetes, lo cual nos permite tomar algún café en el medio de la implementación, que nunca viene mal.

Cuando instalemos el paquete postfix, se nos preguntará qué tipo de sistema queremos, a lo cual responderemos que el mismo será un "Internet Site". Acto seguido, nos pedirá que agreguemos un valor para el dominio, considerando que los mails salientes que no lo posean lo terminarán teniendo como agregado. Si bien en este caso la opción por default es el hostname completo, se deberá colocar el nombre del dominio del cual saldrán los mensajes.

Cuando instalemos los paquetes courier-imap y courier-pop, veremos que se nos pregunta si queremos generar algunos directorios del tipo Maildir para algunos usuarios, a lo cual responderemos que no.


Fase III: A configurar todo

Por suerte, la simplicidad de estos paquetes nos llevarán a no tener que configurar demasiadas cosas cuando lo que queremos es un servidor de correo para un solo dominio, por lo que en general, veremos que los pasos son pocos, y sencillos.

El primer archivo que tocaremos será el "/etc/postfix/main.cf". Allí configuraremos lo siguiente:

smtpd_banner = Cualquiera (OpenCualquiera)
biff = no

append_dot_mydomain = no

readme_directory = no

smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

myhostname = mailer.dominio.com.ar
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = dominio.com.ar, mailer.dominio.com.ar, localhost.dominio.com.ar, localhost
relayhost =
mynetworks = 192.9.200.0/24, 192.168.100.0/24, 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 # Redes desde las cuales permito que se envíen mails.
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/ # Este es el formato del mail, maildir, y en cada home directory habra un subdirectorio llamado Maildir, que contendra cur, tmp y new.
mailbox_command =

Por ahora, no tengo que tocar nada más, ya que el mismo courier-imap y courier-pop se han ocupado de configurarse como es debido.


Fase IV: Seguridad

Ahora bien, con la configuración anterior, tendremos un excelente servidor de correo, pero será un blanco perfecto para cuanto spammer haya dando vueltas, por lo que se recomienda seguir estos pasos para asegurar que no terminaremos en una blacklist de spam.

Fase IV-A: Shorewall

Como este servidor tiene más de una tarjeta de red (véase que hay dos en la declaración de mail.cf, una con IP 192.9.200.x y la otra con 192.168.100.x), se ha configurado la misma desde el archivo "/etc/network/interfaces":

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.9.200.20
        netmask 255.255.255.0
        network 192.9.200.0
        broadcast 192.9.200.255
        gateway 192.9.200.1
        dns-nameservers 200.42.0.108 200.42.0.109
        dns-search dominio.com.ar

auto eth1
iface eth1 inet static
        address 192.168.100.250
        netmask 255.255.255.0
        network 192.168.100.0
        broadcast 192.168.100.255

Ahora, comenzaremos a realizar la configuración del paquete shorewall. Primero, lo instalamos con el comando "apt-get install shorewall shorewall-doc".

Una vez que tengamos estos dos paquetes instalados, procederemos a configurar sus archivos, de la siguiente manera:

cp /usr/share/doc/shorewall-common/default-config/interfaces /etc/shorewall/ vi /etc/shorewall/interfaces

En este archivo agregaremos las definiciones de nuestras dos tarjetas de red:

net eth0 detect dhcp,tcpflags,logmartians,nosmurfs

net eth1 detect dhcp,tcpflags,logmartians,nosmurfs

Luego:

cp /usr/share/doc/shorewall-common/default-config/zones /etc/shorewall/ vi /etc/shorewall/zones

Aquí configuraremos las dos zonas que estaremos utilizando, es decir, la de la red, y la del firewall en sí mismo:

net ipv4

Luego:

cp /usr/share/doc/shorewall-common/default-config/hosts /etc/shorewall/

Luego:

cp /usr/share/doc/shorewall-common/default-config/policy /etc/shorewall/ vi /etc/shorewall/policy

Aquí agregaremos las políticas que deseamos:

$FW net ACCEPT

net $FW DROP info

net all DROP info

# Esta politica debe estar al final

all all REJECT info

Luego:

cp /usr/share/doc/shorewall-common/default-config/routestopped /etc/shorewall/ vi /etc/shorewall/routestopped

Y agregamos:

eth0 0.0.0.0 routeback

eth1 0.0.0.0 routeback

Luego:

cp /usr/share/doc/shorewall-common/default-config/rules /etc/shorewall/ vi /etc/shorewall/rules

Y agregamos:

SSH/ACCEPT net $FW

Ping/ACCEPT net $FW

# Permit all ICMP traffic FROM the firewall TO the net zone

ACCEPT $FW net icmp

# mail lines

SMTP/ACCEPT net $FW

SMTPS/ACCEPT net $FW

Submission/ACCEPT net $FW

IMAP/ACCEPT net $FW

IMAPS/ACCEPT net $FW

POP3/ACCEPT net $FW

#web

Web/ACCEPT net $FW

Chequearemos que todo esté correctamente configurado mediante:

shorewall check

Editamos "vi /etc/default/shorewall" y modificamos el valor de "startup" para que esté en 1:

startup=1

Ahora, si queremos, podemos realizar un reboot y ver cómo levantan todos los servicios implementados, inclusive los del firewall (shorewall - realmente iptables)

Fase IV-B: Fail2ban

Si bien en este mismo blog habrán visto algunos detalles sobre cómo implementar estar herramienta, les cuento que la misma ha cambiado desde la publicación de este artículo, por lo que ahora veremos la versión que se puede implementar desde un servidor Ubuntu 8.04 (fail2ban 0.8.2-2).

Comenzamos instalando un paquete como lo hacemos siempre, mediante la ejecución de "apt-get install fail2ban".

Una vez instalado, sólo les recomiendo que modifiquen el archivo "/etc/fail2ban/jail.conf" de la siguiente forma:

destemail = yo@dominio2.com.ar

De esa manera, cada vez que algún caco de la información y el ancho de banda quiera ingresar y falle por más de cierta cantidad de veces, le llegará un mail a esta dirección, aparte de deshabilitar a la dirección IP de origen.

Recordemos que siempre luego de hacer cualquier modificación a los archivos del fail2ban, tendremos que relanzar sus procesos mediante "/etc/init.d/fail2ban stop" y "/etc/init.d/fail2ban start".

Fase IV-C: Postgrey

Ahora, uno de los platos fuertes de esta noche, aparte de todo lo que vimos antes. Vamos a implementar el sistema postgrey, que no es ni más ni menos que un greylisting para el servidor de correos Postfix.

El principio del proceso es el mismo de siempre, debemos instalarlo con el comando "apt-get install postgrey".

Luego, tendremos que modificar el archivo "/etc/postfix/main.cf" para que comience a utilizar este sistema. Le agregaremos las siguientes líneas:

smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        check_policy_service inet:127.0.0.1:60000

Y finalmente relanzamos los procesos del postfix para que se tomen los cambios ("/etc/init.d/postfix stop" y "/etc/init.d/postfix start").

Publicar un comentario en la entrada