Visite também: BR-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]

Tutoriais/sendmail-qmail-postfix/qmail-howto

De UnderLinux Wiki

Imagem:qmail.png

Qmail How-to



Tabela de conteúdo

Introdução

Qmail é um servidor de e-mail (MTA - Mail Transfer Agent) muito conhecido pela sua segurança e velocidade em máquinas *UNIX, até a presente data nunca foi encontrado um BUG de segurança no Qmail. Para se ter uma idéia o seu autor (Dan Bernstein) oferece $500 para quem conseguir encontrar uma brecha de segurança no Qmail que possa comprometer o S.O. (quer tentar? :)).

Essa segurança é possível porque ao contrário de outros MTA's (Sendmail, Smail, Exim, etc..) o Qmail não roda os seus processos com privilégios de "root" (somente dois processos tem privilégios de "root" - qmail-start e qmail-rspawn) e sim utiliza usuários especiais (qmaill, qmaild, qmails, etc) que não tem direitos/permissões decomprometer o sistema caso ocorra alguma falha no sistema.

O Qmail também é extremamente rápido, pois pode gerenciar milhões de e-mail's em um sistema moderado. Tem extrema facilidade para gerenciar domínios virtuais. Existe uma ferramenta que torna isso mais fácil ainda, é o Vpopmail.

O Qmail é um MTA totalmente modular, o que facilita a sua utilização. O grande diferencial de se utilizar todos esses softwares comentados nesse how-to, é que todos são de livre distribuição, ou seja, você não precisa pagar nenhum centavo para utilizá-los em seu servidor *UNIX.


Pré-requisitos

Para poder instalar o Qmail no seu servidor você precisa:

  • Ter um S.O. *UNIX ou UNIX-like (Linux, FreeBSD, OpenBSD, etc), você encontra uma relação com todos os sistemas suportados no arquivo README do Qmail.
  • Ter um compilador C (já está incluído na maioria das distribuições).
  • Se você for utilizar SMTP (qmail-smtpd) e/ou POP3 (qmail-pop3d) vai precisar do ucspi-tcp e do checkpassword.


Instalação

Instalação de pré-requisitos

- ucspi-tcp: depois de fazer o download do pacote:

[root@localhost] tar xzvf ucspi-tcp-0.88.tar.gz
[root@localhost] cd ucspi-tcp-0.88
[root@localhost] make setup check

- checkpassword : depois de fazer o download do pacote:

[root@localhost] tar xzvf checkpassword-0.90.tar.gz
[root@localhost] cd checkpassword-0.90
[root@localhost] make && make setup check

Instalação do Qmail

Faça download do Qmail, depois:

[root@localhost] tar xzvf qmail-1.03.tar.gz
[root@localhost] cd qmail-1.03

Caso você queira trocar o diretório $HOME do Qmail deverá editar o arquivo "conf-qmail" e substituir a primeira linha (/var/qmail) pelo diretório que você deseja instalar.

Se quiser trocar os usuários e grupos faça o mesmo com os arquivos "conf-users" e "conf-groups".

Obs.: Nesse how-to nós vamos utilizar os valores padrão para não confundir a cabeça de ninguém.

Obs.: Recomendo a leitura dos arquivos INSTALL.

Crie o diretório $HOME do Qmail:

[root@localhost] mkdir /var/qmail

Agora vamos criar os usuários e grupos para fazer a instalação do Qmail:

[root@localhost] groupadd nofiles
[root@localhost] useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
[root@localhost] useradd -g nofiles -d /var/qmail -s /bin/false qmaild
[root@localhost] useradd -g nofiles -d /var/qmail -s /bin/false qmaill
[root@localhost] useradd -g nofiles -d /var/qmail -s /bin/false qmailp
[root@localhost] groupadd qmail
[root@localhost] useradd -g qmail -d /var/qmail -s /bin/false qmailq
[root@localhost] useradd -g qmail -d /var/qmail -s /bin/false qmailr
[root@localhost] useradd -g qmail -d /var/qmail -s /bin/false qmails

Com os usuários criados já podemos compilar o Qmail:

[root@localhost] make setup check

Terminada a compilação:

[root@localhost] ./config-fast host.domain.com
Your fully qualified host name is host.domain.com
Putting host.domain.com into control/me...
Putting domain.com into control/defaultdomain...
Putting com into control/plusdomain...
Putting host.domain.com into control/locals...
Putting host.domain.com into control/rcpthosts...
Now qmail will refuse to accept SMTP messages except to host.domain.com.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!

- Substitua "host.domain.com" pelo nome completo da sua máquina.

Obs.: Para facilitar, a partir de agora, "host.domain.com" é o nome completo da sua máquina e "domain.com" é o seu domínio padrão.

O último comando (./config-fast) criou a estrutura de controle do Qmail (/var/qmail/control) que contem os seguintes arquivos:

Arquivo 		Conteúdo 		        Significado
defaultdomain 		domain.com 		        Seu domínio padrão
locals 		        host.domain.com 		Máquinas locais
me 		        host.domain.com 		A própria máquina
plusdomain 		com 		                Extensão do domínio (DPN)
rcpthosts 		host.domain.com 		Máquinas com relay permitido

Agora crie os aliases:

[root@localhost] cd ~alias
[root@localhost] echo "&seuemail@domain.com" > .qmail-postmaster
[root@localhost] echo "&emaildoroot@domain.com" > .qmail-root
[root@localhost] chmod 644 .qmail*

Substitua "seuemail@domain.com" pelo seu e-mail e "emaildoroot@domain.com" pelo e-mail da pessoa que se refere ao "root" desta máquina. Isso é necessário pois o Qmail não entrega e-mail para o "root" por motivos de segurança.

Para maiores informações sobre aliases consulte o arquivo INSTALL.alias.

Agora você precisa fazer uma escolha entre utilizar "Maildir" ou "Mailbox" (leia README.mbox e README.maildir), por motivos de maior compatilidade com as ferramentas para o Qmail nós vamos utilizar "Maildir", exemplo de ferramentas extremamente úteis para o Qmail que utilizam "Maildir":

- Vpopmail : Gerenciamento de domínios virtuais - Qmailadmin : Gerenciamento de domínios virtuais via WEB - Sqwebmail : Excelente Webmail

Criando o arquivo de inicialização do qmail com suporte a Maildir:

[root@localhost] cd /var/qmail
[root@localhost] sed 's/Mailbox/Maildir/g' boot/home > rc
[root@localhost] chmod 755 rc

Criando o arquivo de inicialização do qmail com suporte a Mailbox:

[root@localhost] cd /var/qmail
[root@localhost] cp -p boot/home rc

Obs.: Utilize apenas um dos dois.

- Sendmail

Caso você tenha o sendmail instalado:

[root@localhost] killall -TERM sendmail
[root@localhost] mv /usr/lib/sendmail /usr/lib/sendmail.old
[root@localhost] mv /usr/sbin/sendmail /usr/sbin/sendmail.old
[root@localhost] mv /usr/sbin/newaliases /usr/sbin/newaliases.old
[root@localhost] ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
[root@localhost] ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
[root@localhost] ln -s /var/qmail/bin/newaliases /usr/sbin/newaliases

Caso você não tenha o sendmail instalado:

[root@localhost] ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
[root@localhost] ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
[root@localhost] ln -s /var/qmail/bin/newaliases /usr/sbin/newaliases

Já podemos startar o Qmail:

[root@localhost] sh -cf '/var/qmail/rc&'
  • Veja sessão "Scripts".


Utilização

Existem várias formas de se utilizar o Qmail em uma máquina, eu vou listar e comentar aquí somente as mais utilizadas.

1- Utilizando o Qmail ao modo sendmail:

   Este modo permite enviar e-mail's para os usuários ao modo sendmail (utilizando mail, pine, etc) existem muitas formas de se enviar um e-mail de um *UNIX e principalmente com o Qmail. 

2- Utilizando o Qmail com um SMTP:

   Permite o mesmo que a anterior mais envio de mensagens por SMTP e recebimento de e-mail's externos (internet/intranet). 

3- Utilizando o Qmail com POP3:

   Permite o mesmo que a anterior mais checagem de e-mail's via POP3. 

Obs.: Não vamos configurar domínios virtuais, pois isso é assunto para outro how-to.

Para os nossos testes vamos utilizar um usuário chamado "homer" com a senha "teste1234".

[root@localhost] adduser homer
[root@localhost] passwd homer
Changing password for user homer
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

Criando Maildir para "homer".

Para que o usuário "homer" possa receber e-mail's precisamos criar o seu "Maildir" que fica dentro de seu $HOME (/home/homer):

[root@localhost] cd /home/homer
[root@localhost] /var/qmail/bin/maildirmake Maildir
[root@localhost] echo "./Maildir/" > .qmail
[root@localhost] chown homer: * -R

Como você percebeu terá que executar esse procedimento a cada usuário criado.

Para resolver esse incômodo siga as intruções:

[root@localhost] cd /etc/skel/
[root@localhost] /var/qmail/bin/maildirmake Maildir
[root@localhost] echo "./Maildir/" > .qmail

Agora todo usuário que for criado já terá o seu Maildir com as devidas permissões. :)


Utilizando o Qmail ao modo sendmail

Mandando e-mail para o usuário "homer" com o comando "mail":

[root@localhost] echo "Isso é um teste."|mail -s "Testando 1" homer

Olha o que ocorreu no LOG:

[root@localhost] tail /var/log/maillog
Jan 6 00:42:55 host qmail: 978748975.664907 new msg 325891
Jan 6 00:42:55 host qmail: 978748975.665310 info msg 325891: bytes 270 from qp 1771 uid 0
Jan 6 00:42:55 host qmail: 978748975.678995 starting delivery 1: msg 325891 to local homer@host.domain.com
Jan 6 00:42:55 host qmail: 978748975.679283 status: local 1/10 remote 0/20Jan 6 00:42:55 host qmail: 978748975.850977 delivery 1: success: did_1+0+0/

Conforme o LOG (/var/log/maillog) informou, o usuário "homer" acabou de receber um e-mail do usuário "root", esse e-mail pode ser conferido em "/home/homer/Maildir/new"

[root@localhost] cd /home/homer/Maildir/new
[root@localhost] more 978798513.1066.host.domain.com
Return-Path:
Delivered-To: homer@host.domain.com
Received: (qmail 1063 invoked by uid 0); 6 Jan 2001 16:28:33 -0000
Date: 6 Jan 2001 16:28:33 -0000
Message-ID: <20010106162833.1062.qmail@host.domain.com>
From: root@host.domain.com
To: homer@host.domain.com
Subject: Testando 1

Isso é um teste.

Você também pode utilizar o "qmail-inject" para enviar e-mail's:

[root@localhost] echo to:homer | /var/qmail/bin/qmail-inject

Isso provocará o mesmo efeito mas sem o campo "Subject", para maiores informações consulte os arquivos TEST.receive e TEST.deliver.


Utilizando um SMTP

Você também pode utilizar um SMTP (qmail-smtpd) para enviar e-mail's. Vamos utilizar agora a ferramenta "tcpserver" que está incluída no pacote "ucspi-tcp" (que já instalamos) para levantar o "qmail-smtpd":

[root@localhost] /usr/local/bin/tcpserver -u $(id -u qmaild) -g $(id -g qmaild) 0 25 /var/qmail/bin/qmail-smtpd 2>/dev/null&
  • Veja sessão "Scripts".

- Maiores informações sobre o tcpserver.

- Enviando e-mail por SMTP:

[root@localhost] telnet 0 25
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
220 host.domain.com ESMTP
helo
250 host.domain.com
mail from:
250 ok
rcpt to:
250 ok
data
354 go ahead
Subject: Testando 2
Isto é um teste de envio msg.
.
250 ok 978804630 qp 1185
quit
221 host.domain.com
Connection closed by foreign host.

E-mail enviado com sucesso, para verificar se o e-mail realmente chegou você pode dar uma olhada no LOG (/var/log/maillog) ou no diretório do usuário "homer" (/home/homer/Maildir/new). O LOG do Qmail fornece muitas informações interessantes.

Para enviar mensagens para outro domínio que não seja o seu você deverá adicioná-lo dentro do arquivo "/var/qmail/control/rcpthosts" ou então fazer controle por IP:

[root@localhost] cd /etc
[root@localhost] echo "127.0.0.1:allow,RELAYCLIENT=""" >> relay.smtp

Isso faz com que o IP 127.0.0.1 (local) possa enviar e-mail's para qualquer domínio.

[root@localhost] echo "192.168.1:allow,RELAYCLIENT=""" >> relay.smtp

Isso faz com que a rede 192.168.1.0 (interna) possa enviar e-mail's para qualquer domínio.

[root@localhost] echo ":allow" >> relay.smtp

Isso faz com que qualquer IP/Rede possa enviar email's para qualquer domínio (péssima idéia :( ).

Agora precisamos criar um banco de dados com a ferramenta "tcprules" que está inclusa no pacote "ucspi-tcp" para que o Qmail possa utilizar essas informações:

[root@localhost] /usr/local/bin/tcprules relay.smtp.cdb relay.smtp.tmp
< relay.smtp

Devemos agora parar o "qmail-smtpd" (se estiver rodando):

[root@localhost] kill -9 $(ps U qmaild|grep "tcpserver"|grep -v "grep"|awk '{print $1}')

Levantar o "qmail-smtpd" com a nova configuração:

[root@localhost] /usr/local/bin/tcpserver -x /etc/relay.smtp.cdb -u $(id -u qmaild) -g $(id -g qmaild) 0 25 /var/qmail/bin/qmail-smtpd 2>/dev/null&

Desta forma o Qmail simplesmente vai ignorar o conteúdo do arquivo "rcpthosts".

  • Veja sessão "Scripts".

Com essa configuração você já pode enviar e-mail's para qualquer domínio.


Utilizando o Qmail com POP3

Para utilizar o Qmail com POP3 nós vamos precisar:

- checkpassword : (que nós já instalamos), como o nome já diz ele serve para checar o nome do usuário e sua senha no arquivo "/etc/passwd". - ucspi-tcp : (já instalado) para levantar o serviço de POP3.

[root@localhost] /usr/local/bin/tcpserver 0 110 /var/qmail/bin/qmail-popup domain.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>/dev/null&
  • Veja sessão "Scripts".

Já podemos verificar os nossos e-mail's por POP3:

[root@localhost] telnet 0 110
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
+OK <1201.978805768@domain.com>
user homer
+OK
pass teste1234
+OK
stat
+OK 3 948
list
+OK
1 349
2 311
3 288
.
top 1 1
+OK
Return-Path:
Delivered-To: homer@host.domain.com
Received: (qmail 1063 invoked by uid 0); 6 Jan 2001 16:28:33 -0000
Date: 6 Jan 2001 16:28:33 -0000
Message-ID: <20010106162833.1062.qmail@host.domain.com>
From: root@host.domain.com
To: homer@host.domain.com
Subject: Testando 1

Isso é um teste.

.
dele 1
+OK
top 2 1
+OK
Return-Path:
Delivered-To: homer@host.domain.com
Received: (qmail 1076 invoked by uid 0); 6 Jan 2001 16:33:52 -0000
Date: 6 Jan 2001 16:33:52 -0000
Message-ID: <20010106163352.1075.qmail@host.domain.com>
From: root@host.domain.com
to: homer@host.domain.com

.
dele 2
+OK
top 3 1
+OK
Return-Path:
Delivered-To: homer@host.domain.com
Received: (qmail 1185 invoked from network); 6 Jan 2001 18:10:07 -0000
Received: from unknown (HELO ) (127.0.0.1)
by 127.0.0.1 with SMTP; 6 Jan 2001 18:10:07 -0000
Subject: Testando 2
Isto é um teste d envio msg.

.
dele 3
+OK
quit
+OK
Connection closed by foreign host.

Aquí você acompanhou uma sessão POP3 na linha de comando aonde:

- stat : lista o número de msg + tamanho total - list : lista as msg's + tamanho - top 1 1 : mostra a msg 1 com 1 linha depois do cabeçalho - dele 1 : deleta a msg número 1 - quit : finaliza a sessão

Enfim, mais um excelente servidor de e-mail funcionando.

Scripts

Esta sessão mostra alguns scripts shell com suporte a SYSV para controlar start/stop de:

  • qmail-start (qmail-send)
  • qmail-smtpd
  • qmail-pop3d

- Maiores informações sobre scripts SYSV.


qmail-send

#!/bin/bash
#
# chkconfig: 2345 85 40
# description: qmail-send is a MTA.
# description(pt_BR): qmail é um MTA (Mail Agent Transfer).
# processname: qmail-send
# pidfile: /var/run/qmail-send.pid
# config: /var/qmail/rc
# info: Developed by Rodrigo Telles 

# source function library
. /etc/rc.d/init.d/functions
PATH=/usr/bin:/bin:/usr/local/bin:/var/qmail/bin

name=qmail-send
chk=$(ps axf|grep "qmail-rspawn"|grep -v "grep"|awk '{print $1}')
alrm=$(ps axf|grep "${name}"|grep -v "grep"|awk '{print $1}')
qmail=/var/qmail/rc
pid=/var/run/$name.pid

case "$1" in
  start)
    if [ -z "$chk" ] ; then
        if [ -f "$pid" ] ; then
            printf "$name dead, but pid file exists (pid `cat $pid`).n"
        fi
        if [ -f "$qmail" ]; then
        gprintf "Starting %s services: " "$name"
            sh -cf $qmail &
            sleep 1
            ps axf|grep "qmail-rspawn"|grep -v "grep" 
            |awk '{print $1}' > $pid
            touch /var/lock/subsys/$name
            echo
        else
            printf "File $qmail not found.n"
            exit 1
        fi
    else
        gprintf "$name (pid "$chk") alread running...n"
    fi
    ;;
  stop)
    if [ -z "$chk" ] ; then
        printf "$name not running.n"
        exit 1
    else
        gprintf "Stopping %s services: " "$name"
        kill -9 $chk
        rm -f /var/lock/subsys/$name
        rm -f $pid
        echo
    fi
    ;;
  restart|reload)
    $0 stop
    $0 start
    ;;
  status)
    status $name
    ;;
  alarm)
    if [ "$chk" ] ; then
        gprintf "Sending ALARM signal for %s: " "$name"
        kill -ALRM $alrm
        echo
    else
        printf "$name not running.n"
        exit 1
    fi
    ;;
  *)
    gprintf "Usage: %s {start|stop|status|restart|alarm}n" "$name"
    exit 1
esac

exit 0


qmail-smtpd

#!/bin/bash
#
# chkconfig: 2345 86 41
# description: qmail-smtpd is a SMTP Daemon.
# description(pt_BR): qmail-smtpd é um SMTP Server.
# processname: qmail-smtpd
# pidfile: /var/run/qmail-smtpd.pid
# config: /var/qmail/controls/*
# info: Developed by Rodrigo Telles 

# source function library
. /etc/rc.d/init.d/functions
PATH=/usr/bin:/bin:/usr/local/bin:/var/qmail/bin

name=qmail-smtpd
QUSER=$(id -u qmaild)
QGROUP=$(id -g qmaild)
pid=/var/run/$name.pid
chk=$(ps U $QUSER|grep "tcpserver"|grep -v "grep"|grep -v "_"|awk '{print $1}')
[ -f "/etc/relay.smtp.cdb" ] && RELAY="-x /etc/relay.smtp.cdb"

case "$1" in
  start)
    if [ -z "$chk" ] ; then
        if [ -f "$pid" ] ; then
            printf "$name dead, but pid file exists (pid `cat $pid`).n"
        fi
        gprintf "Starting %s services: " "$name"
        tcpserver $RELAY -u $QUSER -g $QGROUP -c 500 0 smtp $name 2>/dev/null &
        sleep 1
        ps U $QUSER|grep "0 smtp"|grep -v "_"|awk '{print $1}' >$pid
        touch /var/lock/subsys/$name
        echo
    else
        printf "$name (pid "$chk") alread running...n"
        exit 1
    fi
    ;;
  stop)
    if [ -z "$chk" ] ; then
        printf "$name not running.n"
        exit 1
    else
        gprintf "Stopping %s services: " "$name"
        kill -9 $chk
        rm -f /var/lock/subsys/$name
        rm -f $pid
        echo
    fi
    ;;
  restart|reload)
    $0 stop
    $0 start
    ;;
  status
    if [ -z "$chk" ] ; then
        if [ -f "$pid" ] ; then
            printf "$name dead, but pid file exists (pid `cat $pid`).n"
        else
            printf "$name not running.n"
            exit 1
        fi
    else
        printf "$name (pid $chk) is runnig...n"
        exit 1
    fi
    ;;
  *)
    gprintf "Usage: %s {start|stop|status|restart}n" "$name"
    exit 1
esac

exit 0


qmail-pop3d

#!/bin/bash
#
# chkconfig: 2345 87 42
# description: qmail-pop3d is a POP3 Daemon.
# description(pt_BR): qmail-pop3d é um POP3 Server.
# processname: qmail-pop3d
# pidfile: /var/run/qmail-pop3d.pid
# info: Developed by Rodrigo Telles 

# source function library
. /etc/rc.d/init.d/functions
PATH=/usr/bin:/bin:/usr/local/bin:/var/qmail/bin

name=qmail-pop3d
chkpwd=checkpassword
pid=/var/run/$name.pid
chk=$(ps -Afw|grep "0 110"|grep -v "grep"|awk '{print $2}')
if [ -f "/etc/resolv.conf" ] ; then
    domain=$(grep "search" /etc/resolv.conf|awk '{print $2}')
else
    printf "File /etc/resolv.conf not found, aborting...n"
    exit 1
fi


case "$1" in
  start)
    if [ -z "$chk" ] ; then
        if [ -f "$pid" ] ; then
            printf "$name dead, but pid file exists (pid `cat $pid`).n"
        fi
        if [ -z "$domain" ] ; then
            printf "Unresolved domain, aborting...n"
            exit 1
        fi
        gprintf "Starting %s services: " "$name"
        tcpserver -c 500 -H -R 0 110 qmail-popup $domain 
        $chkpwd $name Maildir 2>/dev/null &
        sleep 1
        ps -Afw|grep "0 110"|grep -v "grep"|awk '{print $2}' >$pid
        touch /var/lock/subsys/$name
        echo
    else
        printf "$name (pid "$chk") alread running...n"
        exit 1
    fi
    ;;
  stop)
    if [ -z "$chk" ] ; then
        printf "$name not running.n"
        exit 1
    else
        gprintf "Stopping %s services: " "$name"
        kill -9 $chk
        rm -f /var/lock/subsys/$name
        rm -f $pid
        echo
    fi
    ;;
  restart|reload)
    $0 stop
    $0 start
    ;;
  status)
    if [ -z "$chk" ] ; then
        if [ -f "$pid" ] ; then
            printf "$name dead, but pid file exists (pid `cat $pid`).n"
        else
            printf "$name not running.n"
            exit 1
        fi
    else
        printf "$name (pid $chk) is runnig...n"
        exit 1
    fi
    ;;
  *)
    gprintf "Usage: %s {start|stop|status|restart}n" "$name"
    exit 1
esac

exit 0

Epílogo

Você também pode utilizar o Qmail no "inetd", para maiores informações consulte o arquivo INSTALL.

Esse não seria um how-to se eu não coloca-se esse link para consulta:

Life with qmail com certeza vale uma visita.

Espero que esse how-to seja de grande utilidade para todos. O how-to acaba aquí, espero que você tenha tido sucesso na sua instalação também, caso você tenha tido problemas seguindo esse how-to fique a vontade para entrar em contato comigo - Rodrigo Telles.

Créditos

Tutorial no underlinux: http://www.underlinux.com.br/content/view/4552/70/

Este tutorial foi desenvolvido por Rodrigo Telles e editado no wiki por Duca.


Imagem:Avatar olhos spawn 2.jpg --Duca 14:54, 12 Janeiro 2006 (BRDT)