Parte1 Mail Server - Postfix + PostfixAdmin + Dovecot + SpamAssassin +MySQL + RoundCube + MailScanner
Autor: Badtux's Blog | Publicado: 2011-11-09T14:22:00-02:00





Pessoal, tudo bem?

Algum tempo atrás, a pedido de um cliente, montei uma solução de e-mail utilizando somente soluções livres e agora disponibilizo um tutorial para implementação de uma solução completa de e-mail utilizando o Postfix e outras ferramentas livres!

Irei dividir o tutorial em duas&nbsp;três&nbsp;partes, segue a primeira!



Solução

O servidor trabalha com o protocolo SMTP para envio e POP/IMAP para o recebimento das mensagens. O serviço do SMTP é provido pelo Postfix. O Postfix é bastante performático e estável, sendo um dos mais utilizados na plataforma GNU/Linux.

Já os serviços do POP/IMAP são gerenciados pelo Dovecot, ferramenta bastante utilizada por suportar os formatos maildir e mbox, além de sua confiabilidade, pois a equipe de desenvolvimento tem uma atenção especial com a &nbsp;segurança do código, sendo considerado o mais seguro. Timo Sirainen é o principal desenvolvedor do Dovecot e oferece 1000 euros a quem encontrar a primeira falha de segurança em seu software.

A estrutura de usuários é virtual e utiliza o MySQL como base de dados. A principal vantagem dessa estrutura é a possibilidade de contemplar vários domínios dentro do mesmo servidor de mail e a facilidade da administração, além de não utilizar usuários do sistema.

Para o controle de e-mail indesejados usamos o SpamAssassin utilizando o filtro bayesiano. O SpamAssassin funciona dando uma pontuação a cada mensagem que entra, baseado em diferentes "testes" que faz analisando todo o conteúdo da mensagem. De acordo com esta análise, ele acrescenta cabeçalhos na mensagem que informam o seu "nível de spam", e os testes nos quais ela caiu. Em particular, a mensagem recebe uma pontuação ("score").

Como proteção contra vírus nas mensagens utilizamos o Clamav, antivírus open-source, utilizado em grande escala para soluções de mail server e com atualizações diárias de seu banco de dados sobre vírus.

Para realizar o filtro nas mensagens utilizamos o MailScanner, ferramenta que controla o SpamAssassin e o Clamav, realizando um scan completo em todas as mensagens atrás de conteúdo indesejado ou mensagens com vírus. Essa ferramenta é bastante consolidada e sua primeira versão é de 2001. O autor acredita que cerca de 5 bilhões de mensagens são filtradas semanalmente por essa ferramenta.

Faz parte da solução o MailWatch, ferramenta para gerar relatórios gerencias sobre as mensagens trafegadas, bem como gráficos de utilização, gráficos de mensagens bloqueadas, etc. Todas as mensagens são categorizadas e através de sua interface web você pode ter acesso rápido e fácil ao volume de mails gerados, quantidade de mensagens com vírus e SPAM e ainda o score de cada mensagem.


Instalação

A distribuição utilizada na solução foi o CentOS 5.5 64bits com o kernel 2.6.18-238.9.1.el5.
Preparação

Primeiro, vamos adicionar o repositório RPMforge, devido a boa quantidade de pacotes adicionais disponível, como o Wine, Clamav, etc.


# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
# rpm -K rpmforge-release-0.5.2-2.el5.rf.*.rpm
# rpm -i rpmforge-release-0.5.2-2.el5.rf.*.rpm

Após a execução das linhas acima, já devemos ter o RPMforge disponível para a instalação de pacotes.
Vamos &nbsp;ainda adicionar os repositórios CentosPlus e C5-Testing para a instalação de pacotes como o PHP 5.2 e postfix-mysql:


# yum install yum-priorirys
# vim /etc/yum.repos.d/CentOS-Base.repo

O arquivo deve ter o conteúdo como o abaixo:

[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
includepkgs=php*
priority=1

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/? release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postfix
priority=2

#released updates

[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/? release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postfix
priority=2

&nbsp;#packages used/produced in the build but not released

[addons]
name=CentOS-$releasever - Addons
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=addons
#baseurl=http://mirror.centos.org/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that may be useful

[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that extend functionality of existing packages

[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=2

#contrib - packages by Centos Users

[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;amp;arch=$basearch&amp;amp;repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

Instalação dos pacotes  
Após os ajustes na configuração dos repositórios, podemos agora iniciar a instalação dos pacotes que serão utilizados na solução, conforme abaixo: 


# yum install spamassassin postfix clamav mysql-server mysql-devel httpd dovecot mod_ssl mod_php php-mysql php-mbstring php-devel php-xml php-imap make gcc php-pear php-mcrypt 
Instalando a extensão fileinfo: 

# pecl install fileinfo
Adicione a extensão no /etc/php.ini: 

&nbsp;extension=fileinfo.so 




&nbsp;Instalação PostfixAdmin  
Fazer o download da ultima versão do Postfix Admin direto da pagina oficial do projeto: 


# wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.3/postfixadmin-2.3.3.tar.gz?r=&amp;ts=1304963538&amp;use_mirror=jaist
# tar -xvzf postfixadmin-2.3.3.tar.gz -C /var/www
# mv /var/www/postfixadmin-2.3.3 /var/www/postfixadmin 
&nbsp;Configurando o MySQL para ser iniciado automaticamente:

# chkconfig --levels 345 mysqld on 
Iniciando o MySQL: 

# /etc/init.d/mysqld start 
Criando o usuario e a estrutura do Postfix no MySQL: 

# mysql 

Welcome to the MySQL monitor. Commands end with ; or \g.  Your MySQL connection id is 2  Server version: 5.0.77 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&nbsp;

mysql&gt; CREATE DATABASE mails; &nbsp;Query OK, 1 row affected (0.00 sec)

mysql&gt; GRANT ALL ON mails.* TO postfix@localhost IDENTIFIED BY 'badtux';Query OK, 0 rows affected (0.00 sec)  mysql&gt; USE mails;Database changed  mysql&gt; CREATE TABLE `alias` ( &nbsp;-&gt; `address` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `goto` text NOT NULL, &nbsp;-&gt; `domain` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', &nbsp;-&gt; `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', &nbsp;-&gt; `active` tinyint(1) NOT NULL DEFAULT '1', &nbsp;-&gt; PRIMARY KEY (address) &nbsp;-&gt; ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases'; &nbsp;Query OK, 0 rows affected, 1 warning (0.04 sec)  mysql&gt; CREATE TABLE `domain` ( &nbsp;-&gt; `domain` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `description` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `aliases` INT(10) NOT NULL DEFAULT '0', &nbsp;-&gt; `mailboxes` INT(10) NOT NULL DEFAULT '0', &nbsp;-&gt; `maxquota` INT(10) NOT NULL DEFAULT '0', &nbsp;-&gt; `transport` VARCHAR(255) DEFAULT NULL, &nbsp;-&gt; `backupmx` tinyint(1) NOT NULL DEFAULT '0', &nbsp;-&gt; `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', &nbsp;-&gt; `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', &nbsp;-&gt; `active` tinyint(1) NOT NULL DEFAULT '1', &nbsp;-&gt; PRIMARY KEY (DOMAIN) &nbsp;-&gt; ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains'; &nbsp;Query OK, 0 rows affected, 1 warning (0.04 sec)  mysql&gt; CREATE TABLE `mailbox` ( &nbsp;-&gt; `username` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `password` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `name` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `maildir` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `quota` INT(10) NOT NULL DEFAULT '0', &nbsp;-&gt; `domain` VARCHAR(255) NOT NULL DEFAULT '', &nbsp;-&gt; `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', &nbsp;-&gt; `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', &nbsp;-&gt; `active` tinyint(1) NOT NULL DEFAULT '1', &nbsp;-&gt; PRIMARY KEY (`username`) &nbsp;-&gt; ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes'; &nbsp;Query OK, 0 rows affected, 1 warning (0.09 sec)  mysql&gt; CREATE TABLE popbsmtp ( &nbsp;-&gt; address varchar(39) not null, &nbsp;-&gt; last_seen datetime default '0000-00-00 00:00:00' not null, &nbsp;-&gt; primary key (address) &nbsp;-&gt; ); &nbsp;Query OK, 0 rows affected (0.01 sec) 
 Configuração Apache para o PostfixAdmin  Acessando o /etc/httpd/conf/httpd.conf, iremos comentar as linhas abaixo:

#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule cgi_module modules/mod_cgi.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule status_module modules/mod_status.so
Criando o diretório de logs: 

#mkdir /var/www/postfixadmin/logs/ 
Reiniciando o Apache: 

&nbsp;# /etc/init.d/httpd restart 

Configuração do PostfixAdmin  
Primeiro, iremos modificar as seguintes entradas no /var/www/postfixadmin/config.inc.php: 


&nbsp;// Database Config
// mysql = MySQL 3.23 and 4.0, 4.1 or 5
// mysqli = MySQL 4.1+
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'badtux';
$CONF['database_name'] = 'mails';
[....]
$CONF['configured'] = true;
[....]
Após as modificações acima, onde você adiciona as informações referentes à sua tabela mails, você deverá acessar a url: 

http://&lt;SEUIP&gt;/postfixadmin/setup.php 





Verifique se todas as dependências estão resolvidas, e posteriormente adicione uma senha para o setup do PostfixAdmin. Após a inserção da senha, será gerado um hash que deverá ser adicionado no arquivo config.inc.php que está localizado no diretório padrão do PostfixAdmin:




Com o hash gerado basta adiconar/modificar no arquivo mencionado anteriormente:

# vim /var/www/postfixadmin/config.inc.php 
E adicione/modifique a linha:

$CONF['setup_password'] = 'e5b6b669f1ebaa77689af9b91fc18f89:7a21f7d0fec819ce4851d4ab4cd16df29778543b'; 
Agora podemos adicionar o administrador do PostfixAdmin na mesma tela onde cadastramos a senha do setup:




Com isso, criamos a conta administradora do PostfixAdmin utilizando o mail Linux@badtux.com.br.
Após essa etapa, já podemos utilizar o postfixAdmin através da url:

http://&lt;SEUIP&gt;/postfixadmin 


Configuração do Postfix (MTA) 

Agora daremos inicia a configuração do MTA, no caso do empresaX, o Postfix.
Primeiro, iremos editar o arquivo de configuração do Postfix:

# vim /etc/postfix/main.cf 
Agora, modificaremos/adicionaremos as seguintes entradas:

[...] myhostname = mx.empresaX.com.br [...] inet_interfaces = all[...] 

# Adicione as linhas abaixo # Configuration pour mysql virtual mail virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf virtual_gid_maps = static:89 virtual_mailbox_base = /home/virtual_mail virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_limit = 51200000 virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_minimum_uid = 89 virtual_transport = virtual virtual_uid_maps = static:89 #POP Before SMTP smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,check_client_access mysql:/etc/postfix/mysql_popbsmtp_access_maps.cf,check_client_access hash:/etc/postfix/relay,reject_unauth_destination smtpd_sasl_path = private/auth smtpd_sasl_type = dovecot 
Criando o arquivo de relay para ser tratado posteriormente:

# touch /etc/postfix/relay
# postmap /etc/postfix/relay 
Com a execução do postmap no arquivo de HASH acima, será criado também o arquivo relay.db.


Criando os arquivos de configuração para o MySQL 

Agora iremos criar os arquivos mencionado no main.cf na etapa anterior, primeiramente o arquivo de alias:

# vim /etc/postfix/mysql_virtual_alias_maps.cf
Adicione o seguinte conteúdo, atente para as informações de banco:

user = postfix password = badtux hosts = localhost dbname = mails query = SELECT goto FROM alias WHERE address='%s' AND active = 1 
Agora, criaremos o arquivo de domínios:

# vim /etc/postfix/mysql_virtual_domains_maps.cf

user = postfixpassword = badtux hosts = localhost dbname = mails query = SELECT domain FROM domain WHERE domain='%s' #optional query to use when relaying for backup MX #query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1' 
Criando o arquivo de configuração do mailbox:

# vim /etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfixpassword = badtuxhosts = localhostdbname = mailsquery = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
Adicionando o arquivo de alias para&nbsp;domínios:

# vim /etc/postfix/mysql_virtual_alias_domain_maps.cf

user = postfixpassword = badtuxhosts = localhostdbname = mailsquery = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' AND alias.address=concat('%u', '@', alias_domain.target_domain) AND alias.active = 1
Criando o arquivo do método de autorização PopBeforeSMTP:

# vim /etc/postfix/mysql_popbsmtp_access_maps.cf

user = postfixpassword = badtuxhosts = localhostdbname = mailsquery = SELECT 'OK' FROM popbsmtp WHERE last_seen &gt;= DATE_SUB(NOW(),INTERVAL 120 MINUTE) AND address = '%s'
Agora iremos criar o diretório default das contas virtuais e configurar as permissões:

# mkdir /home/virtual_mail
# chown postfix:mail /home/virtual_mail
# chmod o-rx -R /home/virtual_mail
Agora vamos editar novamente o arquivo main.cf:

# vim /etc/postfix/main.cf
E modifique/adicione a seguinte entrada:

local_recipient_maps = $virtual_mailbox_maps 
Vamos reiniciar o serviço do Postfix e observar se ele sobe sem erros:

# /etc/init.d/postfix restart

Bem, por hoje é só!!! Estarei postando a continuação do tutorial em breve!!! Aguardem...

Parte2 Mail Server - Postfix + PostfixAdmin + Dovecot + SpamAssassin +MySQL + RoundCube + MailScanner