A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Linux

Debian + Postfix + PostfixAdmin + SquirrelMail

Sab

16

Mai

2009


01:19

(19 votos, média 4.53 de 5) 


Depois de mais de 2 anos no ar, meu servidor de e-mail estava precisando urgentemente de um upgrade. Resolvi aproveitar a ocasião para dar uma olhada na distro Debian e tive uma grata surpresa. Primeiro, por que a instalação básica do Debian é enxutíssima (mais enxuta do que a do Slackware, com o qual estava acostumada); segundo, por que o gerenciamento de pacotes no Debian é incrivelmente fácil e de alta produtividade e, finalmente, por que os tutoriais e how-tos para o Debian existem em profusão.

Antes de me decidir definitivamente por uma distro diferente da que já conhecia, comecei a procurar um how-to para instalar um servidor de e-mail com o MTA Postfix, com domínios virtuais, e com o amavis para agregar o ClamAV e o spamassassin. Foi assim que encontrei o how-to do Gary V, completíssimo e impecável. Além do que estava procurando, encontrei muito mais! PostfixAdmin, Squirrelmain, SASL, quotas para as caixas postais, phpMyAdmin, backup automático do banco de dados MySQL, gráficos para o controle da atividade do servidor de email e até um servidor de nomes (DNS). Li o how-to e gostei. Resolvi encarar e, após algumas horas de trabalho (umas 12, para ser sincera), estava com um servidor de e-mail zero-bala e extremamente seguro.

Sistema

Antes de mais nada, quero agradecer o autor. Como ele disponibilizou um tutorial imenso sem pedir nada em troca, a minha contribuição será a de traduzir seu tutorial. Para variar, vou me permitir fazer alguns comentários adicionais e até suprimir algumas partes, ou seja, usando o modelo oferecido pelo Gary vou contar minha experiência de sucesso que, diga-se de passagem, é devida exclusivamente ao autor. Eu só segui a "receita do bolo" smile

Para começar

Toda esta instalação está baseada na versão mais recente (até esta data) do Debian - o Debian Lenny. Não vou entrar em maiores detalhes de como instalar o sistema operacional.

Antes de partir para a instalação propriamente dita, vamos preparar o ambiente de trabalho. Faça login como root e instale o seguinte:

apt-get install rdate ssh vim

Pode ser que o sistema peça para inserir o CD de instalação. Se for este o caso, faça-o. Despois de instalado o software, retire-o novamente.

O motivo para instalar o SSH logo de cara é que a instalação e a configuração deste sistema de e-mail não será feita diretamente no servidor, mas numa máquina remota com o sistema operacional Windows que tem o PuTTY e o WinSCP instalados. A partir deste ponto, todas as operações serão realizadas nesta máquina remota.

Abra o PuTTY, entre o IP do servidor no campo Host Name (or IP address), escolha a Connection Type SSH e dê um nome para esta sessão em Saved Sessions. A seguir, no menu de configuração que fica do lado esquerdo da janela, escolha Terminal / Features e marque a opção Disable application keypad mode. Depois escolha o item de menu Window e passe Lines of scrollback de 200 para 800. Com tudo configurado, escolha o item de menu Session e clique no botão [Save]

info Algumas dicas:

  • A configuração Disable application keypad mode foi feita para que, quando usarmos o editor vi, ele aceite o teclado numérico como números (e não PgUp, PgDn, etc). Podes crer, vai fazer muita diferença smile
  • Para acessar o servidor, basta dar um duplo clique na sessão que você acabou de salvar.
  • Para sair do PuTTY, certifique-se de que você está no prompt de comando e digite logout, exit ou Ctrl+D.
  • Para otimizar ao máximo o seu trabalho de configuração e, principalmente, para evitar erros de digitação, copie os comandos indicados neste artigo e cole-os no PuTTY com um clique no botão direito do mouse.
  • Os comandos serão sempre apresentados dentro de caixas. Uma série de comandos pode ser copiada integralmente e colada no PuTTY, ou seja, não é preciso copiar e colar cada um deles individualmente.
  • Texto marcado em negrito precisa ser substituído por valores referentes ao seu ambiente servidor (por exemplo, endereços IP e nomes de domínios).
  • Se, por acaso, a última linha copiada tiver um espaço no fim, basta eliminá-lo e dar [Enter].

Tudo preparado? Então vamos começar com o tutorial mais longo que você já viu. Muita atenção, por que é coisa pra caramba. Basta um descuido e um erro começa a atrapalhar a vida da gente. Para evitar um monte de trabalho procurando onde eventualmente ocorreu um erro, alguns testes são sugeridos. Não tenha preguiça, faça-os e só continue com a instalação se estiver tudo OK.

Acesse o servidor pelo PuTTY como root e mãos à obra.

Acertando a data e a hora do servidor

/etc/init.d/hwclock.sh reload

Se o processo pendurar e ocorrer um erro de tempo esgotado (time out), é possível que esteja havendo uma incompatibilidade entre a BIOS e o sofware hwclock. Este erro é mais comum em algumas máquinas Dell. Se, e apenas se você encontrar este problema, execute o passo a seguir:

sed -i 's/HWCLOCKPARS=/HWCLOCKPARS="--directisa"/' /etc/init.d/hwclock.sh

Continue com:

rdate -ncv clock.fmt.he.net
rdate -ncv ntp1.tummy.com
/etc/init.d/hwclock.sh reload

Configurando locales

dpkg-reconfigure locales

Use [PgUp] [PgDn] [seta-subir] [seta-descer] [tab] e [barra de espaço] para navegar e selecionar.

O instalador do lenny instalou pt_BR.UTF-8 UTF-8 no meu sistema. Sugiro que você instale o locale pt_BR ISO-8859-1. Se você precisar alterar o locale ou adicionar outros locales, use as teclas das [setas], [barra de esapço] e [tab]. Um locale UTF-8 não deve ser usado como a linguagem LANG default do sistema (estabelecido em /etc/environment ou /etc/default/locale), por que o SpamAssassin e o amavisd-new podem ter problemas. No entanto, você deve manter o locale UTF-8 selecionado, junto com a opção ISO-8859-x por que senão o Perl pode reclamar.

Resumindo, selecione os locales pt_BR.UTF8 UTF8 e pt_BR ISO-8859-1 e escolha o ISO-8859-1 como default. ATENÇÃO: NÃO escolha [None] como default para o sistema.

Corrigindo o sistema (opcional)

Há uma correção para o tcp_window_scaling do Linux kernel 2.6.17 (e mais novos). Se você quiser levar em consideração o que pode acontecer (falha na transferência entre sistemas de arquivos grandes) se houver um roteador com bug entre você e outros pontos, você pode fazer a seguinte alteração no sistema (você decide):

echo "net.ipv4.tcp_wmem = 4096 65536 65536" >>/etc/sysctl.conf
echo "net.ipv4.tcp_rmem = 4096 65536 65536" >>/etc/sysctl.conf
sysctl -p

Imagino que, sob certas circunstâncias, isto pode tornar a comunicação entre sistemas mais lenta.

O editor de sistema vim

O editor de sistema padrão do Debian é o nano. Vamos trocá-lo pelo vim, mas, antes de fazer isto, uma aulinha rápida de como pilotar este editor.

O vim é cheio de nove horas e tem mais gente que não gosta do que gente que gosta dele. Por que então usar este editor como padrão? É que, além de rápido e confiável, só vamos precisar de três ou quatro comandos. Antes de falar dos comandos, é preciso saber que o vim tem três modos de operação: o modo Comando, o modo Escrita e o modo Linha de Comando.

Quando abrimos o vim ele se apresenta no modo Comando. Podemos mudar para o modo Escrita teclando i (de inserir). No modo Escrita é possível editar o texto da forma habitual, com algumas pequenas diferenças que você vai perceber assim que começar a usar este editor. Para voltar para o modo Comando, tecle [ESC].

Existem muitos comandos para o modo Comando, mas vamos aprender apenas mais três além do i. Estes comandos são : (dois pontos), / (barra) e G. O G é uma mão na roda por que nos leva diretamente ao fim do texto - o que é muito prático quando o texto for grande. O comando : serve para colocar o editor no modo Linha de Comando, que você identifica porque aparecem dois pontos : no rodapé da janela. Vamos usar o modo Linha de Comando para algumas operações:

:q para sair (quit). Se o texto tiver sido alterado, o vim reclama e pede para salvar as alterações.

:q! para sair sem reclamar. Mesmo se o texto tiver sido alterado, o editor é fechado. É muito bom quando queremos desistir das alterações feitas.

:wq para salvar (write) e sair.

:w para salvar e continuar a edição.

Só mais uma coisa. O comando / serve para procurar coisas no texto. Assim, se digitarmos /acha_texto, o editor coloca o cursor na primeira ocorrência de "acha_texto".

Isto é tudo do que vamos precisar. O erro mais frequente feito por iniciantes é esquecer de teclar i antes de começar a inserir ou alterar o texto. Sugiro que você entre no vim e dê uma treinada escolhendo várias vezes o três modos de operação - só para criar o hábito e ficar mais à vontade. Lembre-se de que o [ESC] te põe sempre de volta no modo Comando. Depois disto, brinque um pouco com os comandos e altere alguma coisa do texto. Não tem por que se preocupar, você sempre pode sair com um :q!

Se você quiser conhecer mais comando, aqui estão dois bons endereços: http://www.fprintf.net/vimCheatSheet.html e http://amath.colorado.edu/computing/unix/vi/.

Voltando ao trabalho...

vim /root/.profile

Logo depois da linha "fi", insira esta entrada:

export EDITOR=/usr/bin/vim.basic

Para salvar e sair do editor use [ESC]:wq


A lista de fontes

O sistema de atualização e de instalação de pacotes do Debian é uma mão na roda. Basta usar o apt-get que o sistema já vai buscar o que é necessário nos endereços indicados. Estes endereços ficam no arquivo /etc/apt/sources.list. Altere-o como mostrado a seguir:

vim /etc/apt/sources.list
#deb cdrom:[Debian GNU/Linux 5.0.0 _Lenny_ - Official amd64 DVD Binary-1 20090214-19:45]/ lenny contrib main

deb http://ftp.br.debian.org/debian/ lenny main non-free contrib
deb-src http://ftp.br.debian.org/debian/ lenny main

deb http://security.debian.org/ lenny/updates main non-free contrib
deb-src http://security.debian.org/ lenny/updates main

deb http://volatile.debian.org/debian-volatile lenny/volatile main
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main

Observe que a linha que pede o CD foi anulada com # e que, em dois endereços, as linhas foram complementadas com "non-free contrib".

Depois de modificar o arquivo é preciso atualizar a lista de fontes. Para isto, faça

apt-get update

Como o Debian Lenny acabou de ser instalado, é possível que existam upgrades para o sistema. Como sempre é bom garantir que as últimas atualizações, principalmente as de segurança, sejam incorporadas ao sistema, chame

apt-get upgrade

e tenha muita paciência por que isto pode demorar um bocado (depende de quantos upgrades precisam ser feitos e da sua conexão de Internet). Depois disto, também é bom dar um reboot para garantir que as atualizações sejam ativadas e para recomeçar o trabalho com o sistema "limpo".

reboot
exit

Quando o servidor reinicia, a conexão SSH que fizemos com o PuTTY é perdida e, para que não fique pendurado, ele é fechado com exit uns segundinhos antes da máquina rebootar.

Espere de dois a três minutos e faça nova conexão com o PuTTY. Agora vamos eliminar dois pacotes por motivo de segurança. Como não pretendemos criar diretórios compartilhados, aqui vai:

apt-get remove nfs-common portmap

E mais uma coisinha. Nós acertamos a data e a hora do servidor, mas daqui a um tempo isto pode estar novamente desajustado. Para que a data e a hora sejam ajustadas pelo menos uma vez por dia, vamos criar uma tarefa cron:

crontab -e

Isto abre o vim para que possamos inserir algumas informações na primeira linha livre. Lembre-se, digite i para entrar no modo de Escrita, vá até o fim da linha que indica quais parâmteros devem ser inseridos e digite [Enter] para abrir uma nova linha. Depois copie e cole o seguinte:

11 11 * * * /etc/init.d/hwclock.sh reload >/dev/null

Depois de inserida a nova linha, tecle :wq para salvar o arquivo e sair do editor. Esta linha diz que, todos os dias, às 11:11 horas, o script /etc/init.d/hwclock.sh reload será rodado. Você pode escolher o horário que quiser: minutos (0-59) - espaço - hora (0-23).


Iptables

Por uma questão de segurança, é bom manter o máximo possível do tráfego entre o servidor e os usuários encriptado. Não vamos entrar em detalhes sobre a criptografia usada, vamos apenas fazer uso dela e ponto. Uma das medidas é não abrir a porta 80 (http). Vamos configurar o sistema de modo que os clientes usem a porta 443 (apache2 com SSL), 993 (dovecot-imapd) e 995 (dovecot-pop3d) sempre que possível. Também vamos limitar o acesso ao SSH.

atencao NÃO USE COMO MOSTRADO, ALTERE PRIMEIRO O ENDEREÇO DE REDE (mostrado em negrito). Sugiro que você copie e cole o script no bloco de notas e altere o endereço. Depois copie e transfira o script inteiro (clicando o botão direito do mouse) para o PuTTY:

iptables -F
iptables -N FIREWALL
iptables -F FIREWALL
iptables -A INPUT -j FIREWALL
iptables -A FORWARD -j FIREWALL
iptables -A FIREWALL -p tcp -m tcp --dport 25 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 80 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 110 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 143 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 443 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 465 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 587 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 993 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 995 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --dport 4650 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp -s 222.222.222.222/24 --dport 22 --syn -j ACCEPT
iptables -A FIREWALL -i lo -j ACCEPT
iptables -A FIREWALL -p udp -m udp --sport 53 -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --sport 53 -j ACCEPT
iptables -A FIREWALL -p udp -m udp --dport 123 -j ACCEPT
iptables -A FIREWALL -p udp -m udp --sport 123 -j ACCEPT
iptables -A FIREWALL -p udp -m udp --sport 6277 -j ACCEPT
iptables -A FIREWALL -p udp -m udp --sport 24441 -j ACCEPT
iptables -A FIREWALL -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A FIREWALL -p icmp --icmp-type source-quench -j ACCEPT
iptables -A FIREWALL -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A FIREWALL -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A FIREWALL -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A FIREWALL -p icmp --icmp-type echo-request -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp --syn -j REJECT
iptables -A FIREWALL -p udp -m udp -j REJECT
iptables -A FIREWALL -p icmp -j DROP
iptables-save > /etc/firewall-rules
iptables-restore < /etc/firewall-rules

A porta 22 é usada para conexões SSH. Como trabalho na empresa e em casa, cujos endereços fazem parte de redes diferentes, fiz duas inserções para esta regra no iptables. Digamos que o endereço IP da minha máquina na empresa seja 100.100.100.100 e que o IP da minha máquina em casa seja 200.200.200.200, inseri o seguinte:

iptables -A FIREWALL -p tcp -m tcp -s 100.100.100.100 --dport 22 --syn -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp -s 200.200.200.200 --dport 22 --syn -j ACCEPT

Este conjunto de comandos escreve as regras do firewall no arquivo /etc/firewall-rules e as coloca no iptables, mas, toda vez que o servidor for reiniciado, o iptables começa vazio porque não é alimentado com as regras que queremos. Para que isto aconteça vamos inserir um comando que configura o iptables num arquivo que "levanta" as interfaces de rede quando o sistema é iniciado:

vi /etc/network/interfaces

Com o arquivo no editor, insira o texto mostrado numa linha logo abaixo de "iface lo inet loopback":

pre-up iptables-restore < /etc/firewall-rules

E, já que você está aqui, duas linhas abaixo altere allow-hotplug eth0 para:

auto eth0

Salve o arquivo e saia (:wq). Para conferir se o script está realmente povoando as regras do iptables (firewall), dê mais um reboot no servidor:

reboot
exit

Se você tiver problemas para acessar remotamente o servidor depois do reboot, o endereço da máquina remota não é o que você indicou. Você vai precisar ir até o servidor para esvaziar o iptables com iptables -F e começar tudo de novo.

Se tudo correu bem (o PuTTY conectou normalmente), dê uma conferida com

iptables -L -v -n

para ver as regras que estão sendo aplicadas.

O que vem a seguir não está relacionado com o iptables, mas está na hora de continuar instalando o ntp, um compilador c, logcheck e mais alguma coisinha:

apt-get install openntpd build-essential make automake1.9 gcc bison flex libc6-dev logcheck logcheck-database flip psmisc dpkg-dev libcurl3 libssh2-1 byacc libbz2-dev

Para mais informações sobre as regras do logcheck e padrões que devem ser incluídos ou ignorados, dê uma olhada em

vi -R /usr/share/doc/logcheck-database/README.logcheck-database.gz

e, para debugar o logcheck, chame:

su -s /bin/bash -c "/usr/sbin/logcheck -otd" logcheck

Agora vamos eliminar alguns itens da base de dados do logcheck. Copie e cole o seguinte:

echo "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: Kernel logging \(proc\) stopped." >>/etc/logcheck/ignore.d.server/syslogd
echo "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: imklog .* log source = /proc/kmsg started." >>/etc/logcheck/ignore.d.server/syslogd
echo '^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyslogd: \[origin software="rsyslogd" swVersion=.*x-pid=.*x-info="http://www.rsyslog.com"\] restart' >>/etc/logcheck/ignore.d.server/syslogd
echo "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ ntpd\[[0-9]+\]: clock is now unsynced$" >>/etc/logcheck/ignore.d.server/ntp
echo "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ ntpd\[[0-9]+\]: clock is now synced$" >>/etc/logcheck/ignore.d.server/ntp

Para mais informações sobre as regras e os padrões do logcheck, leia

vi -R /usr/share/doc/logcheck-database/README.logcheck-database.gz

Para debugar o logcheck você pode usar

su -s /bin/bash -c "/usr/sbin/logcheck -otd" logcheck

Instalando o MySQL

Não indique a senha quando instalar o MySQL (a pergunta será feita 4 vezes):

apt-get install mysql-server

O MySQL padrão está calibrado para um sistema com pouca memória disponível. Precisamos alocar mais memória para colocar itens no cache. Isto fará uma diferença enorme na performance. Vamos alterar todas as tabelas transformando-as em InnoDB e ajustar algumas das suas configurações. Se, por acaso, você tiver dados no MySQL ou tiver alterado o arquivo /etc/mysql/my.conf, não siga estes passos que substituem seu arquivo my.conf pelo meu! Além do mais, estou considerando que você tem pelo menos 1Gb de memória física (2Gb é o recomendado - 3Gb é ainda melhor):

cp /etc/mysql/my.cnf /etc/mysql/my.cnf.original
zcat /usr/share/doc/mysql-server-5.0/examples/my-medium.cnf.gz > /etc/mysql/my.cnf
cd /etc/mysql/
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/my-medium.cnf.patch.txt
patch my.cnf < my-medium.cnf.patch.txt
/etc/init.d/mysql restart

info Este é o script do patch.

Adicione uma senha para o usuário 'root' (certifique-se de que o nome do host esteja correto):

mysql -u root

Do prompt mysql>, crie duas senhas necessárias para o root (substitua o texto em negrito):

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('senha_do_root');
SET PASSWORD FOR 'root'@'nome_do_host' = PASSWORD('senha_do_root');
FLUSH PRIVILEGES;
SHOW VARIABLES LIKE 'innodb_fast_shutdown';
QUIT

Memorize a configuração do innodb_fast_shutdown. O default é "1".

Como o patch alterou o tamanho de innodb_log_file_size, vamos ter que criar novos logs. Se o innodb_fast_shutdown mostrou um valor diferente de "1", edite /etc/mysql/my.cnf e adicione uma entrada "innodb_fast_shutdown = 1" e depois reinicie o mysql com "/etc/init.d/mysql restart". Com o innodb_fast_shutdown = 1 faça:

/etc/init.d/mysql stop

Certifique-se de que o mysql foi baixado sem erros (para garantir que não haja informações sobre transações pendentes nos logs). Depois:

mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/iblogfile0-old
mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/iblogfile1-old
/etc/init.d/mysql start
ls -l /var/lib/mysql/ib_*

Isto deveria mostrar que nossos dois arquivos de log agora têm 48Mb (50331648). Configuramos o "innodb_buffer_pool_size = 192M", o que vai dar uma performance muito melhor do que o default de 8M, e "innodb_log_file_size = 48M", que corresponde a 25% do innodb_buffer_pool_size. Se tiver bastante RAM, você pode aumentar o innodb_buffer_pool_size ainda mais, mas sugiro que não seja mais do que 25% da RAM física.

Instalar programas que usam certificados SSL

Quando copiar e colar os quatro comandos apt-get abaixo, certifique-se de eliminar eventuais espaços no final do comando:

apt-get install apache2 libapache2-mod-php5 php5 php5-common php5-mysql php5-gd php5-mcrypt mcrypt ca-certificates openssl
apt-get install libcompress-raw-zlib-perl libcompress-zlib-perl libdigest-hmac-perl libdigest-sha1-perl libfile-remove-perl libio-compress-base-perl libio-compress-zlib-perl libio-stringy-perl
apt-get install libsys-hostname-long-perl libuser-identity-perl libmail-box-perl libobject-realize-later-perl liburi-perl libio-socket-ssl-perl libnet-ident-perl libmail-dkim-perl pax
apt-get install libarchive-zip-perl libberkeleydb-perl libconvert-binhex-perl libconvert-tnef-perl libconvert-uulib-perl libio-multiplex-perl libmime-tools-perl libnet-cidr-perl libnet-server-perl libunix-syslog-perl

Agora instale o Postfix:

apt-get install postfix postfix-pcre postfix-mysql libsasl2-modules-sql libsasl2-modules

Responda as perguntas:

General type of configuration? Internet Site (the default)
Mail name? nome_do_host.exemplo.com (the default)

Como a versão do Dovecot fornecida pelo Lenny é antiga, vamos criar (compilar) pacotes Debian a partir dos fontes e instalá-los manualmente. Vamos instalar a quarta versão de 1.1.11 para o Debian:

cd /usr/local/src
mkdir dovecot
cd dovecot
wget http://www.dovecot.org/releases/1.1/dovecot-1.1.11.tar.gz
mv dovecot-1.1.11.tar.gz dovecot_1.1.11.orig.tar.gz
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/dovecot_1.1.11-4.diff.gz
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/dovecot_1.1.11-4.dsc
apt-get build-dep dovecot-common
dpkg-source -x dovecot_1.1.11-4.dsc
cd dovecot-1.1.11
dpkg-buildpackage -rfakeroot -uc -b

Isto vai demorar um bom tempo. Se a criação do pacote falhar, procure por dependências, instale o que estiver faltando e rode 'dpkg-buildpackage -rfakeroot -uc -b' novamente. Agora instale cada pacote .deb separadamente usando o auto-preenchimento do Unix (tecla Tab) para completar cada comando:

cd /usr/local/src/dovecot
dpkg -i dovecot-common_1.1.11-4  [Tab][Enter]
dpkg -i dovecot-imapd_1.1.11-4  [Tab][Enter]
dpkg -i dovecot-pop3d_1.1.11-4  [Tab][Enter]

Criar e Instalar Certificados SSL

Qualquer cliente que se conectar ao nosso servidor precisa ser capaz de resolver o nome de host do servidor. Adicione uma entrada no seu arquivo /etc/hosts ou um registro A no seu servidor DNS para que possamos interagir adequadamente com o servidor. É claro que, uma hora qualquer, também será preciso criar um ou mais registros MX.

Nós vamos ser nossa própria Autoridade Certificadora (CA) e assinar (autenticar) nossos próprios certificados. Para fazer isto, os comandos dependem do /etc/ssl/openssl.cnf fornecido pelo Debian. Vamos começar fazendo uma pequena modificação neste arquivo de configuração para que, por default, nossos certificados tenham validade de 10 anos ao invés de apenas 1 ano:

sed -i 's/= 365\t/= 3653\t/' /etc/ssl/openssl.cnf
grep 365 /etc/ssl/openssl.cnf

Agora vamos criar um lugar comum para colocar todos os nossos certificados:

cd /root
mkdir CA
cd CA
mkdir demoCA
cd demoCA
mkdir newcerts
mkdir private
echo '01' > serial
touch index.txt
cd ..

Sabendo onde colocá-lo, vamos criar um Certificado raiz:

openssl req -new -x509 -extensions v3_ca -keyout demoCA/private/cakey.pem -out cacert.pem -days 3653

Quando solicitado, entre com uma frase-senha (passphrase). Você vai precisar desta frase-senha logo mais, portanto, crie uma frase senha única e nunca a perca. Responda as perguntas que forem sendo feitas. Não se esqueça de escrever o nome do estado por extenso e de criar um nome comum (Common Name) que descreva a sua autoridade:

Country Name BR
State or Province Name Parana
Locality Name Curitiba
Organisation Name Minha Empresa Ltda
Organisational Unit Name Servidor WebMail
Common Name (eg, YOUR name) Minha Empresa Ltda - Autoridade Certificadora
Email Address postmaster@exemplo.com

Este processo produz dois arquivos: uma chave privada em demoCA/private/cakey.pem e um certificado raiz CA em cacert.pem. Todo e qualquer arquivo com chave que criarmos precisa ser protegido contra acessos não autorizados e não pode ser perdido nos próximos 10 anos. A CA que acabamos de criar pode assinar quantos certificados quisermos (até que perca sua validade depois de 10 anos). Vamos copiar este certificado e sua chave para arquivos com nomes mais descritivos:

cp -i demoCA/private/cakey.pem demoCA/private/cakey.exemplo.com.pem
chmod 600 demoCA/private/*
cp -i cacert.pem cacert.exemplo.com.pem
cp -i cacert.pem cacert.exemplo.com.crt

Agora copiamos o certificado CA raiz para /usr/share/ca-certificates/self:

mkdir /usr/share/ca-certificates/self
cp -i cacert.exemplo.com.crt /usr/share/ca-certificates/self/

O passo seguinte é rodar dpkg-reconfigure ca-certificates, responder yes para "Trust new certificates from certificate authorities?", descer até encontrar self/cacert.exemplo.com.crt, usar a barra de espaço para selecioná-la, Tab até Ok e digitar Enter para terminar o trabalho. Isto vai criar um sym-link para o nosso certificado CA em /etc/ssl/certs:

dpkg-reconfigure ca-certificates

O cacert.exemplo.com.pem e o cacert.exemplo.com.crt são cópias do nosso certificado e são os arquivos que podem ser distribuídos e instalados nas máquinas clientes. Clientes Windows devem usar o arquivo .crt.

Num sistema Windows 2000, dê um duplo clique no arquivo para instalá-lo no Internet Explorer (exatamente o que queremos). Em outras versões do Windows, abra o Internet Explorer e escolha Ferramentas -> Opções da Internet -> Conteúdo -> Certificados -> Autoridades de certificação raiz confiáveis -> Importar. O Outlook e o Outlook Express usam a mesma loja de certificados que o Internet Explorer.

No Mozilla Thunderbird o caminho é Ferramentas -> Opções -> Privacidade -> Securança -> Ver Certificados -> Autoridades -> Importar. No Firefox é Ferramentas -> Opções -> Avançadas -> Criptografia -> Ver Certificados -> Autoridades -> Importar.

Se você repetir este processo mais de uma vez na fase de testes, não instale certificados duplicados. Delete o certificado antigo antes de instalar um novo que o substitua. Sugiro usar o WinSCP para transferir o certificado cacert.exemplo.com.crt para a sua máquina.

Acho que a pior parte desta instalação é instalar os certificados CA em todos os clientes. Algumas vezes vale a pena comprar um certificado comercial de uma CA conhecida que já esteja na loja das Autoridades de certificação raiz confiáveis.


Muito bem, somos uma Autoridade Certificadora (CA) e podemos assinar nossos próprios certificados. Pois então vamos criar uma requisição para um certificado da CA. Qualquer pessoa que se conectar ao nosso servidor vai se conectar ao nome de host desta máquina. O servidor Secure Web, servidor Secure IMAP, servidor Secure POP e o servidor Postfix Secure SMTP serão todos nome_do_host.exemplo.com. Por este motivo, o Common Name PRECISA SER nosso nome de host FQDN quando criarmos a requisição. O Organisation name precisa ser o mesmo que consta no certificado CA. Não indique seu endereço de email, challenge password ou um optional company name quando gerar o CSR (certificate signing request - requisição de assinatura de certificado):

openssl req -new -nodes -out req.pem
Country Name BR
State or Province Name Parana
Locality Name Curitiba
Organisation Name Minha Empresa Ltda
Organisational Unit Name Servidor WebMail
Common Name (eg, YOUR name) nome_do_host.exemplo.com
Email Address

Este processo também produz dois arquivos, uma chave privada em privkey.pem e uma requisição de assinatura de certificado em req.pem. Estes arquivos deveriam ser guardados. A chave privada será necessária para a encriptação SSL. Vamos fazer um backup destes aquivos com nomes mais descritivos:

cp -i privkey.pem privkey.nome_do_host.exemplo.com.pem
chmod 600 privkey.*
cp -i req.pem req.nome_do_host.exemplo.com.pem

Assine o Certificado (é aqui que você precisa da sua frase-senha):

openssl ca -out cert.pem -cert cacert.pem -infiles req.pem

Este processo atualiza a base de dados da CA e produz dois arquivos, um certificado em cert.pem e uma cópia do certificado em demoCA/newcerts/ com o nome xx.pem, onde xx é um número de série. Vamos copiar o cert com um nome mais descritivo. O certificado contém a versão codificada e a versão legível, tudo no mesmo arquivo. Queremos eliminar a porção legível:

mv -i cert.pem temp.cert.nome_do_host.exemplo.com.pem
openssl x509 -in temp.cert.nome_do-host.exemplo.com.pem -out cert.pem
cp -i cert.pem cert.nome_do_host.exemplo.com.pem

O Postfix e o Dovecot vão pedir o cert e a chave em dois arquivos separados, o apache2 vai solicitar os dois combinados (mas pode usar dois arquivos separados se for configurado para isto).

cat privkey.nome_do_host.exemplo.com.pem cert.nome_do_host.exemplo.com.pem >key-cert.pem
cp -i key-cert.pem key-cert.nome_do_host.exemplo.com.pem
chmod -R 600 /root/CA

Despois destes passos você tem três elementos instaláveis (além de mais algumas cópias descritivas):

  • Uma chave privada em privkey.pem (com uma cópia chamada privkey.nome_do_host.exemplo.com.pem)
  • Um certificado em cert.pem (e a cópia cert.nome_do_host.exemplo.com.pem)
  • Uma chave privada combinada com o certificado em key-cert.pem (cuja cópia é key-cert.nome_do_host.exemplo.com.pem)

Está na hora de dar uma cópia do certificado combinado para o Apache2. Vamos configurar nome_do_host.exemplo.com no Apache2 para que use o /etc/apache2/key-cert.nome_do_host.exemplo.com.pem:

/etc/init.d/apache2 stop
/etc/init.d/apache2 start
cd /root/CA/
cp key-cert.nome_do_host.exemplo.com.pem /etc/apache2/
chmod 600 /etc/apache2/key-cert.nome_do_host.exemplo.com.pem

Agora vamos configurar o Apache2. Primeiro habilitamos o módulo SSL, como também o módulo rewrite para, opcionalmente, podermos redirecionar as requisições feitas para a porta 80 para a porta 443:

a2enmod ssl
a2enmod rewrite

Vamos fazer uma cópia do site default. Esta cópia será usada na configuração do site SSL:

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl

Agora edite /etc/apache2/sites-available/default

vi /etc/apache2/sites-available/default

e mude

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/

para:

<VirtualHost *:80>
        ServerAdmin webmaster@exemplo.com
        ServerName nome_do_host.exemplo.com
        DocumentRoot /var/www/

Edite também /etc/apache2/sites-available/ssl

vi /etc/apache2/sites-available/ssl

e mude

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/

para:

<VirtualHost *:443>
        ServerAdmin webmaster@exemplo.com
        ServerName nome_do_host.exemplo.com
        SSLEngine on
        SSLCertificateFile /etc/apache2/key-cert.nome_do_host.exemplo.com.pem
        DocumentRoot /var/www/

Depois de editados os arquivos, habilite o novo site que chamamos de ssl e reinicie o Apache2:

a2ensite ssl
/etc/init.d/apache2 stop
/etc/init.d/apache2 start

Se você fez tudo direitinho, então não deve receber mensagens de erro quando baixar e levantar o Apache2. Agora eu sugiro que você adicione uma entrada no arquivo hosts do seu computador pessoal, por exemplo, 111.111.111.111 nome_do_host.exemplo.com, ou que crie um registro A na sua zona no servidor DNS apropriado (o que, mais hora, menos hora, precisa ser feito de qualquer forma). A esta altura você deveria conseguir navegar tanto com http://nome_do_host.exemplo.com como com https://nome_do_host.exemplo.com. A página web default diz apenas "It works!".

vovo A esta altura do campeonato eu optei por inserir uma entrada no arquivo hosts na minha máquina local com o sistema Windows XP. Só para constar, este arquivo está em /seu_diretório_do_windows/system32/drivers/etc/hosts. Edite-o e aí é só mandar bala.

Habilitamos a porta 80 apenas para facilitar as coisas. Na verdade, não queremos que os usuários façam conexão sem usar SSL, por isso vamos configurar um redirecionamento. Isto é opcional, porém é altamente recomendado. Edite /etc/apache2/sites-available/default mais uma vez

vi /etc/apache2/sites-available/default

e insira estes itens adicionais no ponto mostrado:

<VirtualHost *:80>
        RewriteEngine   on
        RewriteCond     %{SERVER_PORT} ^80$
        RewriteRule     ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
        RewriteLog      "/var/log/apache2/rewrite.log"
        RewriteLogLevel 2

Depois, reinicie o Apache2:

/etc/init.d/apache2 restart

Despois desta alteração, se você fechar o browser, abri-lo novamente e chamar http://nome_do_host.exemplo.com, você vai ser redirecionado para o site SSL (observe a troca de http por https no endereço e o cadeado no rodapé do browser). Isto custa um pouquinho por que dois processos são requeridos para manter as duas portas, a 80 e a 443. A grande vantagem é que nenhum dos usuários precisa se lembrar de usar https://. Aliás, costumo usar lsof -P | grep LISTEN para mostrar as portas que estão em uso.

Se você quiser hospedar múltiplos sites http com múltiplos certificados, deixo para você a tarefa de desvendar como fazer isto. O que posso adiantar é que você pode criar e assinar quantos certificados quiser, apenas certifique-se de não criar um novo certificado de autoridade (CA). A autoridade certificadora, apenas uma e única, pode assinar todos os certificados. Pelo que eu saiba, se mais de um site usar SSL, cada um deles vai precisar de um endereço IP diferente. O Google é seu amigo. Para deixar as coisas bem claras, você pode hospedar tantos domínios de email quantos quiser, mas nesta configuração todos eles são acessados através de uma, e apenas uma, interface http. Mas vamos continuar que ainda tem muita coisa pela frente...

Faça o backup e substitua o certificado e a chave do Dovecot:

mv /etc/ssl/certs/dovecot.pem /etc/ssl/certs/dovecot.pem.backup
cp cert.nome_do_host.exemplo.com.pem /etc/ssl/certs/dovecot.pem
mv /etc/ssl/private/dovecot.pem /etc/ssl/private/dovecot.pem.backup
cp privkey.nome_do_host.exemplo.com.pem /etc/ssl/private/dovecot.pem
chmod 0600 /etc/ssl/private/dovecot.pem
/etc/init.d/dovecot restart

Informe o Postfix onde encontrar os certificados (e aproveite para configurar alguns parâmetros TLS adicionais). Também faremos um backup do main.cf antes de modificá-lo pela primeira vez:

cp -i /etc/postfix/main.cf /etc/postfix/main.cf-17mai2009
postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem"
postconf -e "smtpd_tls_key_file = /etc/ssl/private/dovecot.pem"
postconf -e "smtpd_tls_CAfile = /etc/ssl/certs/cacert.exemplo.com.pem"
postconf -e "smtpd_tls_received_header = yes"
postfix reload

Executando alguns destes comandos uma segunda vez tem como resultado sobre-escrever chaves e certificados, e isto pode não ser bom. Alguns arquivos serão sobre-escritos se certificados adicionais forem requisitados, assinados e criados. Isto é o esperado e também o motivo pelo qual fazemos cópias específicas para os hosts de tudo à medida que avançamos. Apenas tome cuidado para não sobre-escrever qualquer arquivo host-específico que tenha sido criado e lembre-se: é preciso criar apenas um Certificado de Autoridade raiz. Faça um backup da sessão, no próprio servidor e fora dele (na sua máquina local ou num pendrive - sugiro usar o WinSCP):

cp -r /root/CA /root/CA-17mai2009

Adicionando a home page

Faça o download da home page. Esta página descreve as características do sistema de email para novos usuários. Estes serviços ainda não estão instalados, mas podemos publicar esta página. Assim que estiver disponível, edite-a (você pode usar o WinSCP para fazer isto) para que atenda seus objetivos:

cd /var/www
wget wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/virtual.index.html
cp index.html index.html-apache-original
cp virtual.index.html index.html
sed -i 's/Our Organization/Minha Empresa Ltda/' index.html
sed -i 's/somehost.domain.tld/nome_do_host.exemplo.com/' index.html
sed -i 's/domain.tld/exemplo.com/' index.html
chown root:www-data index.html

Instalar e Configurar o phpMyAdmin

apt-get install phpmyadmin

Escolha apache2 no prompt "Web server to reconfigure automatically:". Lembre-se, barra de espaço para selecionar e tecla Tab para se movimentar.

Neste ponto nosso programa https://nome_do_host.exemplo.com/phpmyadmin está sujeito a abusos. Vamos conferir segurança a ele obscurecendo sua URL, definindo um nome de usuário e senha e, opcionalmente (mas altamente recomendado), permitindo que apenas determinados endereços IP possam acessar a URL. Obscureça a URL mudando seu nome:

sed -i 's/Alias \/phpmyadmin /Alias \/phpmyadmiNx /' /etc/apache2/conf.d/phpmyadmin.conf

Com as configurações atuais do /etc/apache2/apache2.conf, os arquivos que controlam acessos (arquivos como o .htpasswd) não serão usados, a menos que informemos ao apache2 para que os use. Vamos modificar o arquivo de controle de acesso original e depois alterar o /etc/apache2/conf.d/phpmyadmin.conf para que o utilize. O nome de usuário atual é 'admin'. Vamos começar obscurecendo o nome do usuário:

sed -i 's/admin/myadmin_nome_usuário/' /etc/phpmyadmin/htpasswd.setup

Depois, crie uma senha para este usuário:

htpasswd -c /etc/phpmyadmin/htpasswd.setup myadmin_nome_usuário

New password: myadmin_senha
Re-type new password: myadmin_senha

Agora vamos fazer com que o apache2 use este arquivo de acesso colocando diretivas em /etc/apache2/conf.d/phpmyadmin.conf. Quando isto estiver feito, as chamadas para o diretório /phpmyadmiNx vão receber uma caixa de diálogo de login. Note que nossa versão de /etc/apache2/apache2.conf contém o comando "Include /etc/apache2/conf.d" de modo que quaisquer arquivos config colocados neste diretório serão lidos. Também vou mostrar como limitar o acesso a uma única estação de trabalho (a sua, naturalmente). Isto é opcional, mas recomendado. Se você precisar dar permissão para uma rede de máquinas, use um endereço IP parcial (por exemplo 192.168), veja http://httpd.apache.org/docs/2.2/howto/access.html. Abra o editor com

vi /etc/apache2/conf.d/phpmyadmin.conf

e insira o seguinte na posição mostrada, certificando-se de que o endereço IP seja o endereço IP da sua estação de trabalho (como o servidor de email a vê). Se preferir, você pode colocar um ou mais dos últimos octetos do endereço IP para permitir que uma gama maior de hosts possa acessar o prompt de login do phpMyAdmin. Mesmo assim, eles vão precisar passar pelas duas camadas de segurança.

<Directory /usr/share/phpmyadmin/>

 order deny,allow
 deny from all
 allow from 666.666.666.666

 AuthUserFile /etc/phpmyadmin/htpasswd.setup
 AuthGroupFile /dev/null
 AuthName "phpMyAdmin"
 AuthType Basic
 Require valid-user

Salve o arquivo, depois reinicie o apache2

/etc/init.d/apache2 restart

e chame o phpMyAdmin no browser:

https://nome_do_host.exemplo.com/phpmyadmiNx

O primeiro login é o nome de usuário e a senha do phpMyAdmin: myadmin_nome_usuário myadmin_senha. O segundo login é seu login do mysql (neste ponto é root e senha_do_root). Você pode fechar a página web do phpMyAdmin.

Algumas configurações preliminares do Postfix

Vamos determinar explicitamente nosso nome de domínio e nome do host no Postfix para que não haja possibilidade do Postfix encontrar alguma coisa diferente. Também vamos remover uma linha por que queremos habilitar ou desabilitar o TLS em master.cf:

postconf -e "mydomain = exemplo.com"
postconf -e "myorigin = exemplo.com"
postconf -e "myhostname = nome_do_host.exemplo.com"
postconf -e "mydestination = exemplo.com, nome_do_host.exemplo.com, localhost.exemplo.com, localhost"
sed -i 's/smtpd_use_tls=yes//' /etc/postfix/main.cf
postfix reload

Neste ponto, se você der o comando

postconf -n

o Postfix deveria mostrar que o main.cf está configurado da seguinte forma:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = all
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
mydestination = exemplo.com, nome_do_host.exemplo.com, localhost.exemplo.com, localhost
mydomain = exemplo.com
myhostname = nome_do_host.exemplo.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = exemplo.com
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_tls_CAfile = /etc/ssl/certs/cacert.exemplo.com.pem
smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/ssl/private/dovecot.pem
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

Por favor, note que 'postconf -n' não mostra necessariamente todas as configurações que temos no main.cf. O Postfix deve aceitar emails para os endereços listados em /etc/aliases e entregá-los numa caixa de correio em /var/mail. Você deve testar isto. Configure um MUA para usar este servidor de emails como seu servidor de saída SMTP.

Para fazer os testes eu uso vários MUAs diferentes (Outlook, Outlook Express, Thunderbird, The Bat!) instalados e configurados na estação de trabalho local de onde envio os emails. Não envie emails a partir da linha de comando (usando sendmail ou outros meios) quando testar este sistema. Em todos os testes que serão realizados, espero que você envie mensagens de teste através de um cliente externo (a não ser que estejamos testando algo como o SquirrelMail). Envie agora uma mensagem para postmaster@exemplo.com. Veja o que /var/log/mail.log diz sobre a transação (procure por erros). Ele também deve mostrar o usuário para o qual a mensagem foi enviada:

tail -50 /var/log/mail.log
ls -l /var/mail

No diretório /var/mail você deve ver a caixa de correio do usuário para o qual a mensagem foi enviada. Você pode dar o comando ' more /var/mail/user ' para ler o conteúdo da caixa de correio.

Pegue o código fonte do Postfix (vamos precisar de alguns deles):

cd /usr/local/src
wget http://ftp.debian.org/debian/pool/main/p/postfix/postfix_2.5.5.orig.tar.gz
tar xzf postfix_2.5.5.orig.tar.gz

Dê o primeiro comando isoladamente:

cp -i /usr/local/src/postfix-2.5.5/conf/* /etc/postfix
cp -i /etc/postfix/header_checks /etc/postfix/body_checks
cp -i /etc/postfix/access /etc/postfix/sender_access
cp -i /etc/postfix/access /etc/postfix/rbl_client_exceptions
cp -i /etc/postfix/access /etc/postfix/rbl_sender_exceptions
cp -i /etc/postfix/access /etc/postfix/rbl_recipient_exceptions
cp /usr/local/src/postfix-2.5.5/examples/chroot-setup/LINUX2 /usr/sbin
chmod +x /usr/sbin/LINUX2
LINUX2

No Debian, o Postfix roda num chroot. O script LINUX2 é usado para copiar os arquivos para a jaula chroot.


Instalando o SquirrelMail

Vamos instalar o SquirrelMail e mais algumas coisinhas:

apt-get install squirrelmail squirrelmail-locales maildrop
apt-get install sudo php-pear php5-mysql php5-gd php5-cli php5-common php5-mcrypt
apt-get install php-db php-net-socket php-log php-net-smtp php5-imap

Instalar e Configurar o PostfixAdmin e a Entrega

Adicione nosso usuário virtual e grupo:

groupadd vmail -g 6060
useradd vmail -u 6060 -g 6060

Crie o diretório onde nossas mensagens devem ser armazenadas:

mkdir /var/vmail
chown -R vmail:vmail /var/vmail
chmod -R 700 /var/vmail

Instale o PostfixAdmin 2.2.1.1 e guarde este pacote em lugar seguro por que você precisa usar esta versão e não deve fazer upgrade nela. Vamos instalar alguns patches neste software e, se você atualizar este pacote, você terá que refazer os patches (e os patches disponibilizados podem não funcionar!):

cd /usr/local/src
wget http://superb-east.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin_2.2.1.1_all.deb

Se o download falhar, veja http://sourceforge.net/project/showfiles.php?group_id=191583&package_id=225300 ou tente:

 wget http://softlayer.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin_2.2.1.1_all.deb
dpkg -i postfixadmin_2.2.1.1_all.deb
echo "postfixadmin hold" | dpkg --set-selections

Precisamos criar a base de dados inicial 'postfix' no MySQL. Primeiro logue no MySQL usando a senha do root senha_do_root:

mysql -p

Depois crie a base de dados e um usuário:

CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'pfix_senha';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER, DROP ON `postfix`.* TO 'postfix'@'localhost';
FLUSH PRIVILEGES;
QUIT
cd /usr/share/postfixadmin
cp config.inc.php config.inc.php.original
sed -i "s/configured'] = false/configured'] = true/" config.inc.php
sed -i "s|admin_url'] = ''|admin_url'] = 'https://nome_do_host.exemplo.com/postFixadmiNx'|" config.inc.php
sed -i "s|admin_path'] = ''|admin_path'] = '/usr/share/postfixadmin'|" config.inc.php
sed -i "s/database_type'] = 'mysql'/database_type'] = 'mysqli'/" config.inc.php
sed -i "s/password'] = 'postfixadmin'/password'] = 'pfix_senha'/" config.inc.php
sed -i 's/postmaster@change-this-to-your.domain.tld/postmaster@exemplo.com/' config.inc.php
sed -i 's/abuse@change-this-to-your.domain.tld/abuse@exemplo.com/' config.inc.php
sed -i 's/hostmaster@change-this-to-your.domain.tld/hostmaster@exemplo.com/' config.inc.php
sed -i 's/postmaster@change-this-to-your.domain.tld/postmaster@exemplo.com/' config.inc.php
sed -i 's/webmaster@change-this-to-your.domain.tld/webmaster@exemplo.com/' config.inc.php
sed -i 's/autoreply.change-this-to-your.domain.tld/autoreply.exemplo.com/' config.inc.php
sed -i 's|to change-this-to-your.domain.tld|to https://nome_do_host.exemplo.com/postFixadmiNx|' config.inc.php
sed -i 's|http://change-this-to-your.domain.tld|https://nome_do_host.exemplo.com/postFixadmiNx|' config.inc.php
sed -i "s/domain_path'] = 'NO/domain_path'] = 'YES/" config.inc.php
sed -i "s/domain_in_mailbox'] = 'YES/domain_in_mailbox'] = 'NO/" config.inc.php
sed -i "s/mailboxes'] = '10'/mailboxes'] = '300'/" config.inc.php
sed -i "s/aliases'] = '10'/aliases'] = '300'/" config.inc.php
sed -i "s/maxquota'] = '10'/maxquota'] = '500'/" config.inc.php
sed -i "s/quota'] = 'NO/quota'] = 'YES/" config.inc.php
sed -i 's/EHLO/HELO/' functions.inc.php

Seria interessante você dar um vi config.inc.php para dar uma olhada, se familiarizar com todas as possibilidades de configuração e confirmar que seu nome de domínio foi atualizado corretamente. Agora crie uma senha .htaccess para a URL admin url (o nome do usuário será pfadmin_nome_usuário). Determine a senha pfadmin_senha:

cd /usr/share/postfixadmin
htpasswd -c .htpasswd pfadmin_nome_usuário

Agora informe o apache2 para usar o arquivo. Também vamos limitar o acesso do login admin à nossa estação local, mas você pode adicionar mais endereços IP (ou redes) se for necessário. Se você quiser adicionar uma rede classe C, por exemplo, faça-o usando a forma 192.168.0 e uma rede classe B seria na forma 172.16. O acesso de administradores a https://nome_do_host.exemplo.com/postFixadmiNx/login.php é controlado através do(s) endereço(s) IP dos clientes e através do nome de usuário e senha do .htaccess.

vi /etc/apache2/conf.d/postfixadmin.conf

e insira esta frase. Não esqueça de editar o endereço IP (se ainda não o fez) e lembre-se de que os comentários precisam ser justificados à esquerda:

Alias /postfixadmin /usr/share/postfixadmin

<Directory /usr/share/postfixadmin/>
  <Files ~ "login.php">
    Order Deny,Allow
    Deny from All
    Allow from 666.666.666.666
    AuthUserFile /usr/share/postfixadmin/.htpasswd
    AuthGroupFile /dev/null
    AuthName "Postfix Admin"
    AuthType Basic
    Require valid-user
  </Files>
</Directory>

<Directory /usr/share/postfixadmin/users/>
  <Files ~ "login.php">
    Order Allow,Deny
    Allow from All
    Satisfy Any
  </Files>
</Directory>

Assim como no phpMyAdmin, vamos obscurecer a URL do postfixadmin:

sed -i s'|Alias /postfixadmin|Alias /postFixadmiNx|' /etc/apache2/conf.d/postfixadmin.conf

Reinicie o apache2:

/etc/init.d/apache2 restart

Quando adicionamos um usuário no PostfixAdmin, também precisamos criar um perfil no SquirrelMail. Além disto, queremos poder criar e manipular o limite de espaço (quota) quando necessário. Estes dois patches nos permitem fazer isto:

cd /usr/share/postfixadmin/
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/edit-mailbox.patch.v2.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/create-mailbox.v2.patch.txt

cp create-mailbox.php create-mailbox.php.original
cp edit-mailbox.php edit-mailbox.php.original
patch -p0 < edit-mailbox.patch.v2.txt
patch -p0 < create-mailbox.v2.patch.txt

cd /usr/sbin
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/mail_profile.sh.txt
mv mail_profile.sh.txt mail_profile.sh
chmod +x mail_profile.sh
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/quotaedit.sh.txt
mv quotaedit.sh.txt quotaedit.sh
chmod +x quotaedit.sh

info Veja os scripts baixados: edit mailbox, create mailbox, mail profile e quota edit.

Para permitir que o usuário www-data possa executar estes scripts, você precisa rodar

visudo

e, no fim da página, adicionar o seguinte (observe nosso nome de host):

www-data nome_do_host=NOPASSWD: /usr/sbin/mail_profile.sh
www-data nome_do_host=NOPASSWD: /usr/sbin/quotaedit.sh

Este é um outro patch que resolve um problema onde itens do menu drop down desaparecem. Ele simplesmente adiciona umas poucas quebras de linha nos lugares certos.

cd /usr/share/postfixadmin/templates
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/postfixadmin.menu.patch.txt
cp menu.php menu.php.original
patch -p0 < postfixadmin.menu.patch.txt

info Veja o patch baixado.

Se tudo estiver OK, chame https://nome_do_host.exemplo.com/postFixadmiNx/setup.php no browser e se adicione como Super Admin. Você não está adicionando uma caixa de correio para você mesmo, apenas um login. Executando este script, a estrutura inicial da base de dados é criada. Feche esta página web assim que o Super Admin for criado. Agora vamos mudar as tabelas para InnoDB, deletar um index redundante e adicionar um campo onde senhas em texto claro (não criptografadas) possam ser guardadas (isto é necessário se o cram-md5 for usado):

cd /usr/share/postfixadmin
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/convert.postfixadmin.tables.sql.v2211
mysql -u root -p < convert.postfixadmin.tables.sql.v2211

info Veja o patch baixado.

Entre senha_do_root para completar o último comando. Não queremos visitar o setup.php novamente:

mv setup.php setup.php.txt

Agora podemos logar como Super Admin em https://nome_do_host.exemplo.com/postFixadmiNx/. Ainda temos que fazer mais configurações no Postfix antes de poder testar a entrega de emails. Passe pela segurança do apache com pfadmin_nome_usuário e pfadmin_senha. Clique em Domain List->New Domain e adicione o domínio primário (exemplo.com). Deixe as opções "Add default mail aliases:" e "Mail server is backup MX:" desmarcadas. Todos os domínios que você adicionar precisam ter um registro A ou um registro MX no DNS para o PostfixAdmin considerá-los válidos. No entanto, existe uma configuração no config.inc.php que permite desabilitar esta exigência (emailcheck_resolve_domain). Adicione qualquer outro domínio que você precisar. Apenas adicione domínios que guardarão mensagens localmente (falaremos sobre domínios de relay mais tarde). Se você clicar em Admin List->New Admin você pode adicionar admins 'normais' que apenas controlam domínios que você designar para eles, ou seja, não têm um controle completo sobre todos os domínios.

Você deve criar um admin 'normal' para você mesmo para usá-lo no dia a dia. Admins 'normais' vêem opções de menu diferentes. O link https://nome_do_host.exemplo.com/posFixadminx/ será usados pelos administradores. Os usuários podem alterar suas informações de encaminhamento (forward) e senhas em https://nome_do_host.exemplo.com/postFixadmiNx/users; no entanto, isto não será necessário depois que instalarmos um plugin no SquirrelMail.

Quando tivermos criado pelo menos um domínio, o próximo passo é adicionar uma caixa de correio para você mesmo. Se estiver logado como Super Admin, clique em 'Domain List', selecione um domínio e depois clique em 'Add Mailbox' no fim desta página. Isto pode ser trabalhoso se você tiver muitos usuários por que você teria que rolar até o fim da página para encontrar o link 'Add Mailbox'. Se você não for um Super Admin você simplesmente clica em 'Main' e depois em 'Add Mailbox'. Os check boxes "Active" e "Create Mailbox" precisam ser marcados. Observe que Username é apenas a parte local - você deve escolher @domínio da caixa drop down.

Crie um nome de usuário em letra minúscula. Esta será sua conta IMAP (e/ou POP3). É imperativo que nosso script mail_profile.sh rode perfeitamente quando uma caixa de correio for criada no PostfixAdmin; caso contrário, os usuários vão obter erros quando logarem no SquirrelMail, eles não serão inscritos na pasta Spam e as quotas não vão funcionar. Cheque para ver se sua caixa postal e um perfil no SquirrelMail foram criados:

ls -l /var/vmail/exemplo.com
ls -l /var/lib/squirrelmail/data

Saiba que, quando uma caixa postal for deletada através do PostfixAdmin, como precaução de segurança nós NÃO vamos deletar automaticamente os diretórios e os emails deste usuário. Você terá que remover tudo manualmente.

Agora você deveria criar um usuário comum "teste@exemplo.com" para usar nos testes de envio e recebimento de mensagens como usuário comum e não como admin. Neste ponto ainda precisamos configurar o Postfix para enviar emails para nossas caixas postais virtuais usando informação guardada na base de dados do PostfixAdmin. Comece fazendo o download e modificando os arquivos de dados de acesso do Postfix:

cd /etc/postfix
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/mysql_virtual_alias_maps.cf
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/mysql_virtual_domains_maps.cf
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/mysql_virtual_mailbox_maps.cf
sed -i 's/password = postfix/password = pfix_password/' mysql_virtual_alias_maps.cf
sed -i 's/password = postfix/password = pfix_password/' mysql_virtual_domains_maps.cf
sed -i 's/password = postfix/password = pfix_password/' mysql_virtual_mailbox_maps.cf
chmod 640 mysql_*
chown root:postfix mysql_*

info Veja os scripts baixados: mysql virtual alias maps, mysql virtual domains maps e mysql virtual mailbox maps.

Precisamos tirar nosso nome de domínio de $mydestination por que nosso domínio será listado logo mais como um domínio de caixa postal virtual - você não pode ter um domínio em mais de uma classe de endereço:

cp /etc/postfix/main.cf /etc/postfix/main.cf-domain
postconf -e "mydestination = nome_do_host.exemplo.com, localhost.exemplo.com, localhost"

Agora faça com que o Postfix use os arquivos de dados MySQL (assim como a entrega Dovecot - que ainda precisa de configuração):

touch /etc/postfix/virtual
postmap /etc/postfix/virtual
cp /etc/postfix/virtual /etc/postfix/amavis_virtual
postmap /etc/postfix/amavis_virtual
postconf -e "virtual_minimum_uid = 6060"
postconf -e "virtual_gid_maps = static:6060"
postconf -e "virtual_uid_maps = static:6060"
postconf -e "virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, hash:/etc/postfix/virtual"
postconf -e "virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf"
postconf -e "virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf"
postconf -e "virtual_transport = dovecot"
postconf -e "virtual_mailbox_base = /var/vmail/"
postconf -e "dovecot_destination_concurrency_limit = 2"
postconf -e "dovecot_destination_recipient_limit = 1"

Note que foi usado proxy:mysql, o proxymap(8). Quando o proxymap(8) é usado, as alterações feitas nas tabelas do MySQL podem não ser reconhecidas imediatamente. Durante os testes, se quiser, você pode tirar proxy: para evitar frustrações e confusões. Se não fizer isto, você pode alternativamente recarregar o Postfix para que as alterações sejam reconhecidas mais cedo.


Para configurar a 'entrega' Dovecot, pegue primeiro o arquivo global.sieve que contém instruções de como entregar spam na pasta Spam do usuário. Também precisamos criar um arquivo de log dovecot-deliver.log para podermos acompanhar como a entrega de emails está sendo feita:

mkdir /var/sieve
cd /var/sieve
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/global.sieve.txt
mv global.sieve.txt global.sieve
chown -R vmail:vmail /var/sieve
chmod -R 0700 /var/sieve
touch /var/log/dovecot-deliver.log
chown vmail:vmail /var/log/dovecot-deliver.log
cd /etc/logrotate.d/
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/deliver.logrotate.txt
mv deliver.logrotate.txt dovecot-deliver

info Veja os scripts baixados: global sieve e deliver logrotate.

Agora é preciso editar a entrada dovecot em master.cf. Também faremos um backup do master.cf original:

cp -i /etc/postfix/master.cf /etc/postfix/master.cf-17mai2009
vi /etc/postfix/master.cf

Localize o transporte maildrop atual e depois insira o transporte dovecot como mostrado:

maildrop  unix  -       n       n       -       -       pipe
  flags=ODRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient} -e
Depois recarregue o Postfix:

postfix stop
postfix start

Você deve receber uma mensagem de erro dizendo que os arquivos diferem (files differ). Execute o LINUX2 para corrigir isto. Neste ponto, precisamos configurar o Dovecot. Vamos fazer muitas alterações nos arquivos /etc/dovecot/dovecot.conf e /etc/dovecot/dovecot-sql.conf para que trabalhem adequadamente no nosso ambiente atual, por isto, ao invés de editá-los, baixe arquivos novos:

cd /etc/dovecot
mv dovecot.conf dovecot.conf.original
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/dovecot.conf.txt
mv dovecot.conf.txt dovecot.conf
sed -i 's/postmaster@example.tld/postmaster@exemplo.com/' dovecot.conf
chmod 0644 dovecot.conf
mv dovecot-sql.conf dovecot-sql.conf.original
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/dovecot-sql.conf.txt
mv dovecot-sql.conf.txt dovecot-sql.conf
sed -i 's/password=password/password=pfix_senha/' dovecot-sql.conf
chmod 0600 dovecot-sql.conf
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/dovecot-crammd5.conf.txt
mv dovecot-crammd5.conf.txt dovecot-crammd5.conf
sed -i 's/password=password/password=pfix_senha/' dovecot-crammd5.conf
chmod 0600 dovecot-crammd5.conf
/etc/init.d/dovecot restart

info Veja os scripts baixados: dovecot.conf, dovecot-sql.conf e dovecot-crammd5.conf.

Vamos recomeçar com tudo limpinho por que, de qualquer modo, precisamos nos certificar de que algumas coisas estejam funcionando depois de um reboot:

reboot
exit

Assim que o sistema estiver de volta, faça login e:

tail -f /var/log/mail.log

Agora vamos mandar uma mensagem através do sistema para ver se ela chega no nosso maildir. A esta altura você já deve ter um MUA configurado para usar este servidor como seu servidor de saída. Você também deve ser capaz de configurá-lo para que se conecte com o servidor IMAP usando seu nome de usuário (o endereço de email completo) e uma senha. Por padrão, o Dovecot não vai permitir que você se autentique no servidor IMAP passando uma senha em texto claro (não criptografada) via rede, por isto você precisa configurar seu MUA para usar SSL (TLS) na porta 993 (IMAP seguro). Acontece que ainda não configuramos o Postfix para usar SASL, por isto, no momento, será preciso usar a porta 25 como porta de saída do seu SMTP. Assumindo que você tenha tido sucesso ao criar um maildir para você mesmo (via interface do PostfixAdmin), envie uma mensagem para você mesmo e verifique se ela foi recebida. Use um tail no arquivo mail.log enquanto a mensagem é processada (chame o tail antes de enviar a mensagem e fique observando). Faça também um grep fatal /var/log/mail.log. Um sucesso deve ter o seguinte aspecto:

Mai 17 14:02:08 ns2 postfix/pipe[12517]: C2506E99C5: to=<teste@exemplo.com>, relay=dovecot, delay=0.19, delays=0.11/0.02/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)

Se houver erro, ele precisa ser corrigido antes de continuar. Fizemos uma porção de alterações numa porção de arquivos. A probabilidade de algum detalhe ter escapado é grande, o que pode impedir a entrega de mensagens. É preciso conhecer os arquivos envolvidos e procurar identificar a ou as configurações incorretas. Alguma familiaridade com o Postfix também é muito bom, assim como conhecer comandos básicos do mailq, postsuper, qshape e postqueue. Lembre-se também que você tem o phpMyAdmin para analisar as bases de dados e para eventualmente fazer algumas alterações diretamente. Analise a base de dados 'postfix' para se acostumar com a estrutura dos dados. Talvez também seria conveniente criar uma conta IMAP para o usuário teste@exemplo.com e enviar uma mensagem para este endereço e depois verificar se ela foi recebida no maildir:

ls -al /var/vmail/exemplo.com/teste/new
cat /var/log/dovecot-deliver.log

Se você pode entregar mensagens para um usuário, seria uma boa idéia se familiarizar com o PostfixAdmin agora. Adicione alguns aliases e alguns domínios. Brinque com o software. O Postfix não vai mais usar /etc/aliases para os domínios virtuais, assim:

Você precisa criar aliases (ou caixas postais) para root, abuse, postmaster, webmaster, clamav e logcheck em exemplo.com

root@exemplo.com deve ter seus emails encaminhados para um endereço de usuário real (ele não deve ser uma caixa de correio, deve ser um alias). Se você não conseguir criar aliases ou caixas postais para mensagens geradas pelo sistema, o Dovecot vai saltar mensagens ou você vai acabar com mensagens perdidas em /var/mail/. Seria uma boa idéia ver o que você tem lá agora.

Configure seu MUA para buscar mensagens do servidor de email via IMAP SSL (TSL) na porta 993. Se você precisar usar POP3, use POP3 SSL (TLS) na porta 995. Clientes POP3 só serão capazes de buscar emails da pasta /new, o que significa que eles nunca poderão ver a pasta Spam, a não ser que se use o SquirrelMail. Por padrão, senhas inseguras em texto claro nas portas 110 (POP3) e 143 (IMAP) não são permitidas. Se precisar usar o POP3 e IMAP padrão, então será preciso adicionar a configuração "disable_plaintext_auth = no" em dovecot.conf. Alguns clientes podem querer usar CRAM-MD5 para se autenticar. Se este for o caso, você vai precisar chamar o phpMyAdmin e inserir uma senha em texto claro no campo 'clear' para estes usuários - isto só vai funcionar se você estiver usando o esquema proposto para a base de dados onde o campo 'clear' foi adicionado. Se você ainda não o fez, instale o certificado CA que criamos anteriormente no cliente teste. Se o certificado raiz não foi instalado como deve, podemos ter todo tipo de dor de cabeça.

Existem três scripts (de contribuição) que vêm com o PostfixAdmin. Estão no diretório /usr/share/doc/postfixadmin/ADDITIONS que são usados para deletar maildirs órfãos (endereços de email que você deleta no PostfixAdmin, mas onde os arquivos permanecem no sistema). Como mencionado anteriormente, não deletamos os maildirs automaticamente quando um usuário é removido. Como sugestão, deixe os arquivos órfãos parados por algum tempo. Um dos scripts fornecidos poderia deletar tudo se deixássemos - e isto pode não ser bom. Um dos outros dois, cleanupdirs.pl, parece ser bom, mas ainda assim não vamos permitir que delete os maildirs - só vamos usá-lo para indicar os diretórios órfãos. Também vamos trocar seu nome para maildircheck.

cp -i /usr/share/doc/postfixadmin/ADDITIONS/cleanupdirs.pl /usr/sbin/maildircheck
touch /var/log/maildircheck.log
sed -i "s|/home/vmail|/var/vmail|" /usr/sbin/maildircheck
sed -i "s/removed_maildirs.log/maildircheck.log/" /usr/sbin/maildircheck
sed -i "s/someuser/postfix/" /usr/sbin/maildircheck
sed -i "s/somepass/pfix_senha/" /usr/sbin/maildircheck
sed -i "s/      rmtree/#     rmtree/" /usr/sbin/maildircheck
sed -i "s/'\$to_delete'/\$to_delete/" /usr/sbin/maildircheck
sed -i "s/Need to delete/Orphaned/" /usr/sbin/maildircheck
chmod 700 /usr/sbin/maildircheck
cd /etc/logrotate.d
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/maildircheck.txt
mv maildircheck.txt maildircheck

info Veja o script baixado: maildircheck.

Observe que no código acima a linha 'rmtree' está comentada (anulada). Este é um ponto importante. Para testar, você precisa deletar um usuário teste através da interface PostfixAdmin e depois executar:

maildircheck

Se você deletar teste@exemplo.com, confira e garanta que o diretório de email NÃO foi deletado. Por exemplo, rode ls -l /var/vmail/exemplo.com/teste. Depois, adicione novamente o usuário. Se você insisitir e quiser usar este script para deletar os diretórios, você vai precisar tirar o "#" para 'descomentar' e linha 'rmtree'. Espero que o script funcione e que você não acabe deletando todas as caixas postais do sistema smile

Agora tenho um script opcional que deleta automaticamente as mensagens deixadas na pasta Spam de todos os usuários por mais de 24 dias. Você pode testá-lo (com menos dias) mudando temporariamente o número de dias (-mtime 0 = 1 day).

cd /etc/cron.daily
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/rmmailboxspam.txt
mv rmmailboxspam.txt rmmailboxspam
chmod +x rmmailboxspam

info Veja o script baixado: rmmailboxspam.

Gosto de bloquear a possibilidade de super administradores deletarem domínios. Isto é opcional e remove o link para 'del' o domínio:

sed -i "s|$PALANG\['del'\]|$PALANG\[''\]|" /usr/share/postfixadmin/templates/admin_list-domain.php

Para voltar a permitir esta tarefa, ou seja, se você precisar deletar um domínio com todas as suas caixas postais e aliases:

sed -i "s|$PALANG\[''\]|$PALANG\['del'\]|" /usr/share/postfixadmin/templates/admin_list-domain.php

Configurar SASL e TLS

Informe o Postfix para usar SASL AUTH (faremos um backup do main.cf só por precaução):

cp -i /etc/postfix/main.cf /etc/postfix/main.cf-before-sasl
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "broken_sasl_auth_clients = yes"
postconf -e "smtpd_sasl_auth_enable = yes"
postconf -e "smtpd_sasl_local_domain = \$myhostname"
postconf -e "smtpd_sasl_security_options = noanonymous"
postconf -e "smtpd_sasl_authenticated_header = yes"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"

Precisamos configurar master.cf. Talvez o editor do WinSCP seja mais prático. Substitua tudo entre as duas linhas em cinza:

vi /etc/postfix/master.cf
smtp      inet  n       -       -       -       -       smtpd
  -o smtpd_sasl_auth_enable=no
# -o receive_override_options=no_address_mappings
# If they want to relay, make them use port 587 (submission) or port 465 (smtps)
# If using submission port, configure client to use CRAM-MD5
submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o receive_override_options=no_address_mappings  
# Outlook and OE (and others) expect smtpd_tls_wrappermode,
# so have them submit here (port 465):
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o receive_override_options=no_address_mappings
# We will use port 4650 for clients that use STARTTLS:
4650     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o receive_override_options=no_address_mappings
#628      inet  n       -       -       -       -       qmqpd

Depois disto, é claro, faça um:

/etc/init.d/postfix restart

Neste ponto um 'postconf -n' deve mostrar algo parecido com:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
config_directory = /etc/postfix
inet_interfaces = all
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
mydestination = nome_do_host.exemplo.com, localhost.exemplo.com, localhost
mydomain = exemplo.com
myhostname = nome_do_host.exemplo.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = exemplo.com
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_tls_CAfile = /etc/ssl/certs/cacert.exemplo.com.pem
smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/ssl/private/dovecot.pem
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, hash:/etc/postfix/virtual
virtual_gid_maps = static:6060
virtual_mailbox_base = /var/vmail/
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 6060
virtual_transport = dovecot
virtual_uid_maps = static:6060

Lembre-se: o 'postconf -n' não mostra todas as configurações que temos em main.cf.

Configure uma conta IMAP no Outlook Express para pedir uma autenticação e use SMTPS (também conhecido como SSMTP) na porta 465 como saída e IMAPS (IMAP seguro) na porta 993 como entrada. Algo parecido com isto. A maioria dos outros clientes também podem usar a porta 465. Clientes que não podem usar uma porta TLS dedicada (o Postfix oferece isto via smtpd_tls_wrappermode=yes) podem usar a porta 4650 e usar STARTTLS. A porta 587 será usada para clientes incapazes de fazer com que o TLS funcione ou usarão CRAM-MD5 para encriptar a senha em texto claro.

Há um problema com o Mozilla Thunderbird. Ele tenta usar o CRAM-MD5 antes de tentar o PLAIN (texto claro). Isto resultará num alerta "SASL authentication failure: empty secret", a não ser que você entre com uma senha em texto claro para estes clientes. Se você não quiser fazer isto, você pode dar um jeito no Thunderbird ou não usar CRAM-MD5. Para apaziguar o Thunderbird, vá para Ferramentas -> Opções -> Avançado -> Geral -> Editor de config e depois dê um duplo clique em mail.smtpserver.default.trySecAuth (que é true por padrão) para transformá-lo em false.


Instalar e Configurar amavisd-new

Aqui vamos instalar o amavisd-new, Spamassassin, ClamAV, Razor e Pyzor. Depois vamos adicionar o usuário clamav ao grupo amavis. A seguir vamos remover o pacote Amavisd-new do Debian e instalar o amavisd-new a partir dos fontes. Faço isto porque havia vários bugs na versão 2.6.1 e por que fica mais fácil fazer atualizações ou aplicar patches no amavisd-new no futuro:

apt-get update
apt-get install amavisd-new spamassassin

O pacote do amavisd-new do Debian Lenny está um pouco antiquado. Na minha opinião, é mais fácil manter o amavisd-new atualizado se abrirmos mão do pacote do Debian. Com as instruções a seguir vamos continuar a usar arquivos de configuração no estilo Debian. Uma vez que estiverem preparados, não dependeremos mais da manutenção de pacotes do Debian para produzir versões atualizadas do amavisd-new. O amavisd-new é desenvolvido ativamente por Mark Martinec e novas versões são disponibilizadas com frequência.

Faça login como root. Antes de remover o amavisd-new vamos fazer cópias dos arquivos mais importantes. Você deve realizar esta operação apenas uma vez para evitar de sobre-escrever o backup dos arquivos originais. Se você tiver itens em /var/lib/amavis que sejam importantes, seria interessante fazer uma cópia deste diretório e seus sub-diretórios:

mkdir /usr/ambackup
mkdir -p /usr/ambackup/etc/init.d/
cp /etc/init.d/amavis /usr/ambackup/etc/init.d/amavis
cp -r /etc/amavis /usr/ambackup
mkdir /usr/ambackup/etc/cron.daily
cp /etc/cron.daily/amavisd-new /usr/ambackup/etc/cron.daily/amavisd-new
mkdir /usr/ambackup/etc/cron.d
cp /etc/cron.d/amavisd-new /usr/ambackup/etc/cron.d/amavisd-new
mkdir -p /usr/ambackup/usr/sbin
cp /usr/sbin/amavisd-new-cronjob /usr/ambackup/usr/sbin/amavisd-new-cronjob
mkdir -p /usr/ambackup/usr/share/amavis
cp -r /usr/share/amavis/conf.d /usr/ambackup/usr/share/amavis
cp /usr/sbin/amavisd-new /usr/ambackup/usr/sbin/amavisd-new
mkdir /usr/ambackup/usr/share/perl5
cp /usr/share/perl5/JpegTester.pm /usr/ambackup/usr/share/perl5/JpegTester.pm

Dos arquivos acima, JpegTester.pm, /usr/sbin/amavisd-new e /usr/share/amavis/conf.d/ devem ser deletados quando o amavisd-new é removido. Precisamos recuperá-los usando os backups. Podem existir outros arquivos em outros lugares que são deletados, mas eles não afetam o funcionamento do amavisd-new, ou seja, a ausência deles não vai interferir em nada. A documentação que podemos perder será reposta pelo código fonte original. Faça um teste para confirmar que, quando removemos o amavisd-new, apenas o amavisd-new será removido:

apt-get -s remove amavisd-new

Se for a única coisa que será removida, continue com:

/etc/init.d/amavis stop
apt-get remove amavisd-new

Neste ponto vamos pegar temporariamente a mesma versão do amavisd-new para que possamos continuar a processar emails. O primeiro comando deve estar numa única linha:

if ! grep -q amavis /etc/passwd; then adduser --group --system --home /var/lib/amavis --shell /bin/sh amavis; fi
cd /etc/init.d
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavis-init-20030616
mv amavis-init-20030616 amavis
chmod +x amavis
mkdir -p /usr/share/amavis/conf.d
cp /usr/ambackup/usr/share/amavis/conf.d/* /usr/share/amavis/conf.d
cp /usr/ambackup/usr/sbin/amavisd-new /usr/sbin
cp /usr/ambackup/usr/sbin/amavisd-new /usr/sbin/amavisd-new-debian
cp /usr/ambackup/usr/share/perl5/JpegTester.pm /usr/share/perl5
cp /usr/ambackup/etc/cron.daily/amavisd-new /etc/cron.daily
cp /usr/ambackup/etc/cron.d/amavisd-new /etc/cron.d
cp /usr/ambackup/usr/sbin/amavisd-new-cronjob /usr/sbin
/etc/init.d/amavis start

info Veja o script baixado: amavis init.

O pacote amavisd-new do Debian foi removido mas ainda estamos usando a maior parte dos componentes originais do pacote Debian. A principal diferença é o script de inicialização em /etc/init.d/amavis. Agora está fácil fazer o upgrade para o amavisd-new 2.6.2. Vamos instalar um amavisd.conf que simplesmente carrega todos os arquivos conf do Debian:

cd /etc/amavis
test -e amavisd.conf && mv amavisd.conf amavisd.conf-before-migration
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.conf-262.txt
mv amavisd.conf-262.txt amavisd.conf
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.conf-modified
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.conf-sample
ln -s /etc/amavis/amavisd.conf /etc/amavisd.conf
cd /usr/local/src
wget http://www.ijs.si/software/amavisd/amavisd-new-2.6.2.tar.gz
tar xzf amavisd-new-2.6.2.tar.gz
cd amavisd-new-2.6.2
cp amavisd amavisd.original
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.2.6.2.patch1.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.2.6.2.patch2.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.2.6.2.patch3.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.2.6.2.patch4.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisd.2.6.2.patch6.txt
patch -p0 < amavisd.2.6.2.patch1.txt
patch -p0 < amavisd.2.6.2.patch2.txt
patch -p0 < amavisd.2.6.2.patch3.txt
patch -p0 < amavisd.2.6.2.patch4.txt
patch -p0 < amavisd.2.6.2.patch6.txt
cp amavisd /usr/sbin/amavisd-new-2.6.2
cp amavisd /usr/sbin/amavisd-new
cp p0f-analyzer.pl /usr/sbin
test -e /usr/sbin/p0f-analyzer && mv /usr/sbin/p0f-analyzer.old
ln -s /usr/sbin/p0f-analyzer.pl /usr/sbin/p0f-analyzer
cp amavisd-nanny /usr/sbin/
cp amavisd-release /usr/sbin/
sed -i 's|/var/amavis/amavisd.sock|/var/run/amavis/amavisd.sock|' /usr/sbin/amavisd-release
sed -i 's|/var/amavis/db|/var/lib/amavis/db|' /usr/sbin/amavisd-nanny
cd /etc/amavis/conf.d
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/15-av_scanners.262.txt
cp 15-av_scanners 15-av_scanners.disabled
mv 15-av_scanners.262.txt 15-av_scanners
/etc/init.d/amavis restart
cd /etc/amavis
amavisd-new -V

info Veja os scripts baixados: amavisd.conf 262, amavisd.conf modified, amavisd.conf sample, amavisd.2.6.2 patch1, amavisd.2.6.2 patch2, amavisd.2.6.2 patch3, amavisd.2.6.2 patch4, amavisd.2.6.2 patch6 e 15-av_scanners.

O arquivo amavisd.conf-modified é um exemplo do amavisd.conf fornecido com o código fonte, mas foi modificado para ser usado no Debian. Sugiro que você leia o /etc/amavis/amavisd.conf.

Esta versão do amavisd-new pode tratar sanesecurity e MSRBL 'virusus' como spam. Se você está usando as assinaturas sanesecurity no ClamAV, faça o download de um conjunto de regras que as pontuem como spam:

cd /etc/spamassassin
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavis-sanesecurity_v2.cf
spamassassin --lint

info Veja o script baixado: amavis-sanesecurity_v2.


Se você está usando templates de notificação externos (provavelmente você está porque eles estão habilitados por default em /etc/amavis/conf.d/30-template_localization), então será preciso obter os templates próprios para o amavisd-new 2.6.2 e, se necessário, modificá-los da mesma forma como foram modificados os templates atualmente instalados. Os únicos templates disponíveis estão em inglês. Se você não costuma customizar seus templates, então anule a linha read_l10n_templates('en_US', '/etc/amavis'); no arquivo 30-template_localization transformando-a num comentário colocando # no início.

cp -r /etc/amavis/en_US /etc/amavis/en_US-backup
cd /etc/amavis/en_US
rm charset
rm template-dsn.txt
rm template-spam-admin.txt
rm template-spam-sender.txt
rm template-virus-admin.txt
rm template-virus-recipient.txt
rm template-virus-sender.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/charset
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/template-dsn.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/template-spam-admin.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/template-spam-sender.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/template-virus-admin.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/template-virus-recipient.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/template-virus-sender.txt
/etc/init.d/amavis restart

info Veja os arquivos baixados: charset, template-dsn, template-spam-admin, template-spam-sender, template-virus-admin, template-virus-recipient e template-virus-sender.

Se, por uma razão muito louca, você quiser reinstalar o amavisd-new do pacote do Debian:

/etc/init.d/amavis stop
mv /etc/amavis/amavisd.conf /etc/amavis/amavisd.conf-mybackup
rm /etc/amavisd.conf
apt-get install amavisd-new
apt-get install clamav clamav-daemon lha arj unrar nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl libmail-dkim-perl libio-socket-ssl-perl libnet-ident-perl pyzor razor
gpasswd -a clamav amavis
freshclam
/etc/init.d/clamav-daemon stop
/etc/init.d/clamav-daemon start
sa-update
cd /etc/amavis/conf.d/
sed -i 's/#@bypass_virus_/@bypass_virus_/' 15-content_filter_mode
sed -i 's/#   \\%bypass_vi/   \\%bypass_vi/' 15-content_filter_mode
sed -i 's/#@bypass_spam_/@bypass_spam_/' 15-content_filter_mode
sed -i 's/#   \\%bypass_s/   \\%bypass_s/' 15-content_filter_mode
cat 15-content_filter_mode
/etc/init.d/amavis restart

atencao Nota: durante o tempo em que o amavisd-new está reiniciando, os emails não podem ser entregues a ele. Note também que o amavisd-new pode não estar apto a usar o socket UNIX em /var/run/clamav/clamd.ctl antes do clamd ter carregado completamente a base de dados com definições de vírus. Quando este servidor estiver recebendo e enviando mensagens, durante a reinicialização do amavisd-new o Postfix pode reclamar com "connect to localhost[127.0.0.1]: Connection refused". O Postfix vai segurar estes emails por cerca de 15 minutos. Para apressar as coisas, uma pessoa impaciente pode executar 'postfix flush' para limpar a fila de deferidos (deferred queue) - só que eu não faria isto.

Vamos instalar um script que executa sa-update:

cd /usr/sbin
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/sa-update1.sh.txt
mv sa-update1.sh.txt sa-update.sh
chmod +x sa-update.sh
sa-update.sh

info Veja o script baixado: sa-update1.sh.

Você só vai precisar rodar este script uma vez por semana. Coloque uma entrada no crontab (na primeira linha disponível):

crontab -e

Substitua MM com um número entre 0 e 59 e HH com um número entre 0 e 23:

MM HH * * 7 /usr/sbin/sa-update.sh

Como temos o módulo Perl Mail::DKIM instalado, opcionalmente podemos habilitar o plugin DKIM do SpamAssassin

vi /etc/spamassassin/v312.pre

e descomentar o plugin:

loadplugin Mail::SpamAssassin::Plugin::DKIM

Salve o arquivo e saia, depois rode --lint:

su amavis -c 'spamassassin --lint'

Agora vi /etc/amavis/conf.d/50-user e insira o texto abaixo no meio do arquivo (precisa ficar entre "use strict;" e "1;"). Talvez seja mais prático você usar o editor do WinSCP por que o vim tende a comentar (#) este texto quando ele for colado. Se você ainda estiver no WinSCP, clique no ícone refresh para que o diretório /etc/amavis seja mostrado. Edite @local_domains_maps e inclua todos os seus domínios. Também dê uma olhada em @mynetworks para ver se precisa ser modificado. Você provavelmente vai querer deixar sua rede temporariamente fora do @mynetworks durante os testes (assim você vai poder enviar spam para testar os destinatários):

# nice to have $log_level (1-5) available:
$log_level = 0;

# If sender matches ACL, turn debugging fully up, just for this one message
#@debug_sender_maps = ( ["test\@$mydomain"] );

# let the amavisd program use the appropriate data type in SQL commands
$sql_allow_8bit_address = 1;

# explicitly set $mydomain and $myhostname:
$mydomain = 'exemplo.com';
$myhostname = 'nome_do_host.exemplo.com';

# when amavisd-new sends notifications, they appear to come from here:
$mailfrom_notify_admin     = "postmaster\@$mydomain";
$mailfrom_notify_recip     = "postmaster\@$mydomain";
$mailfrom_notify_spamadmin = "postmaster\@$mydomain";
$hdrfrom_notify_sender = "amavisd-new ";

$notify_method = 'smtp:[127.0.0.1]:10035'; # where to submit notifications

# Set number of processes. Rough guide for dual processor, 1GB = 6, 2GB = 12, 4GB = 24
# You MUST also change maxproc for the smtp-amavis transport to match this number, e.g:
# smtp-amavis unix -      -       n       -       5  smtp
# However, if using MailZu to release mail on a very busy server, it may be necessary
# to have the $max_servers number 1 greater than maxproc. This will leave a spare 
# amavisd-new process waiting for release requests. This may waste some memory, but
# this may avoid some problems releasing mail from quarantine.
$max_servers = 6;

# Note: If you need to set maxproc > 20, instead use:
# smtp-amavis_destination_concurrency_limit = 
# in /etc/postfix/main.cf and set the smtp-amavis transport like so:
# smtp-amavis unix -      -       n       -       -  smtp

# We discard (and quarantine) viruses, discard (and quarantine) spam (>= kill_level), 
# bounce (and quarantine) banned files and pass bad headers:
$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_BOUNCE;
$final_spam_destiny       = D_DISCARD;
$final_bad_header_destiny = D_PASS;

# disable DKIM - for now
$enable_dkim_verification = 0;  # enable DKIM signatures verification
$enable_dkim_signing = 0;    # load DKIM signing code, keys defined by dkim_key

# don't quarantine bad headers (no need since we pass them all):
$bad_header_quarantine_to = undef;

# Spam gets the Subject line prepended with:
$sa_spam_subject_tag = 'Spam> ';

# We tag all headers (for 'local' domains) with X-Spam info:
$sa_tag_level_deflt = undef;

# This is the system default spam tag level that will be overridden by user's preferences in MySQL
$sa_tag2_level_deflt = 6.31;

## For relay domains not set up in MySQL you can create a static domain wide (or individual) map: 
#@spam_tag2_level_maps = (
#  { 'postmaster@exemplo.net' => 99.0,
#    '.exemplo.net' => 8.0,
#    '.exemplo.org' => 6.0 },
#  \$sa_tag2_level_deflt,   # catchall default
#);

# The default is to not quarantine any spam (outside of what users get in their Spam folder), 
# so set default kill_level high. Users can choose their own kill_level however. kill_level
# will trigger quarantining (to MailZu).
$sa_kill_level_deflt = 9999;

## Once again, relay domains may want something different:
#@spam_kill_level_maps = (
#  { 'postmaster@exemplo.net' => 99.0,
#    '.exemplo.net' => 8.0,
#    '.exemplo.org' => 10.0 },
#  \$sa_kill_level_deflt,   # catchall default
#);

## And some relay domains may wish to quarantine up to a certain level, then discard:
#@spam_quarantine_cutoff_level_maps = (
#  { '.exemplo.net' => 20.5,   
#    '.exemplo.org' => 25 },
#  \$sa_quarantine_cutoff_level,   # catchall default (currently undef)
#);

# We will quarantine viruses to /var/lib/amavis/virusmails (the default).
# We will use a cron job to automatically delete these files older than 14 days from the quarantine.
# We can use amavisd-release or MailZu to release quarantined messages. We warn the recipients
# and expect them to contact us (via the MailZu interface) if they need a banned file released.
# Each domain can have their own administrators.
@virus_admin_maps = ({
    '.exemplo.com' => 'postmaster@exemplo.com',
    '.exemplo.net' => 'postmaster@exemplo.net',
    '.' => 'postmaster@exemplo.com',
    });
@banned_admin_maps = ({
    '.exemplo.com' => 'postmaster@exemplo.com',
    '.exemplo.net' => 'postmaster@exemplo.net',
    '.' => 'postmaster@exemplo.com',
    });
$warnbannedrecip = 1;
$defang_banned = 1;
$defang_virus  = 1;

# list domains in an external file (created by local_domains.sh script):
@local_domains_maps = ( read_hash("$MYHOME/local_domains") );

# Since we configured SQL, we can use penpals feature:
$penpals_bonus_score = 5;
$penpals_threshold_low = 1;
$penpals_threshold_high = 18;

# We are going to create policy banks that will notify us of internally created spam
# but also let banned files out (provided they are compressed).

@mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10
                   10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 );

$inet_socket_port = [10024, 10026]; 
## If using Mailzu, use this instead:
#$inet_socket_port = [10024, 10026, 9998]; 

$inet_socket_bind = '127.0.0.1';
## If using Mailzu, use this instead:
#$inet_socket_bind = undef;

## Interface to MailZu
#$interface_policy{'9998'} = 'MAILZU';
#$policy_bank{'MAILZU'} = {
#    protocol => 'AM.PDP',
#    inet_acl => [qw( 127.0.0.1 [::1] 111.111.111.111 )],
#};

# If using MailZu, store banned files and spam to MySQL if you want to give users the
# ability to read those messages in the MailZu interface:
#$banned_files_quarantine_method = 'sql:';
#$spam_quarantine_method         = 'sql:';

# We create a custom set of banned rules for the MYNETS and TRUSTED policy
# banks. See also the 'DEFAULT' $banned_filename_re settings in 20-debian_defaults
%banned_rules = (
 'BLOCK_EXE' =>  new_RE(
    # block double extensions in names:
      qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i,
    # allow any name or type (except viruses) within an archive:
      [ qr'^\.(Z|gz|bz2|rpm|cpio|tar|zip|rar|arc|arj|zoo)$' => 0],
    # blocks MS executable file(1) types, unless allowed above:
      qr'^\.(exe|exe-ms)$',
    ),
 'DEFAULT' => $banned_filename_re,
);				   

$policy_bank{'MYNETS'} = {  # mail originating from @mynetworks
  originating => 1,
  os_fingerprint_method => undef,
  spam_admin_maps  => ["postmaster\@$mydomain"], # alert of internal spam
  final_spam_destiny => D_BOUNCE, # so the sender knows they are a spammer  
  spam_kill_level_maps => [9.0],
  spam_dsn_cutoff_level_maps => [9999],
  spam_dsn_cutoff_level_bysender_maps => [9999],
  banned_filename_maps => ['BLOCK_EXE'],
};

# Note about spam_kill_level_maps in policy banks: the recipient's
# spam_kill_level is overridden (ignored). This may cause unexpected
# results, such as quarantining or passing of spam. In the two policy
# banks shown here, this would only apply to mail sent from trusted users
# (who typically would not send spam).

$interface_policy{'10026'} = 'TRUSTED';
$policy_bank{'TRUSTED'} = {  # mail originating from trusted senders
  originating => 1,
  os_fingerprint_method => undef,
  spam_admin_maps  => ["postmaster\@$mydomain"], # alert of internal spam
  final_spam_destiny => D_BOUNCE, # so the sender knows they are a spammer
  spam_kill_level_maps => [9.0],
  spam_dsn_cutoff_level_maps => [9999],
  spam_dsn_cutoff_level_bysender_maps => [9999],
  banned_filename_maps => ['BLOCK_EXE'],
};

# Here we set up access to MySQL data:
@lookup_sql_dsn = ( ['DBI:mysql:amavis:localhost', 'amavis', 'amavis_senha'] );
@storage_sql_dsn = @lookup_sql_dsn;

# disable quarantine subdirectories
$quarantine_subdir_levels = undef;

# Note: If you quarantine items locally (the default), you might also need to create a script
# to eventually delete old quarantined items. Look to /etc/cron.daily/rmvirusquar as an example

# required because we set msgs.time_iso to type TIMESTAMP (required by MailZu)
$timestamp_fmt_mysql = 1;

# specific to the amavisnewsql SquirrelMail plugin
$sql_select_white_black_list = 'SELECT wb FROM wblist'.
  ' WHERE (rid=?) AND (wblist.email IN (%k))'.
  ' ORDER BY wblist.priority DESC';

# we may need to add items to this  
@additional_perl_modules = qw(
);  

#----------------------------------------------------------

Agora vamos criar o esquema MySQL para o amavisd-new. Este esquema é uma combinação do esquema do amavisd-new recomendado e do esquema fornecido junto com o plugin amavisnewsql do SquirrelMail:

cd
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavis-260-sqmail.sql.txt
sed -i "s/BY 'password'/BY 'amavis_senha'/" amavis-260-sqmail.sql.txt
chmod 600 amavis-260-sqmail.sql.txt
mysql -u root -p < amavis-260-sqmail.sql.txt

info Veja o script baixado: amavis-260-sqmail.sql.

Foi pedida a senha senha_do_root. Proteja o Secure 50-user (para proteger a senha do MySQL):

chmod 640 /etc/amavis/conf.d/50-user

Vamos criar um script que vai tirar uma lista de nossos domínios de uma tabela do PostfixAdmin:

vi /usr/sbin/local_domains.sh

Insira o seguinte (isto são duas linhas - a linha 2 pode ultrapassar o fim da linha)

#!/bin/bash
mysql -u postfix -ppfix_senha postfix -B -N -e "select concat('.',domain) from domain" >/var/lib/amavis/local_domains

Salve o arquivo. Depois:

chmod 700 /usr/sbin/local_domains.sh
local_domains.sh
cat /var/lib/amavis/local_domains

Nossos domínios devem ser listados num arquivo. Vamos adicionar este script ao PostfixAdmin de modo que ele seja atualizado toda vez que adicionarmos ou removermos um domínio. Precisamos colocar mais uma entrada em /etc/sudoers para que o usuário www-data possa executar este script:

visudo

Insira no fim do arquivo (mais uma vez cuidado com o nome do host):

www-data nome_do_host=NOPASSWD: /usr/sbin/local_domains.sh

Agora vamos aplicar um patch no PostfixAdmin para que ele use este script:

cd /usr/share/postfixadmin
cp delete.php delete.php.original
cp create-domain.php create-domain.php.original
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/domain.patch.v2.txt
patch -p0 < domain.patch.v2.txt

info Veja o patch baixado: domain.patch.v2.

Você deveria dedicar alguns minutos para se convencer de que isto funciona. Remova /var/lib/amavis/local_domains, faça login no PostfixAdmin e edite um domínio (você precisa logar como super-admin para poder editar domínios). Assegure-se de que /var/lib/amavis/local_domains foi criado como esperado, depois:

/etc/init.d/amavis restart

Instale alguns scripts de manutenção para evitar que a base de dados do amavis cresça para sempre (mensagens com mais de 24 dias são deletadas). Se ela não parar de crescer, você ou eu cometemos algum erro:

cd /usr/sbin
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/trim-amavis-msgs.txt
mv trim-amavis-msgs.txt trim-amavis-msgs
sed -i 's/Passw0rd/amavis_password/' trim-amavis-msgs
chmod 750 trim-amavis-msgs
cd /etc
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/trim-amavis.sql.txt
mv trim-amavis.sql.txt trim-amavis.sql
cd /etc/cron.daily/
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/trim-amavis.txt
mv trim-amavis.txt ztrim-amavis
sed -i 's/password/amavis_password/' ztrim-amavis
chmod 750 ztrim-amavis
./ztrim-amavis

info Veja os scripts baixados: trim-amavis-msgs, trim-amavis.sql e trim-amavis.

Agora configure o Postfix para que use o amavisd-new. Vou mostrar as NOVAS alterações feitas no master.cf em vermelho. Não esqueça de casar maxproc para o transporte smtp-amavis com $max_servers. Observe também que há números de portas diferentes envolvidas nos content_filter overrides. Talvez seja melhor usar o WinSCP para fazer as alterações, senão use o vi:

vi /etc/postfix/master.cf
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       -       -       -       smtpd
  -o smtpd_sasl_auth_enable=no
  -o content_filter=smtp-amavis:[127.0.0.1]:10024
# -o receive_override_options=no_address_mappings
# If they want to relay, make them use port 587 (submission) or port 465 (smtps)
# If using submission port, configure client to use CRAM-MD5
submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o content_filter=smtp-amavis:[127.0.0.1]:10026
# -o receive_override_options=no_address_mappings
# Outlook and OE (and others) expect smtpd_tls_wrappermode,
# so have them submit here (PORT 465):
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o content_filter=smtp-amavis:[127.0.0.1]:10026
# -o receive_override_options=no_address_mappings
# We will use port 4650 for clients that use STARTTLS:
4650     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o content_filter=smtp-amavis:[127.0.0.1]:10026
# -o receive_override_options=no_address_mappings
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
  -o content_filter=

[... tem mais coisas aqui, mas não precisa editar ...]

# Insira no final e ajuste maxproc diferente de 5 se necessário:
#
smtp-amavis unix -    -    n    -    5    smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes

127.0.0.1:10025 inet n    -    n    -    -    smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks, no_unknown_recipient_checks, no_milters

# port 10035 is where amavisd-new sends notifications
127.0.0.1:10035 inet n    -    n    -    -    smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks, no_unknown_recipient_checks, no_milters

Terminada a edição, reinicie o postfix:

/etc/init.d/postfix restart

Configure o Pyzor para usar um mirror:

pyzor discover
su amavis -c 'pyzor discover'
echo "82.94.255.100:24441" > /var/lib/amavis/.pyzor/servers
echo "82.94.255.100:24441" > /root/.pyzor/servers
su amavis -c 'pyzor ping'

O Ping do Pyzor deve mostrar 'OK'. Se não, então é possível que seu firewall esteja bloqueando respostas UDP de 82.94.255.100.

O SpamAssassin, por padrão, vai tentar descobrir automaticamente quais cabeçalhos recebidos foram inseridos por servidores de email da sua rede e quais foram inseridos por servidores de email fora da sua rede. Entretanto, por uma questão de segurança, é melhor configurar manualmente o caminho confiável (trust path). Os endereços IP listados em internal_networks e trusted_networks devem ser os endereços IP (ou endereços de rede) de hosts da sua rede. Se você estiver atrás de uma box NAT, isto incluirá sua rede interna, sua rede pública e a interface loopback. Se mensagens são supridas (relay) para você por um terceiro de confiança (pode ser que você use algo como Postini para filtrar suas mensagens), então estes servidores devem ser adicionados a trusted_networks (mas não a internal_networks).

vi /etc/spamassassin/local.cf

Aqui está um exemplo do que deve ser inserido:

# determinar explicitamente nossas redes internas (pode ser o mesmo ou semelhante ao mynetworks)
clear_internal_networks
internal_networks 222.222.222.222/24
internal_networks 10.10.10.10/24
# adicionar o mesmo a trusted_networks e, possivelmente, outros computadores/redes nos quais confiamos
clear_trusted_networks
trusted_networks 222.222.222.222/24
trusted_networks 10.10.10.10/24

Sempre lint o SpamAssassin depois de modificar ou adicionar arquivos:

spamassassin --lint

Assim que você tiver configurado corretamente estas opções:

/etc/init.d/amavis restart
tail -f /var/log/mail.log

Teste enviando uma mensagem e observando o mail.log. O processamento da mensagem pode levar de 1 a 30 segundos (ou até mais). Se você obtiver erros do clamd, faça um /etc/init.d/clamav-daemon stop, espere um momento e faça um /etc/init.d/clamav-daemon start. Depois espere um minuto antes de continuar.

Eu coloco os vírus numa quarentena local em /var/lib/amavis/virusmails por 14 dias, depois são deletados. Se você quiser realizar esta tarefa de deleção, pegue meu script:

cd /etc/cron.daily
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/rmvirusquar.txt
mv rmvirusquar.txt rmvirusquar
chmod +x rmvirusquar
./rmvirusquar

info Veja o script baixado: rmvirusquar.

Criar tabelas Bayes e AWL no MySQL

Colocar dados Bayes e AWL no MySQL vai aumentar a carga no servidor MySQL, mas, como você foi razoavelmente generoso com innodb_buffer_pool_size e innodb_log_file_size, a performance do Bayes vai ser muito aumentada (faça isto por partes):

cd /etc/spamassassin/
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/gv-bayes-awl.sql.txt
sed -i 's/paSSw0rd/sa_password/' gv-bayes-awl.sql.txt
mysql -u root -p < gv-bayes-awl.sql.txt

Entre a senha_do_root para completar o processo.

rm gv-bayes-awl.sql.txt
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/local.cf-bayes-awl.txt
cp local.cf local.cf-before-mysql
cat local.cf-bayes-awl.txt local.cf-before-mysql > local.cf
sed -i 's/paSSw0rd/sa_senha/' local.cf
chmod 0640 local.cf
chown root:amavis local.cf
spamassassin --lint
/etc/init.d/amavis restart
cd
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/sample-spam.txt
sa-learn --spam sample-spam.txt
sa-learn --dump magic
spamassassin --lint

Isto deve mostrar que a contagem de nspam (número de spams) é 1 e o --lint não deve mostrar erros ou alertas.

info Veja os scripts baixados: gv-bayes-awl.sql, local.cf-bayes-awl e sample-spam.

Também precisamos criar o diretório .spamassassin e o arquivo user_prefs:

su amavis -c 'spamassassin 

Continuamos adicionando um script de manutenção AWL e bayes_seen (fique de olho nos erros):

cd /etc
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/trim-awl.sql.txt
mv trim-awl.sql.txt trim-awl.sql
cd /usr/sbin
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/trim-awl.txt
mv trim-awl.txt trim-awl
sed -i 's/paSSw0rd/sa_senha/' trim-awl
chmod 0750 trim-awl
cd /etc/cron.weekly/
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/trim-sql-awl-weekly.txt
mv trim-sql-awl-weekly.txt trim-sql-awl-weekly
chmod +x trim-sql-awl-weekly
./trim-sql-awl-weekly

info Veja os scripts baixados: trim-awl.sql, trim-awl e trim-sql-awl-weekly.

Mais uma vez garanta que o amavisd-new está processando as mensagens. Envie pelo menos uma mensagem como teste e depois verifique os cabeçalhos da mensagem recebida. Ela deve mostrar cabeçalhos X-Spam e coisas do tipo. Ela ainda não vai mostrar qualquer BAYES hits (pontuação Bayes) - o Bayes precisa primeiro aprender com pelo menos umas 200 mensagens ham (não spam). Eu uso autolearn (autoaprendizado), com uma alimentação manual ocasional para sa-learn. Não vou explicar outras formas de alimentar o SpamAssassin com spam e ham neste HOWTO - veja man sa-learn. O plugin Spam Buttons para o SquirrelMail permite que os usuários marquem mensagens como 'Spam' ou 'Not Spam' e, com isto, alimenta o sa-learn; mas é bom lembrar que numa base de dados que dá suporte a todo(s) o(s) site(s), "o lixo de um é o tesouro do outro" e que "cozinheiros demais estragam o refeição". Além disto, precisamos considerar uma carga adicional imposta ao servidor - o sa-learn é CPU intensivo.

Seria uma boa ideia testar o clamd. Depois de desabilitar temporariamente o antivírus no seu desktop, envie uma mensagem de teste contendo APENAS a string eicar no corpo da mensagem (absolutamente sem nenhum espaço em branco antes ou depois da string). Você pode parar o amavisd-new e fazer um debug com 'amavisd-new debug' ou 'amavisd-new sa-debug', ou você pode elevar o nível do $log_level ou configurar temporariamente o @debug_sender_maps.


Configurar e personalizar o SquirrelMail

Informe o apache2 para usar o SquirrelMail:

echo "Include /etc/squirrelmail/apache.conf" >> /etc/apache2/apache2.conf

Vamos configurar a URL do SquirrelMail como https://nome_do_host.exemplo.com/mail/, ou seja:

cd /etc/squirrelmail/
sed -i "s|Alias /squirrelmail|Alias /mail|" apache.conf
sed -i "s|allow from 127.0.0.1|allow from 666.666.666.666|" apache.conf
/etc/init.d/apache2 restart

O endereço IP 'allow from' é o endereço IP address do seu computador (como o servidor de email o vê). Faça o download de alguns plugins:

cd /usr/share/squirrelmail/plugins/
wget http://www.squirrelmail.org/plugins/check_quota-1.4-re-1.2.7.tar.gz
tar xzf check_quota-1.4-re-1.2.7.tar.gz
cp check_quota/config.php.sample check_quota/config.php
wget http://www.squirrelmail.org/plugins/timeout_user-1.1.1-0.5.tar.gz
tar xzf timeout_user-1.1.1-0.5.tar.gz
wget http://www.squirrelmail.org/plugins/compatibility-2.0.9-1.0.tar.gz
tar xzf compatibility-2.0.9-1.0.tar.gz
wget http://www.squirrelmail.org/plugins/amavisnewsql-0.8.0-1.4.tar.gz
tar xzf amavisnewsql-0.8.0-1.4.tar.gz
mkdir /var/lib/amavis/.notstored
chown -R amavis:amavis /var/lib/amavis
sed -i 's/minutes = 120;/minutes = 20;/' timeout_user/config.php
cd amavisnewsql
cp config.php.dist config.php
sed -i 's|pgsql://postgres:@localhost|mysql://amavis:amavis_senha@localhost|' config.php
sed -i 's|"yourdomain.com"|"exemplo.com"|' config.php
sed -i 's|use_quarantine"] = true|use_quarantine"] = false|' config.php
sed -i 's|http://webmail.yourdomain.com|https://nome_do_host.exemplo.com/mail|' config.php
sed -i 's|noreply@yourdomain.com|noreply@exemplo.com|' config.php
sed -i 's|/htdocs/squirrel/|/usr/share/squirrelmail/|' utils/cleanquarantine.php
sed -i 's|/htdocs/squirrel/|/usr/share/squirrelmail/|' utils/generatedigest.php
sed -i 's|/htdocs/squirrel/|/usr/share/squirrelmail/|' utils/process_bsmtp.php
sed -i 's|/var/virusmails|/var/lib/amavis/virusmails|' utils/process_bsmtp.php
chown -R root:root /usr/share/squirrelmail/plugins/amavisnewsql
chmod 644 *
chmod 755 contrib htmlMimeMail-2.5.1 locale po utils
chmod 640 contrib/*
chmod 640 htmlMimeMail-2.5.1/*
chmod 640 utils/soap/*
chmod 640 utils/*php
chmod 640 utils/*sql
chmod 640 config.php
chown root:www-data config.php

Fizemos algumas configurações no amavisnewsql. Desligamos sua função (quebrada) de quarentena (e por que está quebrada enviaríamos spam para uma pasta ou para MailZu). Agora vamos vamos dar uma higienizada no que os usuários poderão entrar nos níveis tag2_level e kill_level e modificar parte do texto que os usuários poderão ver. Também adicionei a possibilidade dos usuários definirem o nível spam_quarantine_cutoff_level, o que lhes dá a opção de descartar spam com notas altas. Novos usuários serão adicionados à base de dados quando fizerem login no SquirrelMail e vão para Options->SpamAssassin Configuration.

wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/amavisnewsql.patch1.txt
sed -i 's/host.domain.tld/nome_do_host.exemplo.com/' amavisnewsql.patch1.txt
cp -p functions.php functions.php.original
cp -p amavisnewsql.class.php amavisnewsql.class.php.original
cp -p amavisnewsql.php amavisnewsql.php.original
patch -p0 < amavisnewsql.patch1.txt

info Veja o patch baixado: amavisnewsql.patch1.

Agora inicie a configuração (dica: entre squ[Tab]). Navegue para os intens abaixo a partir do menu principal (main menu):

squirrelmail-configure
1. Organization preferences.
 1. Organization Name Minha Empresa Ltda
 7. Provider link https://nome_do_host.exemplo.com/mail/

R Return to Main Menu

4. General Options
 5. Usernames in Lowercase true
 7. Hide SM attributions true
 10. Allow server thread sort true
 11. Allow server-side sorting true

R Return to Main Menu

D. Set pre-defined settings for specific IMAP servers dovecot

R Return to Main Menu

8. Plugins
 Plugins
  Installed Plugins
   1. amavisnewsql
   2. check_quota
   3. timeout_user

S Save data
Q Quit

A esta altura você deve poder testar este setup. Se não conseguir abrir esta página, cheque /etc/squirrelmail/apache.conf para conferir a permissão de acesso a configtest.php para o seu endereço IP. Chame https://nome_do_host.exemplo.com/mail/src/configtest.php

Se você estiver preocupado com o alerta "Magic Quotes", você pode corrigí-lo com:

sed -i "s/magic_quotes_gpc = On/magic_quotes_gpc = Off/" /etc/php5/apache2/php.ini
/etc/init.d/apache2 restart

Busque seu site SquirrelMail e faça login com sua conta (e com uma conta teste):

https://nome_do_host.exemplo.com/mail/

Se aparecer o erro "Preference file, /teste@exemplo.com.pref.tmp, could not be opened.", isto significa que este usuário precisa ir para Options e Personal Information e fornecer seu nome e endereço de email. Quando você adiciona usuários usando o PostfixAdmin, o arquivo de preferências em /var/lib/squirrelmail/data/ deve ser criado automaticamente pelo script mail_profile.sh.

Em algum momento, sem dúvida alguma, você vai querer substituir a logo do SquirrelMail pela sua. Coloque-a em /usr/share/squirrelmail/images/ e altere seu tamanho como requerido na página "Organization preferences".


Configurar o Razor

cd
rm /etc/razor/razor-agent.conf
razor-admin -create
razor-admin -create
razor-admin -register

Se você obtiver o erro 'error: Error 202' quando fizer o register (e o processo é abortado), você vai precisar executar o comando 'razor-admin -register' várias vezes. Não se preocupe se /etc/razor/razor-agent.conf não existe. Aqui desabilitamos os logs e depois damos ao amavisd-new uma cópia dos arquivos do razor:

sed -i 's/= 3/= 0/' /root/.razor/razor-agent.conf
cp -r /root/.razor /var/lib/amavis
chown -R amavis:amavis /var/lib/amavis
cat /var/lib/amavis/.razor/razor-agent.conf | grep debuglevel

Confira se o debuglevel está mostrando 0.

Instalar o pflogsumm

apt-get install pflogsumm
cd /etc/cron.daily
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/pflogsumm.sh
sed -i 's|DAILY mail|DAILY nome_do_host mail|' pflogsumm.sh
mv pflogsumm.sh pflogsumm
chmod +x pflogsumm

info Veja o script baixado: pflogsumm.sh.

Depois certifique-se de que você tem uma caixa postal (ou alias) para o root. O root vai receber um relatório todas as manhãs após as 06:25 horas. Dica: cat /etc/crontab.

Existe um problema com o relatório. Todo email que for enviado para o amavisd-new (o que inclui a maior parte dos emails que não são rejeitados na porta da frente) também retorna do amavisd-new. Isto significa que o Postfix vê os emails duas vezes e, por isto, eles são listados duas vezes no relatório. Para os que tiverem interesse, existem vários scripts que pre-processam os arquivos de log para prevenir entradas no amavis no relatório: http://web.tiscali.it/postfix/prepflog.html e http://www.caspergasper.com/spam.shtml.

Instalar o BIND

apt-get install bind9
/etc/init.d/bind9 stop
sed -i 's|"-u bind"|"-u bind -t /var/lib/named"|' /etc/default/bind9
mkdir -p /var/lib/named/etc
mkdir /var/lib/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run
mv /etc/bind /var/lib/named/etc
ln -s /var/lib/named/etc/bind /etc/bind
mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8
chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random
chown -R bind:bind /var/lib/named/var/*
chown -R bind:bind /var/lib/named/etc/bind
/etc/init.d/bind9 start
lsof -i | grep :domain
tail -27 /var/log/syslog

O resultado dos dois últimos comandos deve mostrar que o 'named' está rodando sem erros. Agora criamos um novo /etc/resolv.conf com o endereço IP do servidor seguido pelo endereço IP do DNS primário:

cp /etc/resolv.conf /etc/resolv.conf-old
echo "search exemplo.com" > /etc/resolv.conf
echo "nameserver 111.111.111.111" >> /etc/resolv.conf
echo "nameserver 444.444.444.444" >> /etc/resolv.conf

Reinicie o bind9. Neste ponto, você verá alguns erros - ainda temos trabalho pela frente:

/etc/init.d/bind9 restart
lsof -i | grep :domain
tail -27 /var/log/syslog

A esta altura configuramos o bind9 como um servidor de nomes apenas como cache local. Aqui vamos tomar algumas medidas de segurança adicionais para evitar que máquinas não autorizadas usem nosso servidor de nomes:

vi /etc/bind/named.conf.options

Na linha abaixo de "directory" vamos adicionar uma linha que restringe o uso do nosso servidor de nomes à rede onde se encontra nosso servidor de email. Coloque um [Tab] na frente da entrada para que a entrada fique alinhada com as outras já existentes. Você pode adicionar mais de uma rede se assim o quiser. Coloque um ; (ponto e vírgula) após cada rede. Note que, se você quiser permitir que outros clientes se conectem ao servidor de nomes, de acordo com a explicação dada acima você também precisa modificar as tabelas de IP para dar esta permissão.

allow-query {222.222.222.222/24;};

Precisamos suprimir alguns logs:

vi /etc/bind/named.conf

Insira abaixo do primeiro conjunto de comentários:

logging {
category lame-servers {null; };
category edns-disabled { null; };
};

Salve o arquivo e saia. Depois é bom reinicializar o bind9 para checar se está rodando sem problemas:

/etc/init.d/bind9 restart
lsof -i | grep :domain

Vamos receber uma porção de entradas relacionadas à 'RFC 1918 response' a não ser que as zonas RFC 1918 sejam incluídas:

vi /etc/bind/named.conf.local

Remova as marcas de comentário "// " presentes no início desta opção:

// include "/etc/bind/zones.rfc1918";

Depois reinicie o bind9 e cheque por erros:

/etc/init.d/bind9 restart
lsof -i | grep :domain
tail -27 /var/log/syslog

Opcionalmente configure o bind9 como um servidor de redespacho (forward). O bind9, como está configurado agora, primeiro vai consultar os servidores raiz (root servers) para obter informações quando necessário. Você pode preferir redespachar as consultas (queries) para outro servidor DNS. Existem vantagens e desvantagens se você fizer esta opção. Existem duas razões principais para não usar o forward. A primeira é que o ClamAV usa o DNS para checar atualizações. É possível que, se você depender do servidor DNS externo para checar o servidor DNS do ClamAV, as informações recebidas não estejam atualizadas. A outra razão tem a ver com as DNSBLs da spamhaus.org. Se você usar o servidor DNS de outros (seu provedor, por exemplo), todas as queries deste servidor DNS são contadas como vindas de um único local e o número total de conexões com os servidores da spamhaus pode ser excessivo, fazendo com que você perca este serviço gratuito.

É absolutamente imperativo que qualquer servidor de nomes que você usar como forwarder seja conhecido pelo seu servidor de email. Estes, com grande probabilidade, serão os servidores primário e secundário que você configurou previamente em /etc/resolv.conf ou os servidores do seu ISP (provedor) e não 127.0.0.1 ou o endereço IP da sua máquina local. Eles devem apontar para servidores de nomes reais e não um proxy DNS como o roteador de banda larga Linksys ou outro dispositivo gateway (a não ser que este proxy não permita o acesso a servidores de nomes fora da sua rede - o que às vezes é o caso). Adicione a entrada 'forwarders' logo depois da entrada 'allow-query' que acabamos de fazer:

vi /etc/bind/named.conf.options

Adicione:

forwarders {444.444.444.444; 555.555.555.555;};

Para nunca solicitar os servidores raiz, adicione opcionalmente:

forward only;

Depois reinicie o bind9 e cheque os erros:

/etc/init.d/bind9 restart
lsof -i | grep :domain
tail -27 /var/log/syslog

Adicionamos um novo usuário em /etc/passwd, então forneça uma cópia ao Postfix:

LINUX2

Confira se estamos aptos para resolver nomes:

dig yahoo.com

Na ANSWER SECTION você deve ver alguns registros A com endereços IP e, perto do fianl, SERVER: deve ser este servidor.


Configurações adicionais do Postfix

Algumas destas linhas são muito longas, por isto é melhor copiar e colar as seções inteiras. Se você precisar editar tudo, cole o texto no Bloco de Notas com a quebra de linha desativada.

postmap /etc/postfix/sender_access
postmap /etc/postfix/rbl_client_exceptions
postmap /etc/postfix/rbl_sender_exceptions
postmap /etc/postfix/rbl_recipient_exceptions
touch /etc/postfix/reject_over_quota
postmap /etc/postfix/reject_over_quota
cp /etc/postfix/main.cf /etc/postfix/main.cf-changes
postconf -e "smtpd_hard_error_limit = 10"
postconf -e "smtpd_soft_error_limit = 8"
postconf -e "smtpd_helo_required = yes"
postconf -e "smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access, reject_non_fqdn_sender, reject_unknown_sender_domain"
postconf -e "smtpd_data_restrictions = reject_unauth_pipelining"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_unlisted_recipient, check_recipient_access hash:/etc/postfix/reject_over_quota, check_sender_access hash:/etc/postfix/rbl_sender_exceptions, check_client_access hash:/etc/postfix/rbl_client_exceptions, check_recipient_access hash:/etc/postfix/rbl_recipient_exceptions, reject_rbl_client sbl-xbl.spamhaus.org"
postconf -e "mydestination = "
postconf -e "local_transport = error:no local mail delivery"
/etc/init.d/postfix restart
tail -f /var/log/mail.log

Envie outra mensagem de teste para garantir que nada foi quebrado. Você pode usar sender_access para colocar remetentes na lista branca que podem ser rejeitados por reject_non_fqdn_sender ou reject_unknown_sender_domain. Você pode usar rbl_sender_exceptions e/ou rbl_client_exceptions para colocar na lista branca os que são rejeitados pelo sbl-xbl.spamhaus.org. O rbl_recipient_exceptions é para os destinatários que quiserem se desvincular das checagens RBL (postmaster e abuse, por exemplo). As configurações a seguir não se relacionam com o UCE.

Se, e apenas se, o endereço IP que você apresenta ao mundo não for o endereço IP deste servidor (você está configurado para rodar atrás de um firewall NAT ou um servidor proxy), por favor configure proxy_interfaces (1.2.3.4 representa o endereço IP público):

postconf -e "proxy_interfaces = 1.2.3.4"

Futuramente, se você tiver clientes na rede local que vão usar este servidor como servidor SMTP de saída, pode ser que você precise configurar $mynetworks. Cliente em mynetworks vão ignorar a restrição reject_unauth_destination e, por isto, estarão autorizados a fazer relay para domínios diferentes do nosso. Você pode usar mynetworks ou a autenticação SASL. Ainda não configuramos $mynetworks até agora por que, durante os testes, é melhor não ser um membro de $mynetworks.

Vamor criar um pequeno relatório que roda toda manhã e nos mostra quanta correspondência está nas nossas filas (queues). Isto pode servir de aviso se as filas estiverem congestionadas:

vi /etc/cron.d/qshape-cron

e insira estas duas linhas:

PATH=/usr/sbin
50 6 * * * postfix /usr/sbin/qshape incoming active deferred 2>&1 |/usr/bin/mail -s "qshape nome_do_host" root

O root deve receber este relatório amanhã às 6:50 horas. Agora vamos suprimir mais algumas entradas do logcheck:

echo "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ postfix/pickup\[[0-9]+\]: [[:alnum:]]+: uid=[0-4]+ from=" >>/etc/logcheck/ignore.d.server/postfix
echo "dsn=2.7.0, status=sent \(254 2.7.0 Ok," >>/etc/logcheck/ignore.d.server/postfix
echo "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ postfix/policyd-weight\[[[:digit:]]+\]: master: child [[:digit:]]+ exited" >>/etc/logcheck/ignore.d.server/postfix
echo "postfix/smtpd\[[0-9]+\]: timeout after END-OF-MESSAGE from localhost[127.0.0.1]" >>/etc/logcheck/ignore.d.server/postfix
echo "^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: IMAP\([...@[:alnum:]]+\): Disconnected in IDLE" >>/etc/logcheck/ignore.d.server/dovecot
echo "^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: IMAP\([...@[:alnum:]]+\): Disconnected: Logged out bytes=[0-9]+\/[0-9]+$" >>/etc/logcheck/ignore.d.server/dovecot
echo "^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ amavis\[[[:digit:]]+\]: \([-[:digit:]]+\) (Blocked|Passed)" >>/etc/logcheck/ignore.d.server/amavisd-new

Como padrão, o tamanho limite das mensagens é "message_size_limit = 10240000", ou 10Mb. Vamos alterar o limite para 20Mb apenas para mostrar como isto pode ser feito:

postconf -e "message_size_limit = 20480000"
/etc/init.d/postfix restart

No /etc/php5/apache2/php.ini há algumas configurações que afetam o tamanho máximo dos anexos (e o tamanho máximo de uma mensagem) que podem ser enviados pelo SquirrelMail. Veja http://www.hmailserver.com/forum/viewtopic.php?t=2254. Assim, por exemplo, podemos querer modificar alguns itens. Aqui vou alterar o upload_max_filesize para 9Mb e post_max_size para 10Mb. Também estou elevando o max_execution_time para 1 segundo a menos do que max_input_time (que também estou aumentando):

sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 9M/' /etc/php5/apache2/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 10M/' /etc/php5/apache2/php.ini
sed -i 's/max_execution_time = 30/max_execution_time = 119/' /etc/php5/apache2/php.ini
sed -i 's/max_input_time = 60/max_input_time = 120/' /etc/php5/apache2/php.ini
/etc/init.d/apache2 restart

Configurando férias no PostfixAdmin

Existem uma porção de boas razões para não usar uma resposta automática. Um dos motivos é que a maior parte da correspondência que recebemos é spam e os remetentes usam endereços forjados. Neste caso você estará enviando notícias para remetentes que não enviaram a mensagem ou você entope sua fila (queue) de deferidos com mensagens que não podem ser entregues. Com frequência existem outros problemas como entregas múltiplas ou o perigo de loops infinitos. O uso de avisos de férias apresenta riscos...

apt-get install libdbi-perl libdbd-mysql-perl libmail-sendmail-perl libemail-valid-perl libmime-perl libmime-charset-perl libmime-encwords-perl
addgroup --gid 65501 vacation
useradd -c "Virtual Vacation" -d /nonexistent -u 65501 -g 65501 -s /sbin/false vacation
mkdir /var/spool/vacation
cd /var/spool/vacation/
cp /usr/share/doc/postfixadmin/VIRTUAL_VACATION/vacation.pl.gz .
gunzip vacation.pl.gz
cp vacation.pl vacation.pl.original
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/vacation.2211.patch.txt
patch -p0 < vacation.2211.patch.txt
sed -i "s/my \$db_type = 'Pg/#my \$db_type = 'Pg/" vacation.pl
sed -i "s/#my \$db_type = 'mysql/my \$db_type = 'mysql/" vacation.pl
sed -i "s/db_host = ''/db_host = 'localhost'/" vacation.pl
sed -i "s/db_username = 'vacation/db_username = 'postfix/" vacation.pl
sed -i "s/db_password = ''/db_password = 'pfix_senha'/" vacation.pl
sed -i "s/smtp_server = 'localhost'/smtp_server = 'localhost:10025'/" vacation.pl
chown -R vacation:vacation /var/spool/vacation
chmod 750 vacation.pl

info Veja o patch baixado: vacation.2211.patch.

Colocamos uma entrada em /etc/postfix/transport que enviará a correspondência para o script de férias. Este é um nome de (sub)domínio fictício. Ele não precisa ser configurado no DNS:

vi /etc/postfix/transport

e insira:

autoreply.exemplo.com   vacation:
vi /etc/postfix/master.cf

e insira (logo abaixo do transporte do dovecot é um bom lugar):

vacation  unix  -       n       n       -       -       pipe 
     flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} -- ${recipient}

Depois:

postmap /etc/postfix/transport
postconf -e "transport_maps = hash:/etc/postfix/transport"
postconf -e "vacation_destination_recipient_limit = 1"
LINUX2

Agora vamos configurar o PostfixAdmin para usar esta facilidade:

sed -i "s/vacation'] = 'NO/vacation'] = 'YES/" /usr/share/postfixadmin/config.inc.php

Para mudar suas configurações de Auto Resposta, um usuário vai poder logar em:

https://nome_do_host.exemplo.com/postFixadmiNx/users

Entretanto, podemos evitar que usuários façam login no PostfixAdmin adicionando um plugin PostfixAdmin no SquirrelMail (pule para a próxima seção para instalá-lo e depois volte para cá). Chame https://nome_do_host.exemplo.com/mail. Enquanto estiver testando não se preocupe se receber respostas duplicadas de Out of Office (estou de férias) porque vamos arrumar isto um pouco mais tarde. Teste fazendo login na conta teste e configurando-a. Lembre-se de que a base de dados só registra os remetentes que já viu de modo que apenas uma mensagem seja enviada para cada remetente. Para limpar o cache e começar de novo, volte das suas férias escolhendo Auto Response->Coming Back e depois novamente Auto Response->Going Away. Use o phpMyAdmin para inspecionar a base de dados à medida em que for fazendo suas modificações.

Agora que as férias estão funcionando, considere desligá-las para que ninguém possa usá-las. Primeiro use https://nome_do_host.exemplo.com/phpmyadmiNx para certificar-se de que não há entradas na tabela vacation (férias) e de que não há aliases que enviem mensagens para @autoreply.exemplo.com (em outras palavras, ninguém pode estar usando as férias), depois:

sed -i "s/vacation'] = 'YES/vacation'] = 'NO/" /usr/share/postfixadmin/config.inc.php
sed -i "s/Vacation = true/Vacation = false/" /usr/share/squirrelmail/plugins/postfixadmin/config.php

Instalar o plugin postfixadmin no SquirrelMail

Existem diversas versões deste plugin. Eu peguei o do CodePoets/Pale Purple. O plugin permite que os usuários alterem sua senha, editem forwarding e habilitem mensagens de férias através da interface SquirrelMail. No entanto, diferente do usuário do PostfixAdmin, usuários SquirrelMail não podem impedir a entrega para caixas postais locais quando fazem um forward. Uma vez instalado, você deveria dar uma olhada no config.php para se familiarizar com as opções.

pear channel-update pear.php.net
pear install MDB2-2.4.1
pear install MDB2_Driver_mysql-1.4.1
apt-get install subversion
cd /usr/local/src
svn -r 33 co http://squirrelmail-postfixadmin.palepurple.co.uk/svn postfixadmin-plugin
cd postfixadmin-plugin/tags
cp -r squirrelmail-postfixadmin-0.4.3/ /usr/share/squirrelmail/plugins/
mv /usr/share/squirrelmail/plugins/squirrelmail-postfixadmin-0.4.3 /usr/share/squirrelmail/plugins/postfixadmin
cd /usr/share/squirrelmail/plugins/
chown -R root:root postfixadmin
cd postfixadmin
cp config.php.sample config.php
sed -i "s/postgres/mysql/" config.php
sed -i "s/xxxxx/pfix_senha/" config.php
sed -i "s/autoreply.my.domain.com/autoreply.exemplo.com/" config.php
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/postfixadmin.wording.patch.txt
cp postfixadmin_forward.php postfixadmin_forward.php.original
patch -p0 < postfixadmin.wording.patch.txt
squirrelmail-configure

info Veja o patch baixado: postfixadmin.wording.patch.

Depois instale o plugin (os plugins podem estar em outra ordem):

8. Plugins
 Plugins
  Installed Plugins
   1. amavisnewsql
   2. quota_usage
   3. timeout_user
   4. postfixadmin

S Save data
Q Quit<

Agora os usuários não precisam mais se logar no PostfixAdmin para alterar a senha, indicar forwarding ou habilitar as férias. Agora eles possuem funções similares no SquirrelMail (na página de opções - Options).

Chame https://nome_do_host.exemplo.com/mail. Se você desligou as mensagens de férias no PostfixAdmin, então também precisa desligá-las no plugin postfixadmin do SquirrelMail. Você deve usar https://nome_do_host.exemplo.com/phpmyadmiNx para se assegurar de que NÃO HÁ entradas habilitadas na tabela vacation. Também não deve haver registros na tabela vacation_notification ou aliases na tabela alias que enviem mensagens para @autoreply.exemplo.com:

sed -i "s/vacation'] = 'YES/vacation'] = 'NO/" /usr/share/postfixadmin/config.inc.php
sed -i "s/Vacation = true/Vacation = false/" /usr/share/squirrelmail/plugins/postfixadmin/config.php

Para ligar novamente as férias:

sed -i "s/vacation'] = 'NO/vacation'] = 'YES/" /usr/share/postfixadmin/config.inc.php
sed -i "s/Vacation = false/Vacation = true/" /usr/share/squirrelmail/plugins/postfixadmin/config.php

Quotas

Quando criamos novas caixas postais, o script mail_profile.sh entra a informação da quota no arquivo 'maildirsize' localizado no diretório de mail do usuário. Quando editamos uma caixa postal de usuário, o script quotaedit.sh atualiza a informação da quota. Usamos o controle de quota Maildir++. A página web para a quota do Dovecot é http://wiki.dovecot.org/Quota. Cada vez que uma mensagem entra ou sai do INBOX do usuário, o arquivo 'maildirsize' é atualizado. Como estamos usando o 'entregador' Dovecot como um LDA (Local Delivery Agent), o Postfix não tem como saber quantos bytes de dados existem na caixa postal do destinatário, mas o 'entregador' pode. Configurei o dovecot.conf para avisar o usuário duas vezes: quando 75% e quando 90% do espaço estiver ocupado:

quota_warning = storage=90%% /usr/sbin/quota-warning.sh 90
quota_warning2 = storage=70%% /usr/bin/quota-warning.sh 70

Observe que estas entradas chamam um script que coloca as mensagens de alerta diretamente nas caixas postais. Você pode editar o texto da mensagem que está no script. Quando o limite de espaço tiver sido atingido, as mensagens para o destinatário ficarão retidas na nossa máquina na fila de deferidos (deferred queue) do Postfix. Isto acontece devido à nossa configuração:

quota_full_tempfail = yes

Precisamos pegar este script:

cd /usr/sbin
wget -U NoSuchBrowser/1.0 http://www.numaboa.com/debian/quota-warning.sh.txt
mv quota-warning.sh.txt quota-warning.sh
chmod +x quota-warning.sh
sed -i 's/host.domain.tld/nome_do_host.exemplo.com/' quota-warning.sh

info Veja o script baixado: quota-warning.sh.

Você terá quer editar a parte textual do script (especialmente o número de telefone):

vi /usr/sbin/quota-warning.sh

Para testar tudo isto, primeiro esvazie toda a correspondência do usuário de teste (Eu uso teste@exemplo.com). Chame https://nome_do_host.exemplo.com/mail para realizar esta tarefa e para fazer os testes. Depois faça login em https://nome_do_host.exemplo.com/postFixadmiNx e edite a caixa postal deste usuário colocando a quota em 1Mb. Verifique se o o arquivo maildirsize foi atualizado:

cat /var/vmail/exemplo.com/teste/maildirsize

Meu sistema mostra:

1024000S
           0            0

Encontre um arquivo que não seja rejeitado pelo amavisd-new (.txt, .doc, .xls, .html, .pdf) com cerca de 70Kb que possa ser usado como anexo. Queremos enviar uma série de mensagens para o usuário teste que tenha este anexo. Queremos disparar a mensagem de alerta de quota enviando uma sérei de mensagens que totalizarão mais de 900Kb (use o link Check Mail do SquirrelMail ou vá para o uma outra pasta e volte para o INBOX para ver quanto de espaço ainda está disponível). Quando passar dos 70% e dos 90% você verá mensagens de alerta (estes limites foram estabelecidos no arquivo /usr/share/squirrelmail/plugins/check_quota/config.php). O destinatário também deve receber mensagens de alerta com o Assunto: "IMPORTANT: YOur Mailbox is X% full!". O destinatário só é avisado uma vez quando estiver em 70% e uma vez quando estiver em 90% de modo que, se você quiser testar novamente, você terá que eliminar algumas mensagens e enviar algumas outras novas.

Quando estiver satisfeito com os avisos, envie mais uma mensagem para estourar a quota. Se você olhar em /var/log/mail.log verá que esta mensagem não foi encaminhada ao destinatário, mas que foi colocada na fila de espera (o que também pode ser confirmado com o comando mailq):

Mai 17 06:32:56 ns2 postfix/pipe[24553]: 0961525F51: to=, relay=dovecot, delay=0.43,  delays=0.14/0.04/0/0.26, dsn=4.3.0, status=deferred (temporary failure. Command output:  Quota exceeded (mailbox for user is full) )

Você também vai receber mensagens (esperadas) de erro em /var/log/dovecot-deliver.log:

deliver(teste@exemplo.com): 2009-05-17 09:42:26 Info: msgid=<541620004.20090405094236@exemplo.com>: save failed to INBOX: Quota exceeded (mailbox for user is full)
deliver(teste@exemplo.com): 2009-05-17 09:42:26 Info: sieve runtime error: Keep: Generic Error
deliver(teste@exemplo.com): 2009-05-17 09:42:26 Error: sieve_execute_bytecode(/var/sieve/global.sievec) failed

Agora esta correspondência vai ficar atolada na fila de espera até que o usuário delete algumas mensagens para abrir espaço, até que você aumente a quota dele ou que se passem 5 dias. O logcheck vai notificar o root de que houve falha de entrega. Se este usuário não se importar com os avisos e não esvaziar sua caixa postal, todas as suas novas mensagens irão parar na fila de deferidas. Quando a correspondência estiver deferida por 5 dias (é o $maximal_queue_lifetime do Postfix), o remetente receberá o email de volta e a mensagem será eliminada da fila.

Se o usuário continuar sendo irresponsável, você pode querer acabar de vez com a festa intervindo manualmente e rejeitando todas as mensagens para este usuário ao invés de segurá-las na fila de deferidas (não fique tentado a deletar os emails da fila de deferidos quando a máquina estiver em produção - lembre-se, os emails não são seus). O certo é adicionar este destinatário no /etc/postfix/reject_over_quota com alguma coisa do tipo (isto tudo deve ficar em apenas uma linha):

teste@exemplo.com REJECT A caixa postal do destinatário está cheia - sua mensagem não foi entregue aos destinatários hospedados no servidor de email exemplo.com

E, depois disto, é claro que será preciso fazer um:

postmap /etc/postfix/reject_over_quota

A maior desvantagem disto é que a mensagem como um todo será rejeitada. Se a mensagem tiver sido endereçada para múltiplos destinatários no seu servidor, nenhum deles a receberá. Isto pode não ser justo para com o remetente ou com os outros destinatários, então pense duas vezes antes de tomar esta atitude smile

Opcional. Em geral, quando emails vão para a fila de espera, o remetente não é avisado do atraso. Se você quiser notificar todos os remetentes que tiverem seus emails deferidos por qualquer razão, você pode usar o Postfix para fazer isto. Aqui vamos dar ao Postfix uma hora para tentar fazer a entregar antes de enviar um aviso ao remetente:

postconf -e "delay_warning_time = 1h"
postfix reload

Instalar o Mailgraph - opcional

O Mailgraph produz gráficos diários, semanais, mensais e anuais de emails recebidos/enviados e devolvidos/rejeitados.

apt-get install mailgraph
sed -i 's/IGNORE_LOCALHOST=false/IGNORE_LOCALHOST=true/' /etc/default/mailgraph
/etc/init.d/mailgraph restart

Pode ser que demore alguns minutos para isto funcionar. Espere um pouco e depois dê uma olhada em https://nome_do_host.exemplo.com/cgi-bin/mailgraph.cgi.

Instalar o mysql-zrm - opcional

Este programinha legal pode fazer backups dos nossos dados MySQL. Vamos fazer backups locais e mantê-los por 4 dias.

apt-get install libxml-parser-perl
cd /usr/local/src
wget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.1/Debian/mysql-zrm_2.1_all.deb
dpkg -i mysql-zrm_2.1_all.deb
sed -i 's/#user="wikiuser"/user="root"/' /etc/mysql-zrm/mysql-zrm.conf
sed -i 's/#password="userwiki"/password="senha_do_root"/' /etc/mysql-zrm/mysql-zrm.conf
sed -i 's/#retention-policy=10W/retention-policy=4D/' /etc/mysql-zrm/mysql-zrm.conf
sed -i 's/mailto="root@localhost"/mailto="root@exemplo.com"/' /etc/mysql-zrm/mysql-zrm.conf
chown root:root /usr/share/man/man5/mysql-zrm*
chown root:root /usr/share/man/man1/mysql-zrm*
chmod 644 /usr/share/man/man5/mysql-zrm*
chmod 644 /usr/share/man/man1/mysql-zrm*
mysql-zrm-scheduler --now --backup-set dailyrun --backup-level 0
mysql-zrm-scheduler --add --interval daily --backup-set dailyrun --backup-level 0

Isto insere entradas no crontab do root. Rode crontab -e e veja se há qualquer caracter extra de quebra de linha separando as entradas - elimine-os se existirem. Os detalhes do que acabou de ser feito pode ser visto aqui: http://www.howtoforge.com/mysql_zrm_debian_sarge. Sugiro que você faça o download das 5 páginas deste HOWTO (e que, talvez, também o leia). Este programa vai te enviar alguns emails (chatos) diariamente.

Aqui está o manual do usuário: http://mysqlbackup.zmanda.com/index.php/Zmanda_Recovery_Manager_for_MySQL_Users_Manual.


O problema dos Aliases

Neste ponto temos um pequeno problema relacionado aos aliases. A expansão dos aliases ocorre duas vezes, uma quando a mensagem entra pela porta da frente via um dos daemons smtp e outra quando o amavis devolve a mensagem na porta de reinjeção do Postfix (porta 10025). Desta forma, o endereço é reescrito antes e depois do amavisd-new. Por que isto tem importância? Para cada usuário adicionado via PostfixAdmin existe uma entrada criada na tabela postfix.alias com o seguinte formato:

teste@exemplo.com teste@exemplo.com

Se um encaminhamento (forward) for adicionado através do Squirrelmail ou do PostfixAdmin e se a interface PostfixAdmin for usada escolhendo-se "Deliver to the local mailbox" (entregar na caixa postal local), o registro do alias do usuário vai ficar parecido com:

teste@exemplo.com teste@exemplo.com,numaboa&64;exemplo.net

Neste exemplo, teste@exemplo.com é um usuário real no nosso sistema e a caixa postal numaboa@exemplo.net está hospedada em outro local. Neste caso a mensagem será endereçada tanto para teste@exemplo.com como para numaboa@exemplo.net. Depois que o amavisd-new processa a mensagem, duas mensagens são geradas, uma para cada alias. A mensagem que foi gerada com o endereço teste@exemplo.com é que é o problema. Como a porta de reinjeção 127.0.0.1:10025 é apenas mais um dos daemons smtp (que usa o daemon cleanup para facilitar a reescrita do endereço), o Postfix endereça esta mensagem novamente para ambos. O resultado é que numaboa&64;exemplo.net recebe a mensagem duas vezes (o que não acontece com teste@exemplo.com, que só recebe uma porque a mensagem foi originalmente endereçada a ele).

Quando escrevi este documento pela primeira vez, desabilitei a reescrita de endereços antes do amavisd-new (usei "-o receive_override_options=no_address_mappings" nos daemons smtp interfaceando a Internet). Isto funcionava quando todas as mensagens vinham endereçadas a usuários "reais" (os que possuem caixas postais), mas como ficaria a coisa se você quisesse criar um alias? Alguma coisa do tipo

teste.user@exemplo.com teste@exemplo.com

onde teste@exemplo.com possui uma caixa postal (e está na base de dados do amavis) e teste.user@exemplo.com foi criado pelo admin apenas para redirecionar convenientemente emails para a conta existente. Aí a coisa não funciona direito se os endereços só forem reescritos depois do amavisd-new. O motivo é que teste.user@exemplo.com acaba usando as configurações padrão presentes em amavisd.conf ou 50-user e não as configurações relativas a teste@exemplo.com, ou seja, não usa as configurações que estão na base de dados MySQL. Neste caso, qual seria a solução? Uma das possibilidades seria editar o daemon smtp 127.0.0.1:10025 e alterar este override

-o receive_override_options=no_header_body_checks, no_unknown_recipient_checks

por

-o receive_override_options=no_address_mappings, no_header_body_checks, no_unknown_recipient_checks

mas o problema é que há situações em que não queremos desabilitar completamente a reescrita depois do amavisd-new. Podemos simplesmente querer usar uma tabela de alias virtual diferente. Para isto, vamos adicionar um daemon de cleanup novo que o amavisd-new possa usar e, por enquanto, vamos fazer com que este daemon de cleanup não use uma tabela de alias virtual. Faça um

vi /etc/postfix/master.cf

copie o daemon de cleanup, chame a cópia de amavis-cleanup e adicione um override que desabilita o mapa de alias virtual atual:

cleanup   unix  n       -       -       -       0       cleanup
amavis-cleanup   unix  n       -       -       -       0       cleanup
  -o virtual_alias_maps=hash:/etc/postfix/amavis_virtual
qmgr      fifo  n       -       n       300     1       qmgr

Depois, na porta de reinjeção 127.0.0.1:10025, avise o Postfix para usar este daemon de cleanup novo nos emails que o amavisd-new manda para ele:

127.0.0.1:10025 inet n    -    n    -    -    smtpd
    -o content_filter=
    -o cleanup_service_name=amavis-cleanup
    -o local_recipient_maps=
	<...>

Salve o arquivo e feche o editor. Depois:

/etc/init.d/postfix stop
/etc/init.d/postfix start

Você pode ser mais criativo (se você precisar). Sugiro a leitura de http://www.ijs.si/software/amavisd/README.postfix.html e http://www.ijs.si/software/amavisd/README.postfix.old.

Observação: se o usuário utilizar a interface PostfixAdmin para alterar o(s) alias(es) de encaminhamento e escolher a opção "Forward to given email addresses only" (encaminhar apenas para o endereço indicado) ao invés da opção "Deliver to the local mailbox", o registro no postfix.alias deve estar neste formato:

teste@exemplo.com numaboa@exemplo.net

Neste exemplo, numaboa@exemplo.net ainda é uma caixa postal remota. Lembre-se de que caixas postais remotas não terão seus endereços de email na base de dados amavis do MySQL (a não ser que você os adicione manualmente). Neste caso este tipo de destinatário acaba usando as configurações padrão (estáticas) existentes nos arquivos 50-user ou amavisd.conf.

mfx brokerсковородки нева титан официальный сайталександр лобановский харьковалюминиевый корпусхорошие сковородкиxrayvaz.ru лобановский харьков

Informações adicionais