MTA Selor: Servidor de E-mails – Novo Projeto GPL

Apresentação e downloads

Este artigo é uma apresentação do novo projeto GPL brasileiro, MTA Selor. Selor é o acrônimo de Servidor de E-mails Livre Orientado por Regras.

Eu sou o autor do projeto, e há alguns anos havia criado o MTA Sceo, que prometi libera-lo sob GPL, mas, uma pequena parte do Sceo foi feito na antiga empresa onde trabalhava, então, para não haver qualquer tipo de problema, decidi iniciar um novo projeto escrito do zero, mas usando a mesma ideia de regras que eu sempre achei muito poderosa para controlar o seu servidor.

Projetei o Selor para ser mais rápido do que os outros principais MTAs, para tirar o máximo proveito de um servidor e também, para ter maior flexibilidade. Por isso, a necessidade de usar Assembly no meio dele.

Da parte POP3/IMAP, de todos os servidores que testei, o Dovecot se mostrou de longe, o melhor e mais rápido.

O Roundcube é um bonito WEBmail e de fácil instalação. Você pode até instalá-lo em um servidor separado, para não consumir tanto processador e acesso a disco.

O S.O. usado foi o Slackware 13.37 64 bits.

Puxando os programas:

# mkdir /home/progs
# cd /home/progs
# wget
 http://www.mtaselor.com.br/downloads/selor/selor_src_1.1.tar.bz2
# wget http://www.mtaselor.com.br/downloads/modulos/selor_mysql_src_1.0.tar.bz2
# wget http://www.mtaselor.com.br/downloads/utilitarios/selor_rquota_src_1.0.tar.bz2
# wget http://dovecot.org/releases/2.2/dovecot-2.2.12.tar.gz
# wget http://ufpr.dl.sourceforge.net/project/roundcubemail/roundcubemail/1.0.0/roundcubemail-1.0.0.tar.gz

Instalando o servidor SMTP

O Selor puxado no capítulo anterior, foi o código fonte. Para compilá-lo, você precisará do GCC (Compilador C), do NASM (montador Assembly) e, opcionalmente, da libcap-devel (apenas para GNU/Linux e para quem pretende um dia, usar a ação So_mark! do Selor, que permite marcar pacotes TCP de saída, ter controle usando traffic shaping e IP route).

# cd /home/progs
# tar xjf selor_src_1.1.tar.bz2
# cd selor_src_1.1
# make linux

Obs. 1: se ele reclamar da libcap. Você tem duas opções:

1. Procurar e instalar a libcap/libcap-devel.
2. Compilá-lo sem suporte a função So_mark:

# make linux_nocap

Obs. 2: no FreeBSD não existe suporte a So_mark, pois é um recurso que apenas o kernel do Linux tem. Não se preocupe, a So_mark não é essencial para o servidor SMTP.

# make linux_install
# groupadd -g 105 selor
# useradd -g selor -u 105 selor
# chown -R selor. /var/spool/selor
# chown -R selor. /var/log/selor

Edite o arquivo de configuração do servidor (/usr/local/selor/selor.conf):

# cd /usr/local/selor
# pico selor.conf

Em Server_name, coloque o nome do IP REVERSO do seu IP de internet

Em Module, deixe-o assim:

Module “/usr/local/selor/mod/selor_mysql.so /usr/local/selor/mod/selor_mysql.conf”

Em Dlocal, deixe-o assim:

Dlocal “/usr/local/libexec/dovecot/deliver -d %l <“

Obs. 3: cuidado para não deixar espaços na frente das opções, pois o Selor vai recusá-las.

Salve e saia do arquivo. Compile o módulo MySQL do Selor:

# cd /home/progs/
# tar xjf selor_mysql_src_1.0.tar.bz2
# cd selor_mysql_1.0

Como no meu caso, o S.O. é um GNU/Linux 64 bits, a linha para compilar o módulo é:

# gcc -shared -nostartfiles selor_mysql.c -o selor_mysql.so -DA64 -lcrypt -lmysqlclient -Wall -fPIC

Se você ver o conteúdo do arquivo comp.sh, que vem com o selor_mysql, vai ver os exemplos de compilação para cada caso (Linux 32, Linux 64, FreeBSD 32 e FreeBSD 64).

Obs. 4: se você tiver problemas para compilar este módulo, é porque você não tem as libs MySQL, o MySQL-devel ou então, o compilador não está encontrando-as em /usr/lib64 ou /usr/lib64/mysql/. As libs são:libmysqlclient*

Você poderia até copiá-las para a pasta padrão, /usr/lib64 ou /usr/lib (se for 32 bits):

# cp selor_mysql.so selor_mysql.conf /usr/local/selor/mod

Crie a base de E-mails no MySQL (troque “minhasenha” por uma senha de sua preferência):

# mysql

mysql> CREATE DATABASE mail;
mysql> grant all privileges on mail.* to selor@localhost identified by ‘minhasenha’;
mysql> flush privileges;
mysql> quit

# mysql mail < selor_mysql.sql
# mkdir -p /home/mail/dominio.com.br/lucas/Maildir/new
# mkdir -p /home/mail/dominio.com.br/lucas/Maildir/cur
# mkdir -p /home/mail/dominio.com.br/lucas/Maildir/tmp
# chmod -R 755 /home/mail/dominio.com.br
# chown -R selor. /home/mail/dominio.com.br

Agora, insira um registro no banco para testarmos o servidor depois:

# mysql

mysql> use mail;
mysql> INSERT INTO domain VALUES (‘dominio.com.br’);

mysql> INSERT INTO users (mail,home,pass,maildir,date_add,time_add,domain,name) VALUES (‘[email protected]’,’/home/mail/dominio.com.br/lucas/’, encrypt(‘senha123′,’$1$9Fg5N/bT’),’Maildir’,’2014-05-10′,’00:56:00′,’dominio.com.br’,’Lucas’);

mysql> quit;

Abra o arquivo de configuração do módulo (selor_mysql.conf) e deixe-o desta forma (não se esqueça de colocar a senha que você usou no “grant all…”):

# —- Dados de conexao —-
Host=          localhost
Db=           mail
User=          selor
Pass=          minhasenha
Num_cnx=        5# —- Tabela de emails —-
User_table=       users
User_login_field=    mail
User_pass_field=    pass
User_pass_type=     crypt
User_quota_field=    quota
User_home_field=    home
User_maildir_field=   maildir
User_dlocal_field=   dlocal
Where_clause=      ok=1
#Auth_where_clause=# —- Tabela de Dominios —-
Domain_table=      domain
Domain_field=      name# —- Tabela de Alias —-
Alias_table=      aliases
Alias_field=      alias
Alias_rcpt_field=    rcpt# —- Tabela de Alias de Dominios —-
Adomain_table=     adomain
Adomain_field=     alias
Adomain_domain_field=  domain
Adomain_alias_seek=   yes#——— FIM DO ARQUIVO ———–

Você pode usar o /usr/local/selor/selor_mod_test para testar o módulo:

# cd /usr/local/selor
# ./selor_mod_test /usr/local/selor/mod/selor_mysql.so /usr/local/selor/mod/selor_mysql.conf

Digite os seguintes comandos para testar o módulo:

local dominio.com.br
auth [email protected] senha123
quit

Pode ligar o servidor SMTP:

# /etc/rc.d/rc.selor start

Teste-o com um telnet:

# telnet localhost 25

Obs. 5: você deve ver a mensagem de boas vindas do servidor:

 “220 localhost() MTA Selor 1.1” 

Digite quit, para sair

Servidor SMTP OK.
Caso o telnet não funcione, dê uma olhada em /var/log/selor/selor_wrn.log e poste aqui o erro para eu ajudá-lo.

Instalando o servidor POP3/IMAP

# cd /home/progs
# tar xzf dovecot-2.2.12.tar.gz
# cd dovecot-2.2.12
# ./configure –with-mysql
# make
# make install
# useradd dovenull
# cd /usr/local/etc/dovecot
Crie o arquivo dovecot.conf com o seguinte conteúdo:

protocols = imap pop3
listen = *, ::base_dir = /var/run/dovecot/
instance_name = dovecot
login_greeting = POP3/IMAP Server
shutdown_clients = yes
maildir_copy_with_hardlinks = yes#— AUTH
disable_plaintext_auth = no
auth_cache_size = 2048
auth_cache_ttl = 1 hour
auth_cache_negative_ttl = 0
auth_realms =
auth_default_realm =
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
auth_worker_max_count = 30
auth_mechanisms = plain# %u – username
# %n – user part in user@domain, same as %u if there’s no domain
# %d – domain part in user@domain, empty if there’s no domain
# %h – home directory

mail_location = maildir:~mail_uid = selor
mail_gid = selorfirst_valid_uid = 105
last_valid_uid = 105
first_valid_gid = 105
last_valid_gid = 105#——
default_process_limit = 100
default_client_limit = 1000
default_vsz_limit = 256M

mail_fsync = never

#—–
service imap-login {
service_count = 1
inet_listener imap {
port = 143
}
}
service pop3-login {
service_count = 1
inet_listener pop3 {
port = 110
}
}
service auth {
unix_listener auth-userdb {
user = selor
}
}

#———-
ssl = no

#———-
protocol lda {
postmaster_address = [email protected]
hostname = srv1.dominio.com.br
sendmail_path = /usr/local/selor/selor_mail
mail_plugins = quota
lda_mailbox_autocreate = yes
}

protocol imap {
mail_plugins = quota imap_quota
}

protocol pop3 {
mail_plugins = quota
}

passdb {
driver = sql
args = /usr/local/etc/dovecot/dovecot-sql.conf
}

userdb {
driver = sql
args = /usr/local/etc/dovecot/dovecot-sql.conf
}

# ——- FIM DO ARQUIVO ———

Obs. 1: não esqueça de trocar as opções postmaster e hostname, colocando corretamente o nome do seu servidor.

Crie agora, o arquivo dovecot-sql.conf com o seguinte conteúdo:

driver = mysql
connect = host=localhost dbname=mail user=selor password=minhasenha
default_pass_scheme = CRYPT
password_query = SELECT mail as name, domain, pass as password FROM users WHERE mail = ‘%u’
user_query = SELECT concat(home,’/’,maildir) AS home, uid, gid,concat(‘maildir’) AS quota FROM users WHERE mail = ‘%u’

Obs. 2: lembre-se de colocar o usuário e a senha que você usou durante a configuração da base de dados, com o comando: grant all privileges…

Crie o script de inicialização do Dovecot (/etc/rc.d/rc.dovecot) com o seguinte conteúdo:

#!/bin/sh
#############################################
# Script de controle do servidor Dovecot
# ./rc.dovecot start -> Ligar servidor
# ./rc.dovecot stop -> Parar servidor
# ./rc.dovecot restart -> Reiniciar servidor
#
#
#

ligar_dovecot() {
echo “INICIANDO Dovecot…”
/usr/local/sbin/dovecot
}
# Stop dovecot:
parar_dovecot() {
echo “Parando Dovecot…”
killall dovecot
}
case “$1” in
‘start’)
ligar_dovecot
;;
‘stop’)
parar_dovecot
;;
‘restart’)
parar_dovecot
sleep 1
ligar_dovecot
;;
*)
echo “Os parametros aceitaveis sao: $0 start|stop|restart”
esac
#——- Fim do SCRIPT ———

Dê permissão de execução para o script e ligue o Dovecot:

# chmod 555 /etc/rc.d/rc.dovecot
# /etc/rc.d/rc.dovecot start

Teste o servidor POP3 com o telnet:

# telnet localhost 110

Digite os seguintes comandos dentro do telnet:

user [email protected]
pass senha123
list
quit

Servidor POP3/IMAP pronto.

Instalação do WEBmail

Você deve estar com seu Apache (HTTP) já configurado e funcionando.

No meu caso, o DocumentRoot do Apache fica em /var/www/htdocs/. Você pode ver onde fica o seu, abrindo o httpd.conf do Apache em /etc/httpd/conf/httpd.conf, ou /etc/httpd/httpd.conf.

# cd /home/progs
# cp roundcubemail-1.0.0.tar.gz /var/www/htdocs
# cd /var/www/htdocs
# tar xzf roundcubemail-1.0.0.tar.gz
# mv roundcubemail-1.0.0 webmail
# cd webmail
# chmod 777 temp logs

Crie uma base de dados para o Roundcube:

# mysql

mysql> create database roundcubemail;
mysql> grant all privileges on roundcubemail.* to roundcube@localhost identified by “minhasenha”;
mysql> flush privileges;
mysql> quit

Agora, usando um navegador, acesse o “installer” do Roundcube.
Exemplo de endereço: http://meuservidor/webmail/installer

A primeira tela é apenas uma checagem geral do seu sistema. Não tem problema se ele disser que não encontrou algumas coisas. Clique em Next.

Na próxima tela, você pode preencher/alterar algumas informações.
Veja abaixo o que eu alterei nas seções:

  • General configuration → Não alterei nada.
  • Logging & Debugging → Desativei “Log errors”.
  • Database setup → Defini os dados da base do Roundcube que nós criamos.
  • IMAP Settings → Não alterei nada.
  • SMTP Settings → smtp_server = 127.0.0.1.
  • Display settings & user prefs → language = pt_BR.

Clique agora em: CREATE CONFIG

Será mostrado o conteúdo do arquivo de configuração config.inc.php.
Copie todo o texto do arquivo e salve no arquivo: /var/www/htdocs/webmail/config/config.inc.php

Obs.: lembre-se que /var/www/htdocs/, é o meu DocumentRoot e você deve trocar isso pelo seu.

Depois de salvar o conteúdo da configuração no arquivo, volte no navegador e clique no botão CONTINUE.

Na próxima tela, clique em Initialize Database para criar suas tabelas de controle

Feito. Agora, remova o diretório install do Roundcube:

# rm -rf install

Agora você já pode acessar o seu WEBmail.
Exemplo: http://meuservidor/webmail/

Filtros anti-Spam

O seu servidor de E-mails já está pronto.
Mas, seria muito bom criar alguns filtros básicos de corte de lixo eletrônico:Todos os filtros anti-Spam, nós devemos criar usando os arquivos de eventos (regras) do Selor.# cd /usr/local/selor

BLACKLIST mundial e SPF

Crie o arquivo referente ao evento Event.from (/usr/local/selor/rules_from) e coloque o seguinte conteúdo:

Auth? Stop!
Ip? “127.0.0.1” Stop!
Ip? “192.168.0.0/24” Stop!# — Fazendo teste de SPF —
Spf_test!
Spf_resp? “3” Reply! “550 Recusado por nao passar no SPF” Deny!
Spf_resp? “4” Reply! “550 Recusado por nao passar no SPF” Deny!# — Checando por BLACKLIST mundial —
Rbl_test! “b.barracudacentral.org zen.spamhaus.org”
Itest? “%R>0” Reply! “550 Voce esta listado em %R Blacklists. Resp: %T” Deny!# —- FIM DO ARQUIVO —

Para maiores explicações do que é cada opção, dê uma olhada na documentação do Selor.

Testes no Helo/Ehlo

Primeiro você precisa ter em mente, qual é o IP do seu servidor na Internet. No exemplo abaixo, vou supor que o IP do meu servidor seja 240.240.240.240 e seu nome seja srv1.meuservidordemails.com.

Abra o arquivo referente ao evento Event.connection (/usr/local/selor/rules_connection) e coloque o seguinte conteúdo no FINAL do arquivo:

!Ip? “240.240.240.240” !Ip? “127.0.0.1” Find_str? “%h:127.0.0.1” Deny!
!Ip? “240.240.240.240” !Ip? “127.0.0.1” Find_str? “%h:srv1.meuservidordemails.com” Deny!

Limitar e-mails nulos

A regra é: remetente nulo não pode enviar um E-mail para mais de um destinatário.

Crie o arquivo referente ao evento Event.rcpt (/usr/local/selor/rules_rcpt) e coloque o seguinte conteúdo:

From? “” Itest? “%n>1” Reply! “550 Muitos destinatarios para um remetente anonimo” Deny!

Controlar quem pode especificar um domínio interno:

Pense o seguinte: quando algum host que não se autenticou e não pertence a nossa rede local ou de servidores, conecta-se em nosso servidor SMTP para entregar uma mensagem e diz que o endereço do remetente é justamente uma conta do NOSSO servidor, a probabilidade disso ser um Spam é 99,99%.

Podemos fazer o Selor cortar isso, testando se o endereço do remetente é interno e se não foi um IP da rede local ou autenticado que está tentando enviá-lo:

Digamos que a rede dos meus servidores sejam 240.240.240.0/24.
Coloque a linha abaixo antes das regras de SPF (as que você adicionou mais acima) do arquivo /usr/local/selor/rules_from:

Internal_from? !Auth? !Ip? “127.0.0.1” !Ip? “192.168.0.0/24” !Ip? “240.240.240.0/24” Reply! “550 Voce precisa autenticar-se” Deny!

A regra acima, primeiro testa se o remetente é um domínio interno, se for, o Selor vai testar se a conexão NÃO é autenticada. Depois, se não partiu do 127.0.0.1, se não partiu da rede 192.168.0.0/24 e se não partiu da rede de meus servidores 240.240.240.0/24 e então, responde que ele precisa se autenticar para poder enviar.

Acreditem. Isto corta bastante lixo.

Obs.: nos arquivos de eventos (regras), todas as opções terminadas com “?”, são CONDIÇÕES e as terminadas com “!”, são AÇÕES. Mas, a “!” logo na frente de cada CONDIÇÃO, na verdade é um NEGADOR, ele inverte o sentido do teste, ou seja, “Auth?” é verdadeira se a conexão É autenticada e “!Auth?” é verdadeira se a conexão NÃO é autenticada.

Você pode usar as condições e ações do Selor para fazer qualquer coisa, se quiser, pode até fazer um Log de tudo que foi cortado e o motivo, usando a ação “Log!” e executar programas externos com a ação “Exec!”. Consulte a documentação do Selor e seu fórum.

O Selor tem mecanismos de defesa contra DoS também, através do evento Event.Limit, mas não vou especifica-lo aqui, para não estender muito o artigo, consulte na documentação do projeto caso você sofra esse tipo de ataque.

Quota de envio de E-mails

Podemos controlar o número de E-mails que cada cliente envia por hora, dia, semana ou mês. Isto ajuda a proteger o seu servidor de clientes que tentam enviar Spam.

# cd /home/progs
# tar xjf selor_rquota_src_1.0.tar.bz2
# cd selor_rquota_1.0
# gcc selor_rquota.c -o selor_rquota -lmysqlclient

Copie o programa, o arquivo de configuração e o arquivo .sql para o diretório do Selor:

# mkdir /usr/local/selor/uteis
# cp selor_rquota selor_rquota.conf selor_rquota.sql /usr/local/selor/uteis
# cd /usr/local/selor/uteis

Crie a base de dados no seu MySQL com um usuário e uma senha.
Vamos supor que o usuário seja “selor_user” e a senha “minhasenha”:

# mysql

mysql> create database selor_rquota;
mysql> grant all privileges on selor_rquota.* to selor@localhost identified by ‘minhasenha’;
mysql> flush privileges;
mysql> quit

Agora, vamos criar as tabelas no banco:

# mysql selor_rquota < selor_rquota.sql

Edite o arquivo selor_rquota.conf, deixando-o da seguinte forma:

Host=              localhost
Db=                selor_rquota
Table=             rquota
User=              selor
Pass=              minhasenha
User_field=       user
Sent_field=       sent
Quota_field=     quota
Quota_default=  1000

Obs.: lembre-se de colocar o usuário e senha que especificou no comando: grant all …

Abra o arquivo referente ao evento Event.from (/usr/local/selor/rules_from) e acrescente o seguinte conteúdo no COMEÇO do arquivo:

Auth? !From? “” Exec! “/usr/local/selor/uteis/selor_rquota –conf /usr/local/selor/uteis/selor_rquota.conf -c -u %f”
Exec_resp? “1” Reply! “500 Limite de envio de emails foi excedido” Deny!

Abra o arquivo referente ao evento Event.data (/usr/local/selor/rules_data) e acrescente o seguinte conteúdo no arquivo. (Note que é tudo em uma única linha):

Auth? !From? “” Exec! “/usr/local/selor/uteis/selor_rquota –conf /usr/local/selor/uteis/selor_rquota.conf -a %n -u %f -d 1000”

O valor 1000, é a quota padrão que o programa vai usar para cadastrar o remetente, caso ele ainda não esteja cadastrado.

Agora, é hora de você decidir como quer a sua quota: por hora, dia, semana ou mês. Tudo depende do intervalo em que você roda o selor_rquota com a opção -z, que ZERA os valores de e-mails enviados de todos.

Use o cron para fazer este serviço pra você.
Escolha umas das linhas do cron para a sua necessidade:

Por hora:

00 * * * * /usr/local/selor/uteis/selor_rquota -z

Por dia:

00 0 * * * /usr/local/selor/uteis/selor_rquota -z

Por semana:

00 0 * * 0 /usr/local/selor/uteis/selor_rquota -z

Por mês:

00 0 1 * * /usr/local/selor/uteis/selor_rquota -z

Está feito. Seu servidor está pronto!

Conclusão

Grande parte das opções e recursos do Selor e do Sceo, eu fiz devido a pedidos de quem os usou.

Se você tem ideias, técnicas, dúvidas ou sugestões, por favor, entre no fórum do Selor e pronuncie-se para contribuir com o projeto.

Obrigado

 

Rolar para cima