Servidor de E-mails Virtuais – Postfix, Qmail, Vpopmail no Slackware 12.0

Neste artigo veremos como unir a praticidade da solução qmail+vpopmail com a segurança e confiabilidade do postfix.

1 – Softwares

Qmail - http://www.mail.org/
Postfix - http://www.postfix.org/
Clamav - http://www.clamav.net/
Amavisd-new - http://www.ijs.si/software/amavisd/
SpamAssassin - http://spamassassin.apache.org/
Vpopmail - http://www.inter7.com/
autorespond - http://www.inter7.com/
Qmailadmin - http://www.inter7.com/
Vqadmin - http://www.inter7.com/
cyrus-sasl - programa fonte do CD do slackware
courier-authlib - http://www.courier-mta.org
courier-imap - http://www.courier-mta.org

2 – Instalação

2.1 - Qmail 
A instalação do qmail descrita aqui neste artigo baseia-se na documentação do site
http://www.lifewithqmail.org/. Não se assuste com as semelhanças, pois boa parte do meu 
conhecimento em qmail veio desta documentação.

2.1.1 - Fazendo o download
O primeiro passo é fazer download do qmail e dos seus módulos, para isso utilize os links abaixo:
   * qmail, http://www.qmail.org/netqmail-1.06.tar.gz
   * ucspi-tcp, http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
   * daemontools, http://cr.yp.to/daemontools/daemontools-0.76.tar.gz

2.1.2 - Descompactando
Como são programas fontes, vamos ter que descompactá-los, para depois compilarmos e instalarmos 
os pacotes. Para uma melhor organização, todos os programas que formos instalar baseado em código
fonte, iremos descompactá-los no diretório /usr/local/src. A unica excessão será o pacote
daemontools, que deve ser descompactado em um diretório específico. Siga os comandos abaixo.

$ su -
# cd /usr/local/src
# tar zxf netqmail-1.06.tar.gz
# tar zxf ucspi-tcp-0.88.tar.gz
# mkdir /package
# chmod 1755 /package
# cd /package
# tar zxf daemontools-0.76.tar.gz

2.1.3 - Criando os diretórios
O programa de instalação do qmail cria todos os subdiretórios, mas precisamos criar para ele o
diretório principal onde o qmail será instalado.

# mkdir /var/qmail

As configurações do qmail são gravadas por padrão em /var/qmail/control. Para mantermos todos os
arquivos de configuração no /etc mantendo assim um padrão de trabalho vamos criar um diretório 
/etc/qmail e fazer no diretório /var/qmail apontando para ele.

# mkdir /etc/qmail
# ln -s /etc/qmail /var/qmail/control

2.1.4 - Criando usuários e grupos
Devemos criar os usuários que vão ser utilizados pelo qmail para gerenciar sua execução, gravação
de logs, etc. Os uids e gids utilizados podem ser alterados de acordo com as suas necessidades.

# groupadd -g 400 nofiles
# useradd -u 400 -g nofiles -d /var/qmail/alias alias
# useradd -u 401 -g nofiles -d /var/qmail qmaild
# useradd -u 402 -g nofiles -d /var/qmail qmaill
# useradd -u 403 -g nofiles -d /var/qmail qmailp
# groupadd -g 401 qmail
# useradd -u 404 -g qmail -d /var/qmail qmailq
# useradd -u 405 -g qmail -d /var/qmail qmailr
# useradd -u 406 -g qmail -d /var/qmail qmails

2.1.5 - Compilando
Agora nós podemos compilar o qmail. Acesse o diretório /usr/local/src/netqmail-1.06 e execute os 
procedimentos abaixo:

# make setup check

Agora o qmail já está compilado e instalado, precisamos configurar o nome do servidor, existem 
duas maneiras de realizar este procedimento.
* Se o seu dns estiver devidamente configurado execute apenas:
  # ./config
* Se por alguma razão o config não conseguir encontrar o seu nome de servidor no dns, execute 
então:
  # ./config-fast nome.dominio.com.br

Pronto, agora o qmail já está instalado em seu sistema.

2.1.6 - Instalando o ucspi-tcp
Acesse o diretório onde o ucspi-tcp foi descompactado:

# cd /usr/local/src/ucspi-tcp-0.88

Então execute:

# patch < /usr/local/src/netqmail-1.06/other-patches/ucspi-tcp-0.88.errno.patch
# make
# make setup check

Pronto, o ucspi-tcp já está instaldo em seu sistema
2.1.7 - Instalando o daemontools
Acesse o diretório onde o daemontools foi descompactado:

# cd /package/admin/daemontools-0.76/src

Então execute:

# cd src
# patch < /usr/local/src/netqmail-1.06/other-patches/daemontools-0.76.errno.patch
# cd ..
# package/install

Pronto, o daemontools já está instalado em seu sistema. Se você olhar em seu inittab, foi 
adicionada uma linha para o comando svscan. Geralmente após a instalação este comando já é 
carregado na memória, para verificar execute:

# ps aux | grep svscan

Caso o programa não esteja na memória, reinicie seu computador.

2.1.8 - Iniciando o qmail
O diretório /var/qmail/boot contém um exemplo de scripts de boot do qmail para diferentes
configurações. Vamos usar o estilo Maildir.

Crie um arquivo /var/qmail/control/defaultdelivery e adicione em seu conteúdo:

./Maildir/

Crie agora o arquivo /var/qmail/rc e adicione em seu conteúdo:

#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start "`cat /var/qmail/control/defaultdelivery`"

Então execute:

# chmod 755 /var/qmail/rc
# mkdir /var/log/qmail
2.1.9 - Arquivos de inicialização

2.1.9.1 - O script qmailctl
Este script é usado para iniciar automaticamente o qmail durante o boot e também para auxiliar o
administrador em algumas tarefas do dia a dia, como consultar a fila de emails entre outras.
Crie o arquivo /var/qmail/bin/qmailctl com o seguinte conteúdo:

#!/bin/sh

# description: the qmail MTA

PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`

case "$1" in
  start)
    echo "Starting qmail"
    if svok /service/qmail-send ; then
      svc -u /service/qmail-send /service/qmail-send/log
    else
      echo "qmail-send supervise not running"
    fi
    if svok /service/qmail-smtpd ; then
      svc -u /service/qmail-smtpd /service/qmail-smtpd/log
    else
      echo "qmail-smtpd supervise not running"
    fi
    if [ -d /var/lock/subsys ]; then
      touch /var/lock/subsys/qmail
    fi
    ;;
  stop)
    echo "Stopping qmail..."
    echo "  qmail-smtpd"
    svc -d /service/qmail-smtpd /service/qmail-smtpd/log
    echo "  qmail-send"
    svc -d /service/qmail-send /service/qmail-send/log
    if [ -f /var/lock/subsys/qmail ]; then
      rm /var/lock/subsys/qmail
    fi
    ;;
  stat)
    svstat /service/qmail-send
    svstat /service/qmail-send/log
    svstat /service/qmail-smtpd
    svstat /service/qmail-smtpd/log
    qmail-qstat
    ;;
  doqueue|alrm|flush)
    echo "Flushing timeout table and sending ALRM signal to qmail-send."
    /var/qmail/bin/qmail-tcpok
    svc -a /service/qmail-send
    ;;
  queue)
    qmail-qstat
    qmail-qread
    ;;
  reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /service/qmail-send
    ;;
  pause)
    echo "Pausing qmail-send"
    svc -p /service/qmail-send
    echo "Pausing qmail-smtpd"
    svc -p /service/qmail-smtpd
    ;;
  cont)
    echo "Continuing qmail-send"
    svc -c /service/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /service/qmail-smtpd
    ;;
  restart)
    echo "Restarting qmail:"
    echo "* Stopping qmail-smtpd."
    svc -d /service/qmail-smtpd /service/qmail-smtpd/log
    echo "* Sending qmail-send SIGTERM and restarting."
    svc -t /service/qmail-send /service/qmail-send/log
    echo "* Restarting qmail-smtpd."
    svc -u /service/qmail-smtpd /service/qmail-smtpd/log
    ;;
  cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp.cdb
    echo "Reloaded /etc/tcp.smtp."
    ;;
  help)
    cat <<HELP
    stop -- stops mail service (smtp connections refused, nothing goes out)
    start -- starts mail service (smtp connection accepted, mail can go out)
    pause -- temporarily stops mail service (connections accepted, nothing leaves)
    cont -- continues paused mail service
    stat -- displays status of mail service
    cdb -- rebuild the tcpserver cdb file for smtp
    restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
    doqueue -- schedules queued messages for immediate delivery
    reload -- sends qmail-send HUP, rereading locals and virtualdomains
    queue -- shows status of queue
    alrm -- same as doqueue
    flush -- same as doqueue
    hup -- same as reload
HELP
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
    exit 1
    ;;
esac

exit 0

Você pode fazer download deste arquivo em: http://lifewithqmail.org/qmailctl-script-dt70.
Torne este aquivo executável e crie um link simbólico para ele em um diretório 
do seu path:

# chmod 755 /var/qmail/bin/qmailctl
# ln -s /var/qmail/bin/qmailctl /usr/bin
2.1.9.2 - O script supervise
Agora crie os diretórios supervise para os serviços do qmail:

# mkdir -p /var/qmail/supervise/qmail-send/log
# mkdir -p /var/qmail/supervise/qmail-smtpd/log

Crie o arquivo /var/qmail/supervise/qmail-send/run com o conteúdo:

#!/bin/sh
exec /var/qmail/rc

Crie o arquivo /var/qmail/supervise/qmail-send/log/run com o conteúdo:

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

Crie o arquivo /var/qmail/supervise/qmail-smtpd/run com o conteúdo:

#!/bin/sh

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
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 2000000 \
     /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
     -u "$QMAILDUID" -g "$NOFILESGID" 127.0.0.1 10026 /var/qmail/bin/qmail-smtpd 2>&1

Crie o arquivo concurrencyincoming

# echo 20 > /var/qmail/control/concurrencyincoming
# chmod 644 /var/qmail/control/concurrencyincoming

Crie o arquivo /var/qmail/supervise/qmail-smtpd/log/run com o conteúdo:

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd

Torne os arquivos executáveis:

# chmod 755 /var/qmail/supervise/qmail-send/run
# chmod 755 /var/qmail/supervise/qmail-send/log/run
# chmod 755 /var/qmail/supervise/qmail-smtpd/run
# chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

Então, configure os diretórios de log:

# mkdir -p /var/log/qmail/smtpd
# chown qmaill /var/log/qmail /var/log/qmail/smtpd

Crie o arquivo /etc/tcp.smtp e compile-o:

# echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp
# qmailctl cdb

2.1.10 - Aliases padrões do qmail
Os aliases padrões do qmail são criados no diretório /var/qmail/alias. Estes arquivos devem 
começar com .qmail- seguido do nome do alias que desejamos criar, por exemplo: qmail-rodrigo.
Vamos criar os aliases padrões de um sistema de email e direcionálos para suporte@rcbrasil.com.br.

# echo suporte@rcbrasil.com.br > /var/qmail/alias/.qmail-root
# echo suporte@rcbrasil.com.br > /var/qmail/alias/.qmail-postmaster
# ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon
# ln -s .qmail-postmaster /var/qmail/alias/.qmail-abuse
# chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster

2.1.11 - Finalizando a parte do qmail
Neste ponto, o qmail já está instalado em seu sistema e deve estar rodando. Segue uma lista
de comandos úteis:

# qmailctl stop - Para o qmail
# qmailctl start - Inicia o qmail
# qmailctl stat - Verifica se os processos estão rodando
# qmailctl queue - Verifica a fila de correio.

Você pode também testar a sua instalação executando o script inst_check, que pode ser baixado
pelo link http://lifewithqmail.org/inst_check.

# sh inst_check

Se sua instalação estiver correta, você receberá a seguinte mensagem:

Congratulations, your LWQ installation looks good!

Caso contrário ele te mostrará o erro com uma sugestão para corrigí-lo:

# sh inst_check
! /var/log/qmail has wrong owner, should be qmaill
...try: chown qmaill /var/log/qmail

2.1.12 - Corrigindo a injeção de emails no qmail
Quando utilizado com postfix, o qmail apresente um problema no seu módulo qmail-injection. 
Este deve ser substituido pelo mes822 que deve ser baixado em http://pobox.com/~djb/mess822.html.
Após baixar, execute os comandos para instalação:

# cd /usr/local/src
# tar zxf mess822-0.58.tar.gz
# cd mess822-0.58
# make
# make setup check

Agora vamos alterar o qmail-inject padrão do qmail

# cd /var/qmail/bin
# mv qmail-inject qmail-inject.old
# ln -s /usr/local/bin/new-inject qmail-inject

Pronto, agora você está livre dos bugs do qmail-inject

2.2 - Postfix
Para muitos, pode parecer redundante instalar dois servidores de email em uma mesma máquina,
mas para mim foi a solução de muitos problemas. Já tive várias experiências negativas com 
qmail relacionado a bloqueios de spam, mas eu adorava a sua funcionalidade de virtualização
oferecida pelo vpopmail. Como já tinha ótimas experiências de trabalho com o postfix, resolvi
criar uma solução que unisse as duas aplicações. Descrevo como instalar o postifix no artigo
Instalando o Postfix no Slackware 12.0, por este motivo não irei descreve-lo aqui novamente.
2.3 - Clamav, SpamAssassin, Amavis
Considero o clamav o melhor antivirus opensource atualmente, se não for o melhor antivirus de 
todos incluindo os pagos. Sua base é atualizada com regularidade e correções para bugs no
software também são sempre realizadas. Descrevo a instalação do clamav no artigo 
Instalando o Clamav+SpamAssassin+Amavis no Slackware 12.0.
2.4 - Vpopmail e módulos
O vpopmail e seus módulos são um conjunto de software que facilitam o gerenciamento das contas
de email dos domínios hospedados no servidor. Utilizaremos aqui os seguintes programas:
* autorespond-2.0.4
* qmailadmin-1.2.9
* vpopmail-5.4.17
* vqadmin-2.3.7
Todos estes programas devem ser baixados no site http://www.inter7.com/

2.4.1 - Instalando o autorespond
Execute:

# cd /usr/local/src/
# tar zxf autorespond-2.0.4.tar.gz
# cd autorespond-2.0.4
# make
# make install

2.4.2 - Instalando o vopomail
Execute:

# groupadd -g 89 vchkpw
# useradd -g vchkpw -u 89 -d /var/vpopmail -s /bin/bash vpopmail
# cd /usr/local/src
# tar zxf vpopmail-5.4.17.tar.gz
# cd vpopmail-5.4.17
# ./configure --prefix=/var/vpopmail --enable-auth-module=mysql --disable-passwd --enable-valias
--enable-sql-logging --enable-auth-logging --enable-logging=v --enable-mysql-limits
# make
# make install-strip

Crie um banco de dados e usuário no mysql chamado vpopmail, e dê permissão neste banco
para este usuário:

# mysql -u root -p mysql
> create database vpopmail;
> grant all on vopopmail.* to vpopmail@localhost identified by 'vpopmail';
> flush privileges;

Configure o acesso ao banco de dados no arquivo /var/vpopmail/etc/vpopmail.mysql,
incluindo:

localhost|0|vpopmail|vpopmail|vpopmail

Inclua o domínio padrão do seu servidor no arquivo 
/var/vpopmail/etc/defaultdomain, por exemplo: rcbrasil.com.br

Configure os limits padrões dos domínios no arquivo /var/vpopmail/etc/vlimits.default.

2.4.3 - Instalando o vqadmin
O vqadmin é um software que permite a criação de domínios e manutenção nas contas de email
do servidor para o administrador do servidor, este software é diferente do qmailadmin que 
pode ser passado para que o próprio usuário final gerencie sua conta.
Para instalar o vqadmin, execute:

# cd /usr/local/src
# tar zxf vqadmin-2.3.7.tar.gz
# cd vqadmin-2.3.7
# cd html
# cp br en (truque para tradução para o português brasileiro)
# cd ..
# ./configure --enable-cgibindir=/var/www/cgi-bin
# make
# make install

Precisamos agora configurar o acesso ao vqadmin, abra o arquivo /var/www/cgi-bin/vqadmin/.htaccess
e deixe ele como descrito abaixo:

AuthType Basic
AuthName vQadmin
AuthBasicProvider file
AuthUserFile /etc/httpd/vqadmin.passwd
require valid-user

Agora vamos criar o arquivo de senhas, execute:

cd /etc/httpd
htpasswd -c vqadmin.passwd admin

Informe a senha para o usuário admin e o arquivo estará criado. 
Pronto, o vqadmin está instalado, para acessa-lo utilize o navegador acessando 
o endereço: http://www.seudominio.com.br/cgi-bin/vqadmin/

2.4.4 - Instalando o qmailadmin
Este é o grande truque desta solução. O qmailadmin permite que você passe a administração do 
domínio para a empresa que contratar os seus serviços de hospedagens, e o próprio usuário 
pode administrar a sua conta de email nesta interface, trocando a senha, definindo mensagens 
de férias, entre outras. Para instalar o qmailadmin execute:

# cd /usr/local/src
# tar zxf qmailadmin-1.2.9
# cd qmailadmin-1.2.9
# ./configure --enable-htmldir=/var/www/htdocs --enable-cgibindir=/var/www/cgi-bin 
--enable-ezmlmdir=n --enable-modify-quota --disable-ezmlm-mysql
# make
# make install-strip

Pronto, o qmailadmin está instalado, para acessá-lo entre no endereço: 
http://www.seudominio.com.br/cgi-bin/qmailadmin

2.5 - Instalando o courier
O courier-mta fornecerá para nós nesta solução dois programas: courier-authlib e courier-imap.
O courier-authlib é a base de autenticação para os usuários que estiverem acessando seus 
emails atráves do imap ou pop3 que será provido pelo courier-imap.
Para instalar o courier-authlib execute:

# cd /usr/local/src
# tar zxf courier-authlib-0.59.1
# cd courier-authlib-0.59.1
# ./configure --without-authuserdb --without-authpam --without-authldap --without-authpwd 
--without-authshadow --with-authvchkpw --without-authpgsql --with-authmysql --without-authcustom
--without-authpipe
# make
# make install
# make install-migrate
# make install-configure

execute o comando /usr/local/libexec/courier-authlib/authdaemond > /dev/null 2>&1 > /dev/null &
para carregá-lo na memória, e depois inclua esta linha no arquivo rc.local do seu servidor.

Como mencionado acima, o courier-imap irá prover acesso pop3 e imap aos emails. Para instalar
o courier-imap execute:

# cd /usr/local/src
# tar zxf courier-imap-4.1.2
# cd courier-imap-4.1.2
# ./configure --prefix=/usr/lib/courier-imap --disable-root-check --disable-change-pass 
--without-authpam --without-authldap --without-authpwd --without-authmysql --without-authpgsql
--without-authshadow --without-authuserdb --without-authcram --without-authdaemon 
--with-trashquota --with-authvchkpw
# make
# make install
# make install-configure

Os arquivos de configuração do courier-imap foram instalados em /usr/lib/courier-imap/etc. 
Entre neste diretório

# cd /usr/lib/courier-imap/etc

Execute os comandos para definir os novos arquivos de configuração baseados nos arquivos
padrões:

# cp imapd.dist imapd
# cp imapd-ssl.dist imapd-ssl
# cp pop3d.dist pop3d
# cp pop3d-ssl.dist pop3d-ssl

Abra o arquivo imapd e altere:

IMAPDSTART=YES

Abra o arquivo pop3d e altere:

POP3DSTART=YES

Incie agora os serviços de pop3 e imap executando:

# /usr/lib/courier-imap/libexec/pop3d.rc start
# /usr/lib/courier-imap/libexec/imapd.rc start

Adicione estas linhas no rc.local do seu servidor.

2.6 - Recompilando o cyrus-sasl
O cyrus-sasl já vem no slackware 12.0, mas para que o conjunto SMTP+AUTH funcione com a base
de autenticação no vpopmail precisamos recompilá-lo para adicionar este suporte. Se você não
precisa deste recurso pode parar por aqui, mas nos dias de hoje a mobilidade nos obriga a
suportar esta funcionalidade em nossos servidores.
Utilizarmos o mesmo software que é distribuido no CD do slackware, encontre em seus CDs, ou 
em algum mirror de slackware o pacote fonte deste programa.
Execute os seguites comandos para instalar:

# removepkg cyrus-sasl
# cd /usr/local/src
# tar zxf cyrus-sasl-2.1.22.tar.gz
# cd cyrus-sasl-2.1.22/
# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-static 
--enable-login --disable-anon --without-ldap --with-saslauthd --with-gdbm --with-dblib=gdbm 
--with-authdaemond
# make
# make install

Para configurar o suporte no postfix entre no diretório /usr/lib/sasl2/ e crie um arquivo com nome
smtpd.conf e o seguinte conteúdo:

pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/usr/local/var/spool/authdaemon/socket

3 - Finalizando

3.1 - Conectando o postfix ao qmail

Adicione as linhas a seguir no arquivo master.cf do postfix:

vdelivermail unix - n n - - pipe
 flags=R user=qmailq argv=/var/qmail/bin/sendmail ${recipient}

3.2 - Reiniciando

Reinicie o seu servidor para que ter certeza de que todos os programas estão sendo iniciados
durante o processo de boot. Finalizamos, sua solução de emails virtuais está completa.