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 caixas de correio, então no memento da criação de uma nova conta, não esqueca de inserir os valores uid e gid iguais as do usuário vmail e do grupo mail. O maildrop será executado com o usuário vmail, porém ele não possuirá permição para comunicar-se com a base de dados, por isto o executavel do maildrop deve ter o SetUID habilitado, para isto execute o seguinte comando:
# chmod u+s /usr/local/bin/maildrop
A configuração básica do maildrop está pronta.
Configurando o Maildrop
O maildrop tem apenas um arquivo de configuração, que está em: /usr/local/etc/maildroprc, na verdade este arquivo nem precisa existir. A configuração do banco de dados não é necessária, pois ele irá utilizar a Authlib para isto, e isto nós já configuramos anteriormente para o courier-imap.
O arquivo de configuração do maildrop irá conter uma rotina de tarefas que ele deve fazer ao entregar uma mensagem, veja o exemplo que utilizamos abaixo.
logfile "/var/log/maildrop.log" #Arquivo de Log
`test -d $HOME/$DEFAULT` # Testa se a caixa de correio existe
if ($RETURNCODE!=0) # Caso não exista...
{
`maildirmake $DEFAULT` # Cria a caixa de correio,
`maildirmake -f .Spam $HOME/$DEFAULT` # e as pastas para o Spam
`maildirmake -f .Trash $HOME/$DEFAULT` # e a lixeira
}
QUOTA="$MAILDIRQUOTA"'S'
`maildirmake -q $QUOTA $HOME/$DEFAULT` # Ajusta a cota da caixa de correio
if (/^X-Spam-Status: Yes/) # E se a mensagem for um Spam, ela a envia
{ # para a pasta Spam.
to "$DEFAULT/.Spam/"
}
Ligando ao Postfix
Para ligá-lo ao Postfix, apenas verifique a linha sobre o transporte maildrop no arquivo /usr/local/etc/postfix/master.cf ela deve estar como no exemplo abaixo.
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient} -w 90
Com a opção -w 90 o maildrop irá enviar a mensagem contida no arquivo /usr/local/etc/quotawarnmsg avisando que a cota de uso de sua conta chegou aos 90%, o valor pode ser alterado a seu critério, e por padrão a mensagem não existe, então você deve cria-la.
Clamav Filter
O clamav filter é um script que será responsável pela filtragem de virus e spam de uma mensagem, ele interliga os daemons clamd que fará a checagem do antivírus e o spamd que fará a verificação de spam. O clamav-filter é apenas um arquivo que está disponível para download neste link. Porque utilizar este filtro, se existe o amavisd? Bom, o amavisd é um daemon que consome muitos recursos, este filtro faz apenas o que é necessária. Por agora iremos tratar mais a parte de instalação dos dois daemons, o clamav-filter será utilizado para ligar o postfix aos dois daemons, veremos isto no memento da configuração do Postfix.
Clam-AV
o Clam-AV é um poderoso antivírus open source, ele irá filtrar todas as mensagens que passarem pelo servidor. ele é dividido em dois daemons, o clamd e o freshclamd um para varredura de vírus e um para atualização da base de dados de vírus respectivamente.
Instalando o Clam-AV
A instalação do Clam-AV é feita apartir do ports, seu caminho é: /usr/ports/security/clamav. A instalação é simples, vá para o diretório do ports e execute:
# make install
Logo após irá aparecer uma tela com as opções de compilação, eu ativei apenas a opção LIBUNRAR, ela da suporte para arquivos compactados com extensão .rar. Após isto a configuração deve prosseguir sem mais perguntas até o final.
Configurando o Clam-AV
Os arquivos de configuração estão em /usr/local/etc/ e são /usr/local/etc/clamd.conf e /usr/local/etc/freshclam.conf. O clamd.conf é responsável pela configuração do daemon de verificação de vírus. Veja abaixo o exemplo de arquivo de configuração.
clamd.conf
#configurações de log
LogFile /var/log/clamav/clamd.log # Arquivo de Log
LogFileMaxSize 2M # Tamanho máximo do arquivo de log
LogTime # Horário nos arquivos de log
LogSyslog # Usa Syslog
LogVerbose # Log mais aprofundado
PidFile /var/run/clamav/clamd.pid # Arquivo com o Pid
DatabaseDirectory /var/db/clamav # Base de dados de virus
LocalSocket /var/run/clamav/clamd # Local do socket
FixStaleSocket # Atualização do socket ao inicia o daemon
MaxConnectionQueueLength 30 # Número máximo de conexões na fila de espera
MaxDirectoryRecursion 20 # Max Nún da profundidade de diretórios
FollowDirectorySymlinks # Segue links para diretórios
User clamav # Nome do usuário que o anti vírus está executando
AllowSupplementaryGroups # Acesso suplementar a outros grupos
ScanMail # Habilita varredura de arquivos de e-mail
ArchiveMaxFileSize 10M # Tamanho máximo do arquivo a ser varrido
ArchiveMaxRecursion 9 # Nível de recursão de um arquivo
ArchiveMaxFiles 1500 # Núm Máx de arquivos a ser varrido em um arquivo compactado
Agora iremos ver a configuração utilizada no freshclam.
DatabaseDirectory /var/db/clamav # Base de dados de informações de vírus
UpdateLogFile /var/log/clamav/freshclam.log # Arquivo de Log de atualizações
PidFile /var/run/clamav/freshclam.pid # Arquivo com o Pid
DatabaseOwner clamav # Usuário dono da base de dados
AllowSupplementaryGroups # Acesso suplementar a outros grupos
DatabaseMirror database.clamav.net # Servidor de atualização
NotifyClamd # Notifica o Clamd sobre atualizações
Esse esquema de configuração exige que seja criados dois diretórios: /var/run/clamav e /var/log/clamav. após criar este diretório, mude o dono dos diretórios para usuário clamav.
# chown clamav:clamav /var/run/clamav /var/log/clamav
Configuração do Sistema Operacional
Agora devemos habilitar o ClamAV na inicialização do sistema. Para isso devemos adicionar as seguintes linhas em /etc/rc.conf:
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
Caso você esteja utilizando um firewall, abra o trafego para o servidor da base de dados de atualização.
O Anti-Vírus está pronto.
SpamAssassin
O SpamAssassim será responsável pelo controle anti-spam, pesquisas mostram que sua eficácia é de 95 por cento, porém, seu custo é um pouco alto, ele checa todo o corpo de uma mensagem, isto cria um esforço computacional grande, e ele também consome uma boa fatia da memória. Nós utilizaremos o SpamAssassin na forma de um daemon, o spamd, isto reduz o esforço que o computador faria para iniciar a execução a cada checagem de e-mail, assim, o spamassassim quando requisitado não precisa iniciar todo o processo, apenas verificar a mensagem. Para isto é nescessário um programa cliente, o spamc, que envia a mensagem para o spamd chegar.
Instalando o Spamassassim
O SpamAssassin será instalado via ports, o caminho para o seu ports é: /usr/ports/mail/p5-Mail-SpamAssassin/. Para instalar entre no diretório do ports e execute.
# make install
Após isto irá aparecer uma tela de configuração de opções, eu não habilitei nenhuma, agora é só esperar o sistema terminar de compilar o SpamAssassin.
Configurando o SpamAssassim
A configuração do SpamAssassim é simples, o arquivo de configuração está em /usr/local/etc/mail/spamassassim. O arquivo init.pre contém informações sobre módulos de checagem de e-mail, habilite ou desabilite-os como quiser. O arquivo de configuração que mais nos interessa neste memento é o local.cf. Ele é um arquivo simples, em nosso coso ele precisa ter apenas as seguintes linhas:
# Deixa a mensagem intacta, porém adiciona os headers de spam.
report_safe 0
# Este é a pontuação pela qual uma mensagem é considerada spam
required_score 5.0
Configuração do Sistema Operacional
É preciso escrever um script de inicialização do spamd, ele deve estar em /usr/local/etc/rc.d/spamd.sh e ter permissão de execução. O arquivo de inicialização deve ser como no exemplo abaixo, apenas ajuste as opções de processos filhos do spamd conforme for o trafego de seu servidor.
/usr/local/etc/rc.d/spamd.sh
#!/bin/sh
case "$1" in
start)
/usr/local/bin/spamd --socketpath=/var/run/spamd/spamd.sock --pidfile=/var/run/spamd/spamd.pid --min-children=1 --min-spare=1 --max-spare=2 -d
echo "Starting Spamd."
;;
stop)
kill -9 `cat /var/run/spamd/spamd.pid`
echo "Stoping Spamd."
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
exit 64
;;
esac
exit 0
O SpamAssassin está pronto, agora vamos ligar os dois filtros como o Clamav-Filter.
Configurando do Clamav-Filter
Faça o download do clamav-filter apartir deste link. Após o download copie-o para o diretório /usr/local/libexec/postfix/, e altere suas permições como no exemplo abaixo:
chown clamav:clamav /usr/local/libexec/postfix/clamav-filter.sh
O clamav-fiter irá precisar de dois diretórios, com permissão de escrita para o dono do clamav-filter, neste caso o usuário clamav. para isto execute o seguinte comando.
# mkdir /var/run/clamav /var/log/clamav
# chown clamav:clamav /var/run/clamav /var/log/clamav
Ligando o clamav-filter ao Postfix
Para ligá-lo ao Postfix precisamos criar um transporte e um filtro para as conexões tcp, para isto comente a seguinte linha no arquivo /usr/local/etc/postfix/master.cf
smtp inet n - n - - smtpd
E adiciones estas linhas ao mesmo aquivo.
smtp inet n - n - - smtpd
-o content_filter=clamav:clamav
clamav unix - n n - - pipe
flags=Rq user=clamav argv=/usr/local/libexec/postfix/clamav-filter.sh -f ${sender} -- ${recipient}
O clamav-Filter está pronto!
Configurando o Postifix
Esta é a parte final deste How-To, é a configuração final do postfix, será basicamente, ligando o Postfix ao Cyrus-Sasl e a base de dados, basicamente, abaixo serão mostrados os arquivos do diretório /usr/local/etc/postfix, todos eles devem estar presente, as únicas alterações a serem feitas é o nome do usuário e senha da base de dados nos arquivos de ligação com o MySQL.
Arquivo de configuração do Postfix. /usr/local/etc/postfix/main.cf
mydestination = localhost.$mydomain, localhost, $transport_maps
local_recipient_maps = unix:passwd.byname, $alias_maps, $virtual_recipient_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = class
alias_maps = hash:/usr/local/etc/postfix/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = no
#Configuração do MySQL e de dominios virtuais
transport_maps = mysql:/usr/local/etc/postfix/transport.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/gids.cf
virtual_mailbox_base = /var/mail/virtual
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual.cf
virtual_maps = mysql:/usr/local/etc/postfix/mysql.aliases.cf
virtual_uid_maps = mysql:/usr/local/etc/postfix/uids.cf
virtual_recipient_maps = mysql:/usr/local/etc/postfix/recipients.cf
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mailboxsize-mysql.cf
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_mailbox_limit = 100000000
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_helo_required = yes
smtpd_sender_login_maps = hash:/usr/local/etc/postfix/sender_login_maps
smtpd_sender_login_maps = mysql:/usr/local/etc/postfix/login_maps.cf
smtpd_recipient_restrictions =
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_invalid_hostname
reject_unknown_sender_domain
reject_unknown_recipient_domain
reject_multi_recipient_bounce
reject_sender_login_mismatch
permit_sasl_authenticated
reject_unauth_destination
permit
Arquivos de ligação do postfix com o MySQL:
/usr/local/etc/postfix/transport.cf
user = postfix
password = e-mail
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = localhost
/usr/local/etc/postfix/gids.cf
user = postfix
password= e-mail
dbname = mail
table = virtual_users
select_field = gid
where_field = id
hosts = localhost
/usr/local/etc/postfix/uids.cf
user = postfix
password= e-mail
dbname = mail
table = virtual_users
select_field = uid
where_field = id
hosts = localhost
/usr/local/etc/postfix/mysql_virtual.cf
user = postfix
password= e-mail
dbname = mail
table = virtual_users
select_field = maildir
where_field = id
hosts = localhost
/usr/local/etc/postfix/mysql.aliases.cf
user = postfix
password= e-mail
dbname = mail
table = aliases
select_field = rcpt
where_field = alias
hosts = localhost
/usr/local/etc/postfix/recipients.cf
user = postfix
password= e-mail
dbname = mail
table = virtual_users
select_field = nome
where_field = id
hosts = localhost
/usr/local/etc/postfix/mailboxsize-mysql.cf
password = e-mail
dbname = mail
table = virtual_users
select_field = quota
where_field = id
hosts = localhost
/usr/local/etc/postfix/login_maps.cf
password = e-mail
dbname = mail
table = virtual_users
select_field = login_maps
where_field = id
hosts = localhost
pronto, tudo deve estar funcionando.
Agora vamos instalar o WebMail
Uebimiau o WebMail
Para finalizar a nossa configuração, iremos instalar o Uebimial que é um Webmail baseado em PHP, por isso ele precisa de um servidor Web com suporte ao PHP. O UebiMial tem suporte aos protocolos POP3 e IMAP, a língua Portuguesa, e possui uma interface limpa e fácil.
O Uebimial está disponível via ports, porém atualamente ele está quebrado, então teremos que fazer o download do site [1]. Agora que fizemos o Download vamos configurar o WebMail. Vamos descompactar o Uebimial no diretório /var/www/, para isto, copie o download do Uebimial para /var/www/ e extraia do .zip, neste exemplo estamos utilizando a versão 2.7.10.
# cp uebimiau-2.7.10-any.zip /var/www
# cd /var/www/
# unzip uebimiau-2.7.10-any.zip
Agora vai ser criado o diretório webmail, onde está o nosso webmail. O arquivo de configuração fica, relativamente dentro do diretório do webmail, em inc/config.php. Antes de configura-lo vamos criar o diretório /var/webmail e dar a parmição 755 e dono e grupo www, este será um diretório que o uebimial precisará para guardar arquivos temporários.
# mkdir /tmp/webmail
# chmod 755 /tmp/webmail
# chown www:www /tmp/webmail
Agora vamos editar o arquivo de configuração. basicamente o que devemos fazer é, setar a opção que dis que o Webmail servirá para multiplos dimínios, e configurar as conexões.]
Configurando o WebMail
Abra no editor de sua preferência o arquivo /var/www/webmail/inc/config.php, e altere as seguintes variáveis:
Mude o caminho da pasta temporária para a o diretório que criamos em /tmp/
$temporary_directory = "/tmp/webmail";
$mail_server_type de ONE-FOR-EACH para ONE-FOR-ALL, isto diz para o Uebimial que o servidor serve para multiplos dompinios, e irá pedir o nome de usuário na forma do endereço de e-mail completo. Ex:
$mail_server_type = "ONE-FOR-ALL";
Agora modifique as variáveis abaixo, os valores que elas estão mostrando, provavelmente funcionarão, e os nomes são bem sugestivos.
$default_mail_server = "127.0.0.1";
$one_for_all_login_type = "%user%@%domain%";
$default_protocol = "pop3";
$default_port = "110";
$default_folder_prefix = "";
O UebiMial está configurado, agora apenas adicione um alias, para as requisições que chegam para o seu "servidor"/webmail/ para /var/www/webmail, e está pronto.
NOTA: Eu tive um problema com o PHP, algo com, a função header não aceita quebra de linha, então editei o arquivo que continha o erro, na linha do erro é só retirar os \n e tudo funciona.
O UebiMial também é altamente costomizável, a interface é escrita em HTML e está dendro do diretório, relativo ao webmail, themes/uebimial.
Caso aconteça algo errado, a saída é utilzar o nosso bom e velho amigo log. Uma dica simples, cole o log no google! isso ajuda bastante. Qualquer outra duvida ou sugestão, mande um e-mail para daniel At dbristot dot info
Final
Este How-to foi produzido por Daniel Bristot de Oliveira, sobre a licença BSD, tomei como referência os seguintes arquivos: Servidor de email com SMTP, POP, IMAP, quota e MySQL de Marco A. S. Máximo Link
INTEGRANDO O POSTFIX COM O CLAMAV de Gleydson Soares (gsoares) - Deives Michellis "thefallen" Link
Todos os direitos do CLAMAV-FILTER pertencem aos seus idealisadores.