FUG-BR / Grupo Brasileiro de Usuarios de FreeBSD
 
08.07  
Inicio arrow Resumo do Site arrow How-To Postfix com SMTP AUTH, Anti-spam, Anti-vrus, Quota, Dominios Virtuais, Pop3 e Imap
Principal
Inicio
Noticias
Artigos
Regras da Lista
Assinar a Lista
Histrico da Lista
Forum
Keyserver
PC-BSD: Artigos
PC-BSD: Notcias
Galeria de Imagens
Contador Usurios FUG
FUGs Estaduais
Downloads
Enquetes
FAQ
Resumo do Site
Links
Pesquisar
Contato
Sobre a FUG-BR
RSS / Twitter
-
DOC-BR (FUG BR)
Introduo
Projeto DOC-BR
Handbook
FAQ Oficial
-
+ Noticias
Alertas de Seguranca
Alertas em Ports
BSD em Geral
DaemonNews (Ingles)
MyFreeBSD
Todas Categorias
-
Login
Nome de Usurio

Senha

Lembrar login
Esqueceu sua senha?
Sem conta? Crie uma


How-To Postfix com SMTP AUTH, Anti-spam, Anti-vrus, Quota, Dominios Virtuais, Pop3 e Imap PDF Imprimir E-mail
Por Daniel Bristot de Oliveira   
21/06/2006
ndice de Artigos
How-To Postfix com SMTP AUTH, Anti-spam, Anti-vrus, Quota, Dominios Virtuais, Pop3 e Imap
Parte 2

ImageO Postfix é um servidor de e-mail estável, leve e modular, sua modulariade permite integrá-lo a vários outros serviços, mantendo um baixo consumo de recursos.

Iremos integrar o Postfix com as ferramentas mais utilizadas em servidores de e-mail: O Anti-Spam SpamAssassim, Anti-Vírus  Clamav, Courier-Maildrop, Courier-Imap, Cyrus-Salsl. A base de dados será armazenada no banco de dados MySQL, e o sistema terá suporte para múltiplos domínios. Também, como opcional, temos a configuração do UebiMial , um Webmail em PHP.

Postfix

Atenção: Se for copiar e colar os arquivos de configuração RETIRE OS COMENTÁRIOS!!!!!! POIS ELES PODEM CAUSAR ERROS, PRINCIPAMENTE SE ELES NÃO INICIAM NO COMEÇO DA LINHA.

 A ordem de configuração foi a que eu pessoalmente achei mais simples, primeiramente iremos configurar os sistemas que darão sustentação ao servidor, como a base de dados, depois iremos instalar e configurar os sistemas periféricos e ao final ligaremos tudo com o Postfix.

MySQL

O banco e dados será responsável pelo armazenamento e gerenciamento da base de dados dos usuários. A base de dados irá conter informações como, nome do usuário, domínio, cota em disco, local do armazenamento da mensagem, e outros informações que serão necessárias para alguns daemons. Um banco centralizado irá ajudar na administração pois todos os serviços iráo ter compatibilidade de informações.

Instalando o Mysql

A instalação do MySQL é feita através do ports, Neste caso utilizaremos a versão 5.0 do MySQL. O caminho para o ports do MySQL 5 é: /usr/ports/databases/mysql50-server Entre no ports e instale o MySQL, em geral somente o comando make fará o serviço, porém eu utilizei o seguinte comando.

# make WITHOUT_INNODB=yes BUILD_STATIC=yes BUILD_OPTIMIZED=yes install

Configurando o MySQL

Configuração para o Sistema Operacional Existem algumas opções do /etc/rc.conf para a inicialização do banco de dados com o sistema, veja no quadro abaixo.

mysql_enable="YES" Para habilitar o MySQL.

mysql_dbdir="/var/db/mysql" Para especificar o local onde ficará a base de dados do MySQL.

mysql_args="" Argumentos de linha de comando de inicialização do MySQL.


Uma configuração padrão do rc.conf é a seguinte.

''mysql_enable="YES"''
''mysql_dbdir="/var/db/mysql"''

A partir deste momento podemos inicializar o MySQL, como por padrão, foi criado um script de controle em /usr/loca/etc/rc.d, para iniciar o banco de dados execute:

# /usr/local/etc/rc.d/mysql-server.sh start

Configuração do Banco de Dados

Agora devemos adicionar uma senha para o usuário administrador, por padrão o usuário root.

# mysqladmin -u root password "Senha"

Existem algumas configurações que podem ser feitas no MySQL, o arquivo de configuração fica por padrão no diretório da base da dados com o nome my.cnf, em meu caso o seu caminho é /var/db/mysql/my.cnf. A minha configuração ficou assim:

[client]
socket = /tmp/mysqld.sock
[safe_mysqld]
err-log = /var/log/mysql.err
[mysqld]
user = mysql
port = 3306
log = /var/log/mysql.log
set-variable = key_buffer=5M

A instalação e configuração básica do MySQL estão prontas, agora vamos criar os bancos de dados.

Estrutura do Banco de Dados

Nosso banco de dados irá precisar basicamente de um banco de dados e três tabelas, o banco de dados terá o nome mail, as tabelas serão a tabela aliases que será responsável pelos alias do servidor de e-mail, a tabela trasport que será responsável em distinguir o transporte local do transporte virtual e por fim, a tabela virtual_users que terá as informações sobre cada usuário.

Vejamos uma explicação do conteúdo das tabelas aliases

alias varchar(255) NOT NULL default '',            #Nome do destinatário do correio
rcpt varchar(255) default NULL, #Nome do novo destinatário do correio


transport

domain char(128) NOT NULL default '',                #Nome do domínio Ex: xx13.net
transport char(128) NOT NULL default 'maildrop:', #Transporte de entrega da mensagem Ex: maildrop:


virtual_users

  `id` varchar(255) default NULL,                              #Endereço de e-mail Ex: 
 Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
 
`user` varchar(255) default NULL, # A parte do usuário no endereço, neste caso 'daniel'
`password` varchar(255) NOT NULL default '1234', #Senha
`uid` int(5) NOT NULL default '1002', #Id do usuário virtual
`gid` int(5) NOT NULL default '6', #Grupo do usuário virtual
`home` varchar(255) NOT NULL default '/var/mail/virtual/', #Diretório base de entrega de msg, este valor pode ser igual para todos.
`maildir` varchar(255) NOT NULL default 'domain/user/', #O diretório pessoal de cada usuário. O valor da caixa de correio em disco é "home"/"maildir"
`domain` varchar(255) NOT NULL default 'dominio', #O mesmo domínio do endereço de e-mail, neste caso "xx.net"
`nome` varchar(255) NOT NULL default 'Nome Sobrenome', #Nome do dono da caixa de correio
`login_maps` varchar(255) NOT NULL default '', #Endereço pelo qual o usuário pode enviar mensagens, por padrão o mesmo do "id".
`imapok` tinyint(1) unsigned default '1', #Clausula de conta ativa, se este valor for mudado para 0, esta conta sera desativada
`quota` varchar(255) default '10485760', #Tamanho da cota em bytes, neste caso 10 Megabytes


Para simplificar, veja abaixo o dump do nosso banco de dados padrão, mas preste atenção em nossos valores padrões. principalmente, uid, gid e home

#=======================MAIL.DB=================================

#

CREATE DATABASE mail;
use mail;

#
#Tabela de aliases
#

CREATE TABLE aliases (
alias varchar(255) NOT NULL default '',
rcpt varchar(255) default NULL,
PRIMARY KEY (alias)
) TYPE=MyISAM;


#Tabela transport
#

CREATE TABLE transport (
domain char(128) NOT NULL default '',
transport char(128) NOT NULL default 'maildrop:',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

#
#Tabela virtua_users
#


CREATE TABLE `virtual_users` (
`id` varchar(255) default NULL,
`user` varchar(255) default NULL,
`password` varchar(255) NOT NULL default '1234',
`uid` int(5) NOT NULL default '125',
`gid` int(5) NOT NULL default '125',
`home` varchar(255) NOT NULL default '/var/mail/virtual/',
`maildir` varchar(255) NOT NULL default 'domain/user/',
`domain` varchar(255) NOT NULL default 'dominio',
`nome` varchar(255) NOT NULL default 'Nome Sobrenome',
`login_maps` varchar(255) NOT NULL default '',
`imapok` tinyint(1) unsigned default '1',
`quota` varchar(255) default '10000000',
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


#==========================================================

Para inserir este dump em um banco de dados execute o seguinte comando:

#mysql -u root -pSenha < dump.sql

Adicionando Usuários ao Sistema

Por motivo de segurança, criaremos um novo usuário para os serviços acessarem o banco de dados, este usuário terá apenas os privilégios necessários para ele. Para isto acesse como usuário root o banco de dados e execute os seguintes comandos.

mysql> USE mysql
Database changed.

mysql> INSERT INTO user (host, user, password) VALUES('localhost','postfix','');
Query OK, 1 row affected (0.00 sec)

mysql> UPDATE user set password=PASSWORD('senha') WHERE user='postfix';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT select, insert, update ON mail.* TO postfix;
Query OK, 0 rows affected (0.00 sec)

O banco de dados está pronto.

Adicionando dados ao Banco da Dados

Agora que temos um banco de dados, vamos adicionar dados a ele. Dados da tabela transport A tabela transport como mencionado anteriormente, serve para o Postfix saber se o correio é local ou virtual. O correio local vai adicionado uma única vez, para adicioná-lo, acesse banco de dados como usuário postfix, e execute os seguintes comandos:

mysql> USE mail
Database changed

mysql> INSERT INTO transport(domain,transport) VALUES("DOMINIO_LOCAL","local:");
Query OK, 1 row affected (2.61 sec)

Para domínios virtuais, o comando é o mesmo, apenas alterando o campo transport de local: para virtual: ou maildrop:. Em nosso caso utilizaremos o maildrop para entrega de mensagens, então, utilize o maildrop como no exemplo abaixo:

mysql> USE mail
Database changed

mysql> INSERT INTO transport(domain,transport) VALUES("DOMINIO_VIRTUAL","maildrop:");
Query OK, 1 row affected (2.61 sec)

Dados da tabela alias A tabela alias irá conter apelidos para contas de E-mail, mensagens endereçadas para contas que tenham alias, serão desviadas para os endereços correspondentes, e cada endereço pode ter um ou mais apelidos, assim pode-se formar até pequenas listas de e-mail.

Para adicionar aliases, acesse banco de dados como usuário postfix, e execute os seguintes comandos:

mysql> USE mail
Database changed

mysql> INSERT INTO aliases(alias,rcpt) VALUES(" Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo "," Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo ");
Query OK, 1 row affected (0.00 sec)

Dados da tabela virtual_users Esta tabela possui mais dados que as demais, ela irá conter informações que variam muito de sistema para sistema, e alguns valores são padrões, por exemplo, o usuário que daemon de entrega irá executar tem o uid igual a 1002 e gid 6 , estes valores ja são adicionados por padrão, os valores que são variáveis irão ser adicionados no exemplo a seguir,para isso acesse banco de dados como usuário postfix, e execute os seguintes comandos:

mysql> USE mail
Database changed

mysql> INSERT INTO virtual_users(id, password, maildir, domain, nome) VALUES(' Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo ', '1234', "exemplo.net/daniel", "exemplo.net", "Daniel Bristot");
Query OK, 1 row affected (0.01 sec)
Atenção: O valor id é um valor único! e não será aceito outro valor igual.

Informações Gerais

O MySQL utiliza a porta 3306 para conexões, se você utilizar o banco de dados somente para conexões locais, uma dica é restringir o acesso a porta 3306 com o auxílio de um firewall. O MySQL é um consumidor de memória e processamento.

Cyrus-Sasl

O Cyrus-Sasl será responsável pela autenticação smtp.

Instalando o Cyrus-Sasl

Normalmente o postfix iria compilar o cysrus Sasl, porém teremos que habilitar a compatibilidade com o MySQL, então vamos instalar o Cyrus-Sasl a partir do ports, o caminho para o ports é: /usr/ports/security/cyrus-sasl2. Entre no diretório do ports e execute o comando:

# make -DWITH_MYSQL install

Após isto a compilação deve correr até o final sem mais perguntas.

Configurando o Cyrus-Sasl

A configurção do Cyrus-Sasl é simples, exige apenas a criação de um arquivo, ele deve ser criado em /usr/local/lib/sasl2/smtpd.conf, veja como ele deve ficar.

pwcheck_method: auxprop
mech_list: LOGIN CRAM-MD5 DIGEST-MD5
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_database: mail
sql_user: postfix
sql_passwd: e-mail
sql_select: SELECT password FROM virtual_users WHERE user='%u' and domain='%r' AND imapok='1'
sql_usessl: no

A única questão que pode gerar dúvida são os valores '%u' e '%r' na pesquisa, eles serão substituídos pelos valores do nome do usuário e do domínio respectivamente.

A configuração do Cyrus-Sasl está pronta.

Postfix

O postfix será nosso servidor de e-mail, ele escutará o protocolo SMTP pela porta 25/tcp e será responsável pelo transporte das mensagens. O Postfix é o carro-chefe de nosso Sistema, então fica difícil apresentar sua instalação em uma única parte do artigo, então primeiramente irei construí-lo a partir do ports, e na parte final iremos configurá-lo, pois sua configuração depende de vários outros serviços.

Instalando o Postfix

O Postfix irá precisar de alguma dependências, porém tudo isto é feito automaticamente a partir do ports. Uma única observação, se a autenticação for feita através das senhas de usuários do UNIX, é necessário instalar cyrus-sasl2-saslauthd. Neste caso não estaremos utilizando, então isto não se faz necessário.

O ports do postfix fica em /usr/ports/mail/postfix. Para construir o Postfix apenas digite make no diretório do ports, neste momento aparecerá uma tela com as opções de configuração. Eu escolhi as opções:

NOPCRE Pois eu não irei utilizar expressões regulares do perl.
Sasl2 Para autenticação SMTP
DB43 Para criar tabelas de aliases e outras configurações com base de dados DB.
MySQL Para habilitar o suporte ao MySQL.

A partir daí o postfix começa a ser construído, e dependendo da máquina isto pode demorar algum tempo. Nos instantes finas da instalação, você será perguntado se deseja ativar o postfix no mailer.conf, diga que sim, e ele será automaticamente inicializado pelo sistema.

Configurando o Sistema Operacional

O postfix não irá precisar de uma entrada no arquivo de inicialização /etc/rc.conf pois eu habilitei-o no mailer.conf, porém se você não o habilitou você precisa inserir as seguintes linhas no /etc/rc.conf

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
postfix_enable="YES"

Estas linhas servirão para desativar o Sendmail e ativar o Postfix.

O Postfix utilizará a porta 25 tanto para chegada quanto para saída de mensagem, caso você esteja utilizando um firewall, não esqueça de deixar o trafego in e out passar por esta porta. O postfix também depende do serviço de nomes, verifique se o tempo de consulta a base de dados de nomes não é muito lento, isto pode trancar seu sistema, não esqueça de liberar o tráfego 53 udp e tcp. Cuidado com o horário e o fuso-horário do sistema também é fundamental.

Courier-Imap

O Courier-Imap nos dará suporte aos protocolos de entrega de mensagem, o imap e pop3, apesar do nome, ele traz estes dois protocolos. O courier-imap é dividido em duas partes, os protocolos de transporte e de autenticação. O os protocolos de transporte serão feitos pelos daemons imapd e pop3d, e o protocolo de autenticação será feito pelo authdaemond.

Instalado o Courier-Imap

A instalação do courier-imap será feita via ports, o caminho do ports é: /usr/ports/mail/courier-imap, entre neste diretório e execute o comando make install. Após isto irá aparecer uma tela oferecendo opções de compilação, neste caso adicione somente a opção AUTH_MYSQL, que nos dará suporte ao MySQL. Após isto a instalação deverá terminar sem demais perguntas.

Configuração do Courier-Imap

Vamos dividir a configuração do courier-imap em duas partes, primeiro iremos abordar o daemon de autenticação, e logo após os daemons de entrega.

Configurando o authdaemond

O authdaemond irá por buscar informações do banco de dados sobre os usuários. Os arquivos de configuração do authdaemond estão em /usr/local/etc/authlib, e são eles, authdaemonrc responsável por características gerais do sistema e authmysqlrc responsável pela ligação entre o courier-imap e o banco de dados. Abaixo veremos os arquivos de configuração de exemplo.

authdaemonrc
authmodulelist="authmysql" 		# Lista de módulos habilitados.
authmodulelistorig="authmysql" # Lista de módulos utilizados pelo Courier webadmin.
daemons=5 # Número de daemons de autenticação.
authdaemonvar=/var/run/authdaemond # Diretório utilizado por alguns scripts.. NÃO MEXA.
subsystem=mail # Para qual facilidade do syslog enviar as mesagens.
DEBUG_LOGIN=0 # Nível de debug que as mensagens são enviadas para a syslog.
DEFAULTOPTIONS="wbnodsn=1" # Opções de linha de comando.
LOGGEROPTS="" # Opções de log.
authmysqlrc
MYSQL_SERVER localhost			# Servidor do banco de dados
MYSQL_USERNAME portfix # Usuário do banco de dados
MYSQL_PASSWORD e-mail # Senha do banco de dados
MYSQL_SOCKET /tmp/mysql.sock # Socket do banco de dados
MYSQL_PORT 3306 # Porta do banco de dados
MYSQL_OPT 0 # Opções do mysql
MYSQL_DATABASE mail # Nome do banco de dados
MYSQL_USER_TABLE virtual_users # Nome da tabela com informações do usuário
MYSQL_CLEAR_PWFIELD password # Coluna com as senhas
MYSQL_UID_FIELD uid # Coluna com o userid
MYSQL_GID_FIELD gid # Coluna com o groupid
MYSQL_LOGIN_FIELD id # Coluna com o Login
MYSQL_HOME_FIELD home # Coluna com o Home
MYSQL_NAME_FIELD nome # Coluna com o nome do usuário
MYSQL_MAILDIR_FIELD maildir # Coluna com o maildir do usuário
MYSQL_QUOTA_FIELD quota # coluna com a cota do usuário
MYSQL_WHERE_CLAUSE imapok=1 # Coluna com a flag de ativação da conta

A configuração do authdaemond está pronta, agora veremos as configurações dos damons de transporte.

Configurando os daemons de transporte

Os arquivos de configuração do courier-imap estão em /usr/local/etc/courier-imap, e tem os nomes correspondentes ao seu daemon de transporte. Você pode optar por utilizar somente um dos dois protocolos, porém o imap tem algumas vantagens sobre o pop3, cabe a você escolher qual prefere, neste exemplo utilizaremos os dois. Abaixo veremos os arquivos de configuração de exemplo.

imapd
ADDRESS=0
PORT=143
MAXDAEMONS=40
MAXPERIP=4
PIDFILE=/var/run/imapd.pid
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=imapd"
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
IMAP_KEYWORDS=1
IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"
IMAP_PROXY=0
IMAP_PROXY_FOREIGN=0
IMAP_IDLE_TIMEOUT=60
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
IMAP_DISABLETHREADSORT=0
IMAP_CHECK_ALL_FOLDERS=0
IMAP_OBSOLETE_CLIENT=0
IMAP_UMASK=022
IMAP_ULIMITD=65536
IMAP_USELOCKS=1
IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index
IMAP_ENHANCEDIDLE=0
IMAP_TRASHFOLDERNAME=Trash
IMAP_EMPTYTRASH=Trash:7
IMAP_MOVE_EXPUNGE_TO_TRASH=0
SENDMAIL=/usr/sbin/sendmail
HEADERFROM=X-IMAP-Sender
IMAPDSTART=NO
MAILDIRPATH=Maildir
pop3d
PIDFILE=/var/run/pop3d.pid
MAXDAEMONS=40
MAXPERIP=4
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
AUTHMODULES="authdaemon"
POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5 CRAM-SHA1 CRAM-SHA256"
POP3AUTH_TLS=""
DEBUG_LOGIN=2
PORT=110
ADDRESS=0
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=pop3d"
POP3DSTART=NO
MAILDIRPATH=Maildir

As configurações padrões são bastante completas, os itens que vale a pena dar uma revisada são:

MAXDAEMONS=40 		# Número máximo de processos
MAXPERIP=4 # Conexões máximas simultâneas por IP

Configuração do SO

Agora que tudo está configurado, basta ativar o courier-imap na inicialização do sistema. para isto basta adicionar as seguintes linhas em /etc/rc.conf.

courier_authdaemond_enable="YES"	# Obrigatória
courier_imap_pop3d_enable="YES" # Para ativar o pop3
courier_imap_imapd_enable="YES" # Para ativar o imapd

O protocolo imap utiliza a porta 143 TCP, e o protocolo pop3 utiliza a porta 110 TCP, se você está utilizando um firewall, libere estas portas. Os logs serão enviados para a facilidade mail do syslog, por padrão o arquivo de log será /var/log/maillog.

Courier-Maildrop

O Maidrop será nosso agente de entrega de mensagem, ele irá entregar as mensagens em suas devidas caixas de correio. Bom, mas porque não utilizar o daemon virtual que vem juntamente com o Postfix? Primeiramente, o virtual não tem controle de quota nativo, para isso iria ser preciso aplicar um patch, Segundo, o maildrop pode fazer várias verificações de mensagem, e ele cria automaticamente as caixas de correio, já com o virtual você teria de criá-las manualmente, e o maildrop oferece opções de filtros, como por exemplo desviar as mensagens de spam para uma pasta chamada Spam, retirando assim os spams da caixa de entrada.

Instalando o Maiodrop

O maildrop será instalado a partir do ports no seguinte caminho, /usr/ports/mail/maildrop. Como as informações de usuário estão armazenadas no banco de dados, precisamos adicionar o suporte para a Authlib, para isto execute o seguinte comando para construir o ports.

# make -DWITH_AUTHLIB install

A partir deste memento a instalação deve concluir sem mais perguntas.

Após a instalação, devemos criar um usuário para executar o maildrop. neste caso criei o usuário vmail, e o com o grupo padrão mail. O UID e o GID do usuário devem ser os mesmo do uid e gid do banco de dados. Isto determinará o dono dos diretórios e arquivos das