Instalar Servidor de mail QMail


Hace ya varios años que tengo funcionando un  servidor QMail sobre un Fedora 4 !! y creo que lo he reiniciado solo en un par de ocasiones. Como me propuse modernizarlo un poco, acá dejo mis notas sobre la instalación de un servidor (MTA) de mail QMail del gran Dan Bernstein en un CentOS 5.5. También he realizado esta instalación sobre RHEL 4 y 5 sin problemas.
Esta instalación tiene como base la guía qmailrocks, pero con varias modificaciones de acuerdo a los patch’s creados por el gran jsimpson
Esto no pretende ser una receta de cocina de instalación de un MTA, son solo notas de instalación con algunos comentarios útiles para saber como encararla.
Entonces manos al a obra:

Necesitamos instalar:
1. Apache Web Server
2. PHP
3. Perl
4. GCC
5. MySQL
6. OpenSSL
7. OpenSSL-dev
8. libssl-dev
9. wget
10. patch & patchutils
NO necesitamos instalar:
1. Postfix
2. Ningún Pop Service
3. Ningún SMTP Service, salvo Sendmail

Modulos Perl a instalar:
Digest::SHA1
Digest::HMAC
Net::DNS
Time::HiRes
HTML::Tagset
HTML::Parser

Puertos Firewall:
Outbound ports (tcp) :
25 – SMTP
110 – POP services
143 – IMAP
783 – Spamassassin
993 – IMAPS
Inbound Ports (tcp) :
25 – SMTP
80 – HTTP
110 – POP services
143 – IMAP
443 – HTTPS
783 – Spamassassin
993 – IMAPS

Descargas:
Creamos un directorio /downloads y descargamos todo este soft en dicho directorio.
#mkdir /downloads
#cd /downloads

QMail:
# wget http://cr.yp.to/software/qmail-1.03.tar.gz
EZMLM
# wget http://www.ezmlm.org/archive/7.0.2/ezmlm-idx-7.0.2-1.x86_64.rpm
AUTORESPONDER
# wget http://www.inter7.com/devel/autorespond-2.0.5.tar.gz
VPOPMAIL
# wget http://ufpr.dl.sourceforge.net/project/vpopmail/vpopmail-stable/5.4.30/vpopmail-5.4.30.tar.gz
VQADMIN
# wget http://softlayer.dl.sourceforge.net/project/vqadmin/vqadmin/2.3.6/vqadmin-2.3.6.tar.gz
MAILDROP
# wget http://ufpr.dl.sourceforge.net/project/courier/maildrop/2.5.0/maildrop-2.5.0.tar.bz2
QMAILADMIN
wget http://ufpr.dl.sourceforge.net/project/qmailadmin/qmailadmin-stable/1.2.14/qmailadmin-1.2.14.tar.gz

Descargar ucspi-tcp & daemontools:
# wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
# wget http://djbware.csi.hu/patches/daemontools-0.76.errno.patch
# wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch
# wget http://qmail.jms1.net/ucspi-tcp/ucspi-rss2.patch
# wget http://qmail.jms1.net/ucspi-tcp/tcpserver-limits-2007-12-22.patch

Descargar patches de John Simpson: ojo, verifiquemos las ultimas versiones.
# wget http://qmail.jms1.net/patches/qmail-1.03-jms1.7.08.patch
# wget http://qmail.jms1.net/patches/qmail-1.03-jms1.7.08.patch.asc

Descargamos scripts de inicialización, jsimpson_patch, finalización y otros:
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/initial_install_script.sh
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/aplica_jsimpson_patch.sh
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/finalize_install_script.sh
# wget https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/check_perlmods.script

Comenzamos:
ejecutamos script inicial:
# /downloads/initial_install_script.sh
# /downloads/aplica_jsimpson_patch.sh

compilamos QMAIL:
# cd /usr/src/qmail/qmail-1.03
# make man && make setup check

# config-fast mail.dominio.com

Instalamos Certificado:
# make cert

# chown -R vpopmail:qmail /var/qmail/control/clientcert.pem /var/qmail/control/servercert.pem

Compilamos ucspi-tcp:
# cd /usr/src/qmail/ucspi-tcp-0.88/
Aplicamos patch antes de compilar:
# patch < /downloads/ucspi-tcp-0.88.errno.patch
# patch < /downloads/ucspi-rss2.patch
3 patch < /downloads/tcpserver-limits-2007-12-22.patch
# make && make setup check

Compilamos daemontools:
# cd /package/admin/daemontools-0.76
Aplicamos patch antes de compilar:
# cd /package/admin/daemontools-0.76/src
# patch < /downloads/daemontools-0.76.errno.patch
# cd /package/admin/daemontools-0.76
# package/install

Ejecutamos la verificación de permisos de John Simpson:
# wget http://qmail.jms1.net/scripts/vfixpermissions
# /downloads/vfixpermissions

Instalamos EZMLM (listas de correo)
# cd /downloads
# rpm -i ezmlm-idx-7.0.2-1.x86_64.rpm

Instalamos AUTORESPONDER (autorespuesta)
# cd /downloads
# tar zxvf autorespond-2.0.5.tar.gz
# cd autorespond-2.0.5
# make && make install

Instalamos VPOPMAIL (dominios de mail virtuales)
# cd /downloads
# tar zxvf vpopmail-5.4.30.tar.gz
# cd vpopmail-5.4.30
# ./configure –enable-logging=p
#make && make install-strip

Instalamos VQADMIN (interfaz web para administrar vpopmail)
# cd /downloads
# tar zxvf vqadmin-2.3.6.tar.gz
# cd vqadmin-2.3.6
# ./configure –enable-cgibindir=/var/www/cgi-bin –enable-htmldir=/var/www/html
Error al configurar en 64bits. Ver este comentario:
vqadmin has old config.guess and config.sub files do not have the
definitions for the 64 bit operating systems. You can copy those files from a
recent vpopmail release and it should configure just fine. I did this
last week and it worked.
So:
# /downloads/vqadmin-2.3.6
# mv config.guess config.guess.20100907
# mv config.sub config.sub.20100907
# cp ../vpopmail-5.4.30/config.sub .
# cp ../vpopmail-5.4.30/config.guess .

Y hacemos de nuevo el configure:
# ./configure –enable-cgibindir=/var/www/cgi-bin –enable-htmldir=/var/www/html

make && make install-strip

Configuramos Apache:
# vi /etc/httpd/conf/httpd.conf
agregamos:

deny from all
Options ExecCGI
AllowOverride AuthConfig
Order deny,allow

Setear:
AllowOverride All

# cd /var/www/cgi-bin/vqadmin

creamos .htaccess:
# vi .htaccess

y agregamos:

AuthType Basic
AuthUserFile /etc/httpd/conf/vqadmin.passwd
AuthName vQadmin
require valid-user
satisfy any

luego:

# chown apache .htaccess
# chmod 644 .htaccess

luego agregamos al admin con su passwd:
# htpasswd -bc /etc/httpd/conf/vqadmin.passwd admin passwordquequeremos
# chmod 644 /etc/httpd/conf/vqadmin.passwd

luego:

# /sbin/service httpd restart

deberíamos poder navegar en la siguiente dirección:

http://localhost/cgi-bin/vqadmin/vqadmin.cgi

Instalamos MAILDROP (filtro de mensajes)
# cd /downloads
# tar jxvf maildrop-2.5.0.tar.bz2
# cd maildrop-2.5.0
# ./configure –prefix=/usr/local –exec-prefix=/usr/local –enable-maildrop-uid=root –enable-maildrop-gid=vchkpw –enable-maildirquota
# make && make install-strip && make install-man

QMAILADMIN  (interfaz web para administrar cuentas de mail)

# cd /downloads
# tar zxvf qmailadmin-1.2.14.tar.gz
# cd qmailadmin-1.2.14
# ./configure –enable-cgibindir=/var/www/cgi-bin –enable-htmldir=/var/www/html
# make && make install-strip

Deberiamos poder navegar a:
http://localhost/cgi-bin/qmailadmin/

Finalizamos la instalacion de QMAIL:
ejecutamos:
# ./finalize_install_script.sh

editamos y cambiamos mail.example.com en:
# vi /var/qmail/supervise/qmail-pop3d/run
editamos y cambiamos mail.example.com en:
# vi /var/qmail/supervise/qmail-smtpd/run

# qmailctl stop

# echo ‘127.:allow,RELAYCLIENT=””‘ >> /etc/tcp.smtp

# qmailctl cdb

Creamos Alias comunmente utilizados:
# echo postmaster@dominio.com > /var/qmail/alias/.qmail-root
# echo postmaster@dominio.com > /var/qmail/alias/.qmail-postmaster
# echo postmaster@dominio.com > /var/qmail/alias/.qmail-mailer-daemon
# ln -s /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-anonymous
# chmod 644 /var/qmail/alias/.qmail*

DESINSTALANDO SENDMAIL:
Verificamos si está instalado:
# rpm -qa | grep sendmail
si está instalado lo desinstalamos
# /etc/rc.d/init.d/sendmail stop (to stop Sendmail)
# rpm -e –nodeps sendmail-x.x.x.x
# rpm -e –nodeps sendmail-doc-x.x.x.x
# rpm -e –nodeps sendmail-devel-x.x.x.x
# rpm -e –nodeps sendmail-cf-x.x.x.x

Establecemos un “path artifical” para el sendmail:
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

Probando:
Si hacemos
# telnet localhost 110
o
# telnet localhost 25
tenemos que tener respuesta.

OJO en versiones de 64 bits modificar la varialbe softlimits en el run dado que da error. Aumentarla al menos a 40000000

Instalamos COURIER AUTH LIB:
Descargamos
wget https://sourceforge.net/projects/courier/files/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2/download

# cd /downloads/
# tar jxvf courier-authlib-0.63.tar.bz2
# cd courier-authlib-0.63
# ./configure –prefix=/usr/local –exec-prefix=/usr/local –with-authvchkpw –without-authldap –without-authmysql –disable-root-check –with-ssl –with-authchangepwdir=/usr/local/libexec/authlib –with-redhat
# make && make check
# make install-strip && make install-configure

Editamos el rc.local para colocar el arranque al inicio del servicio:

# vi /etc/rc.local

Añadimos la siguiente línea:
/usr/local/sbin/authdaemond start

Instalamos COURIER-IMAP/IMAPS con Courierpassd (autenticación a través de IMAP)
Descargamos
wget https://sourceforge.net/projects/courier/files/imap/4.8.1/courier-imap-4.8.1.tar.bz2/download

OJO que COURIER-IMAP debe ser instalado por un usuario NO ROOT

$ cd /downloads/
$ tar jxvf courier-imap-4.8.1.tar.bz2
$ chown -R hvivani:users courier-imap-4.8.1
$ cd /downloads/courier-imap-4.8.1
$ su hvivani
$ ./configure –prefix=/usr/local –exec-prefix=/usr/local –with-authvchkpw –without-authldap –without-authmysql –disable-root-check –with-ssl –with-authchangepwdir=/usr/local/libexec/authlib –with-redhat

$ make && make check
Ahora volvemos al usuario ROOT:
$ exit
# make install-strip && make install-configure

Ahora crearemos un certificado SSL para el servidor IMAP-SSL
/usr/local/sbin/mkimapdcert

vi /usr/local/etc/imapd.cnf
cambiamos postmaster@example.com por una direccion de mail administrativa que usemos
Grabamos y salimos
vi /usr/local/etc/imapd
Verificar que la siguiente linea existe: IMAPDSTART=YES
vi /usr/local/etc/imapd-ssl
Verificar que la siguiente linea existe: IMAPDSSLSTART=YES
Verificar que la siguiente linea existe: TLS_CERTFILE=/usr/local/share/imapd.pem
Grabamos y salimos.
vi /usr/local/etc/authlib/authdaemonrc
Cerca de la linea 27 veremos la configuracion “authmodulelist”. Tenemos que verificar que “authvchkpw” es el unico modulo instalado.
Quedaría asi:
authmodulelist=”authvchkpw”
Grabamos y salimos.
Creamos los scripts de inicialización:
# cp /usr/local/libexec/imapd.rc /etc/rc.d/init.d/imap
# cp /usr/local/libexec/imapd-ssl.rc /etc/rc.d/init.d/imaps

Starteamos  Authdaemond, IMAP e IMAPS:
# /usr/local/sbin/authdaemond stop
# /usr/local/sbin/authdaemond start
# /etc/rc.d/init.d/imap stop
# /etc/rc.d/init.d/imaps stop
# /etc/rc.d/init.d/imap start
# /etc/rc.d/init.d/imaps start
Si hacemos un
# nmap localhost
deberíamos ver los puertos 143 y el 993 escuchando.
Los probamos:
#telnet localhost 143
Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE STARTTLS] Courier-IMAP ready. Copyright 1998-2003 Double Precision, Inc. See COPYING for distribution information.
a login postmaster@mydomain.com my_password
a OK LOGIN Ok. (successful login!)
a logout (logs you out)
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed
Connection closed by foreign host.

Ahora Instalamos Courierpassd
cd /downloads/
tar zxvf courierpassd-1.1.0-RC1.tar.gz
cd courierpassd-1.1.0-RC1
./configure
make && make install

Si usamos Xinetd, agregamos el script de arranque:

# cd /etc/xinetd.d
Creamos el script de courierpassd
# vi courierpassd
service courierpassd
{
port = 106
socket_type = stream
protocol = tcp
user = root
server = /usr/local/sbin/courierpassd
server_args = -s imap
wait = no
only_from = 127.0.0.1
instances = 4
disable = no
}
Nota: Courierassd necesita abierto el puerto 106 por lo menos para el tráfico local (127.0.0.1).
Grabamos y salimos

Agregamos el servicio CourierPassd a los servicios del sistema:
# vi /etc/services
Agregamos la siguiente línea al archivo /etc/services :
courierpassd 106/tcp #for /etc/xinetd.d/courierpassd
Restarteamos el xinetd
# /etc/rc.d/init.d/xinetd restart

Ahora tratamos de hacer un cambio de password con este servicio:

# telnet localhost 106
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
200 courierpassd v0.30 hello, who are you?
user postmaster@dominio.com
200 Your password please.
pass my_password
200 Your new password please.
newpass my_new_password
200 Password changed, thank-you.
quit
200 Bye.
Connection closed by foreign host.

Instalamos SquirrelMail (Cliente WebMail)

Verifiquemos en el /etc/php.ini la opción file_uploads = On

Bajamos la ultima versión de Squirrelmail de http://www.squirrelmail.org/download.php
Cambiamos directorio al de instalación y descomprimimos:
# cd /var/www/html
# tar -zxvf /downloads/squirrelmail-x.x.x.tar.gz
# mv  squirrelmail-x.x.x to  webmail

Ahora lo configuramos:
# mkdir /var/sqattachements
# chown -R apache:apache /var/sqattachements
# cd webmail
# chown -R apache:apache data
# cd config
# ./conf.pl
Esto ejecutará el script de configuraciónd el squirrelMail, donde debemos configurar basicamente lo siguiente:
General
——-
1. Domain : 1.2.3.4 ( IP del Servidor )
2. Invert Time : false
3. Sendmail or SMTP : SMTP
IMAP Settings
————–
4. IMAP Server : localhost
5. IMAP Port : 143
6. Authentication type : login
7. Secure IMAP (TLS) : false
8. Server software : other
9. Delimiter : detect
SMTP Settings
————-
4. SMTP Server : localhost
5. SMTP Port : 25
6. POP before SMTP : false
7. SMTP Authentication : login
8. Secure SMTP (TLS) : false

Ahora configuramos el apache para definir el servidor, agregando esta entrada en el /etc/httpd/conf/httpd.conf

ServerName mail.dominio.com
ServerAlias mail.*
ServerAdmin postmaster@dominio.com
DocumentRoot /var/www/webmail

Reloadeamos el apache:
# service httpd reload

Ahora si ponemos la dirección http://www.dominio.com/webmail/ en el navegador, deberíamos ver el cliente web de mail squirrelmail.
Debemos ingresar usando:
Username: postmaster@dominio.com
Password: password
Algo importante es instalar el plugin para cambiar passwords e idioma:

# cd /var/www/html/webmail/plugins
Descargamos el modulo…
# wget http://squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fchange_pass-2.7-1.4.x.tar.gz
Descomprimimos…
# tar zxvf change_pass-2.7-1.4.x.tar.gz

Añadimos el módulo en el squirrel:
# cd /var/www/htmp/webmail/config
Ejecutamos el script de configuración…
# ./conf.pl

Elegimos la opción “plugins” y veremos para agregar el “change_pass”. Grabamos y listo.

Instalamos Clam Antivirus y SpamAssassin (Antivirus y AntiSpam)

Vamos a necesitar los siguientes módulos Perl:

Digest::SHA1
Digest::HMAC
Net::DNS
Time::HiRes
HTML::Tagset
HTML::Parser
Pod::Usage
Parse::Syslog
Statistics::Distributions
perl-suidperl
unzip

Podemos chequear si tenemos instalados estos modulos, ejecutando como usuario NO ROOT, el siguiente script:
$ /downloads/check_perlmods.script

Si nos falta algún módulo, podemos descargarlo directamente desde http://www.cpan.org

Instalamos el Clamav:
# yum install clamav clamav-devel

Verificamos la siguiente configuración en el /etc/clamd.conf:
“Example” – Debe estar comentada (#)
“LogFile” – seteamos /var/log/clamav/clamd.log
“LogTime” – descomentamos
“LogSyslog” – descomentamos
“User” – seteamos a qscand
“ScanMail” – descomentamos

Creamos el usuario qscand:
# useradd -c “Qmail-Scanner Account” -s /bin/false qscand

Starteamos el clamd:
# /etc/init.d/clamd stop
# /etc/init.d/clamd start

Actualizamos la base de virus:
# /usr/bin/freshclam -l /var/log/clamav/clam-update.log

[root@dominio.com clamav]# freshclam -l /var/log/clamav/clamav-update.log
ClamAV update process started at Sun Oct 24 23:36:22 2004
main.cvd is up to date (version: 27, sigs: 23982, f-level: 2, builder: tomek)
daily.cvd is up to date (version: 549, sigs: 1583, f-level: 3, builder: ccordes)

Creamos una entrada en el crontab para que la base se actualice sola:

# crontab -e
25 1 * * * /usr/bin/freshclam –quiet -l /var/log/clamav/freshclam.log
grabamos y salimos

Instalamos SpamAssassin

# yum install spamassassin spamassassin-tools

Instalamos QmailScanner

Descargamos el qmailscanner y el qms-analog. Verificar las últimas versiones:
# cd /downloads
# wget http://sourceforge.net/projects/qmail-scanner/files/qmail-scanner/2.08/qmail-scanner-2.08.tgz/download
# wget http://prdownloads.sourceforge.net/qms-analog/qms-analog-0.4.4.tar.gz?download

# tar -zxvf qmail-scanner-2.08.tgz
# tar -zxvf qms-analog.0.4.4.tgz

# cd qms-analog.0.4.4
# make all

# cd /downloads/qmail-scanner-2.08
# vi qms-config

modificamos lo marcado en rojo:

#!/bin/sh
if [ “$1” != “install” ]; then
INSTALL=
else
INSTALL=”–install”
fi
./configure –domain yourdomain.com \
–admin postmaster \
–local-domains “yourdomain.com,yourotherdomain.com” \
–add-dscr-hdrs yes \
–dscr-hdrs-text “X-Antivirus-MYDOMAIN” \
–ignore-eol-check yes \
–sa-quarantine 0 \
–sa-delete 0 \
–sa-reject no \
–sa-subject “:SPAM:” \
–sa-delta 0 \
–sa-alt yes \
–sa-debug no \
–notify admin \
“$INSTALL”
grabamos y salimos

# chmod 755 qms-config
#./qms-config
respondemos yes a todas las preguntas y si no tenemos errores, directamente instalamos:

# ./qms-config install

Inicializamos el scanner:
# setuidgid qscand /var/qmail/bin/qmail-scanner-queue.pl -z
# setuidgid qscand /var/qmail/bin/qmail-scanner-queue.pl -g

Si todo salió bien, deberíamos tener una salida similar a:
perlscanner: generate new DB file from /var/spool/qmailscan/quarantine-attachments.txt
perlscanner: total of 9 entries.

# chown -R qscand:qscand /var/spool/qmailscan

Para decirle al Qmail que utilice el scanner debemos editar el archivo run y agregar una línea:
# vi /var/qmail/supervise/qmail-smtpd/run
Agregamos la siguiente línea luego del #!/bin/bash
QMAILQUEUE=”/var/qmail/bin/qmail-scanner-queue.pl” ; export QMAILQUEUE
OJO en versiones de 64 bits modificar la varialbe softlimits en el run dado que da error. Aumentarla al menos a 40000000

El archivo run debería haber quedado parecido a esto:
#!/bin/sh
QMAILQUEUE=”/var/qmail/bin/qmail-scanner-queue.pl” ; export QMAILQUEUE
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
if [ -z “$QMAILDUID” -o -z “$NOFILESGID” -o -z “$MAXSMTPD” -o -z “$LOCAL” ]; then
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
echo /var/qmail/supervise/qmail-smtpd/run
exit 1
fi
if [ ! -f /var/qmail/control/rcpthosts ]; then
echo “No /var/qmail/control/rcpthosts!”
echo “Refusing to start SMTP listener because it’ll create an open relay”
exit 1
fi
exec /usr/local/bin/softlimit -m 40000000 \
/usr/local/bin/tcpserver -v -R -l “$LOCAL” -x /etc/tcp.smtp.cdb -c “$MAXSMTPD” \
-u “$QMAILDUID” -g “$NOFILESGID” 0 smtp \
/var/qmail/bin/qmail-smtpd your_domain.com \
/home/vpopmail/bin/vchkpw /usr/bin/true 2>&1

Ahora restarteamos el qmail:
# qmailctl stop
# qmailctl start
# qmailctl stat

Probamos que el qmailscanner funcione con el qmail, clamav y spamassassin:

# cd /downloads/qmail-scanner-2.08/contrib
# chmod 755 test_installation.sh
# ./test_installation.sh -doit
Esto va a generar 2 mails que serán reconocidos como virus y almacenados en cuarentena por el clamav y dos mensajes que iran a la bandeja de entrada, uno de ellos marcado como spam:

setting QMAILQUEUE to /var/qmail/bin/qmail-scanner-queue.pl for this test…
Sending standard test message – no viruses…
done!
Sending eicar test virus – should be caught by perlscanner module…
done!
Sending eicar test virus with altered filename – should only be caught by commercial anti-virus modules (if you have any)…
Sending bad spam message for anti-spam testing – In case you are using SpamAssassin…
Done!
Finished test. Now go and check Email for postmaster@mydomain.com

Si esto funcionó correctamente, en este punto deberíamos teber Clam Antivirus, SpamAssassin y Qmail-Scanner funcionando juntos.
Si el mensaje contenía un virus, se almacenará en cuarentena en: /var/spool/qmailscan/quarantine.

https://dl.dropboxusercontent.com/u/5878683/hvivani.com.ar/qmail/

3 thoughts on “Instalar Servidor de mail QMail

Leave a comment