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 |
|
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 Obs. 1: se ele reclamar da libcap. Você tem duas opções: 1. Procurar e instalar a libcap/libcap-devel. # 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 Edite o arquivo de configuração do servidor (/usr/local/selor/selor.conf): # cd /usr/local/selor 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/ 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 mail < selor_mysql.sql Agora, insira um registro no banco para testarmos o servidor depois: # mysql mysql> use mail; 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 Digite os seguintes comandos para testar o módulo: local dominio.com.br 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. |
|
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/dovecotCrie 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 #—– #———- #———- protocol imap { protocol pop3 { passdb { userdb { # ——- 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 Teste o servidor POP3 com o telnet: # telnet localhost 110 Digite os seguintes comandos dentro do telnet: user [email protected] 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 Crie uma base de dados para o Roundcube: # mysql mysql> create database roundcubemail; Agora, usando um navegador, acesse o “installer” do Roundcube. 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.
Clique agora em: CREATE CONFIG Será mostrado o conteúdo do arquivo de configuração 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. |
|
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 SPFCrie 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/EhloPrimeiro 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 nulosA 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. 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 Copie o programa, o arquivo de configuração e o arquivo .sql para o diretório do Selor: # mkdir /usr/local/selor/uteis Crie a base de dados no seu MySQL com um usuário e uma senha. # mysql mysql> create database selor_rquota; Agora, vamos criar as tabelas no banco: # mysql selor_rquota < selor_rquota.sql Edite o arquivo selor_rquota.conf, deixando-o da seguinte forma:
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ê. 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ãoGrande 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 |