Postfix: RFC 2822 sobre o limite de caracteres

A RFC 2822 nos define que toda mensagem de correio eletrônica deve possuir no máximo 1000 caracteres em cada linha, sendo 998 caracteres e 2 para o retorno de linha (CRLF).

Dessa forma, a fim de garantir que os emails em meu servidor estejam dentro dos conformes adicionei as duas linhas RegEx abaixo tanto no meu arquivo de Header_Checks quanto no Body_Checks:

/.{1001}/     REJECT Out of boundary

Adicionando na primeira linha de cada arquivo, evita-se desperdiçar tempo com verificações adicionais e possíveis exposições à exploits.

Seguindo o bom dilema… é melhor ter e não precisar usar do que precisar usar e não ter… 😀

💡 Feliz Ano Novo!!! 💡

Leia mais artigos sobre o Postfix!

Novo filtro de conteúdo para o Postfix

Atualização: 26/06/2012: Script modificado para aceitar o arquivo body_checks do postfix.

Seguindo a base dos meus filtros de conteúdo anteriores, comecei a desenvolver um novo filtro com muitas opções ainda por vir. Inicialmente, ele verifica os emails e descarta as mensagens que contenham apenas uma url e nada mais. Foi o único spam que havia passado pelos meus filtros 😉

Há a possibilidade de permitir as mensagens com apenas 1 url que sejam provenientes de um domínio específico (ou muitos, com uma regra em RegEx). Acho útil essa excessão pois muitas vezes me envio mensagens de apenas uma url como referência ou lembrete (mas o meu email não é da polônia) ^^

Agora também é possível efetuar o body_checks simples em mensagens codificadas com base64! Dispensando manter as palavras codificadas em base64 (e suas inúmeras variações) dentro do body_checks que o postfix utiliza! Contudo é preciso “converter” o seu body_checks para um novo arquivo de regras sem as linhas “REJECT” ou comentários. O que é fácil de se atingir com o comando a seguir (funciona contando que o ‘reject’ não esteja na mesma linha das regras e sim na linha abaixo, qualquer detalhe é só ajustar o arquivo manualmente depois):

# egrep -e "/.*/" body_checks | sed 's/^\///' | sed 's/\/$//' > mail_filter.bc

Um requisito para essa funcionalidade é o software mimencode, que pode ser encontrado no pacote metamail-2.7-i486-2.tgz (utilizei o pacote de instalação do slackware ;)). Com esse filtro, todas as regras que estiverem listadas no body_checks causarão o descarte ou a quarentena do email!

O filtro em seu estágio inicial pode ser visto aqui!

Leia mais artigos sobre o Postfix!

Postfix seguindo as RFC 2111 e 2396 e 2822

Inspecionando as documentações que regulamentam o formato das mensagens de email, percebi alguns detalhes que poderiam ser verificados pelo postfix para garantir a conformidade da mensagem com as definições dos cabeçalhos descritos nas RFC 2111 e 2396 e 2822.

De acordo com as descrições, criei algumas regras em RegEx para que o postfix passe a validar todas as mensagens recebidas. Elas podem ser adicionadas no header_checks.

Siga esse link para visualizar as regras: rfc_checks.txt

Com essas regras podemos assegurar que todos os clientes que nos enviem emails estejam devidamente programados e com o certificado “RFC Compliant”!!! 😀

Leia mais artigos sobre o Postfix!

Integrando ClamAV e F-Prot e avast! no Postfix!

Empolgado com a criação do filtro de conteúdo que verifica as headers From: e o Return-Path dos emails, percebi que seria interessante criar um único filtro de conteúdo para os AntiVírus, escaneando todos os emails que chegam no sistema com todos os AntiVírus que tivermos disponíveis em nossos servidores! 💡

Experimentei o ClamAV, F-Prot, avast!, AVG e Panda; todos em suas versões para linux, e dessa lista só não funcionou o AVG (que apresentou erros ao atualizar) e o Panda cuja última atualização do banco de dados de virus foi em 2005.

A idéia e o funcionamento são simples: escanear o email até encontrar um virus, e caso encontre, parar de escanear para não desperdiçar recursos. Além de utilizar os AntiVírus mais rápidos primeiro (como por exemplo o ClamAV que possui um daemon na memória, depois dele o F-Prot carrega e escaneia mais rápido que o avast!).

Esse script possui a opção de colocar os emails em quarentena e avisar o administrador por email caso algum vírus seja encontrado. Também aceita que se crie um daemon exclusivo no Postfix permitindo que seja cascateado mais um filtro de conteúdo!

O script pode ser encontrado aqui. E o suporte à outros AntiVírus pode ser adicionado facilmente derivando um dos módulos existentes dos outros scanners.

Os AntiVírus utilizados podem ser encontrados em:

http://www.clamav.net

http://www.f-prot.com/products/home_use/linux

http://www.avast.com/linux-unix-edition

Algumas notas: O avast! pede uma licensa de uso para cada usuário.. e como o nosso Postfix geralmente usa o usuário nobody, será preciso editar o /etc/passwd e apontar um diretório home para esse usuário (eu escolhi /etc) e então copiar os dados do root em ~/.avast/ para o novo /etc/.avast à cada atualização. Eu também fiz um script bacana que atualiza tanto o avast! quanto o F-Prot, e nos avisa por email quando ocorre alguma atualização. Tal qual o freshclam.sh, a atualização pode ser executada a toda hora! 😀

#!/bin/bash
# Make mail headers
echo 'From: "AntiVirus Updates" av-updates@`hostname --long`' > .update.tmp
echo "Subject: Updates `date "+%d/%m/%Y %H:%M"`" >> .update.tmp
echo "Date: `date` >> .update.tmp
echo "Message-ID: <`date +%Y%m%d%H%M%S`@`hostname`>" >> .update.tmp
echo "" >> .update.tmp
# Update ClamAV
#/etc/cron.hourly/freshclam.sh
# Update avast!
/usr/local/bin/avast-update > .update.tmp.avast 2>&1
if [ -z "`grep "No updates" .update.tmp.avast `" ]; then
  cp -r /root/.avast/* /etc/.avast/
  chgrp nobody /etc/.avast/*
  chmod g+r /etc/.avast/*
fi
# Update F-Prot
/usr/local/bin/fpupdate > .update.tmp.fprot
# If the antivirus updated, send an email!
if [ -z "`grep "No updates" .update.tmp.avast `" ]; then
  updated="yes"
  echo "##### avast! results #####" >> .update.tmp
  cat .update.tmp.avast >> .update.tmp
fi
if [ -n "`cat .update.tmp.fprot`" ]; then
  updated="yes"
  echo "##### F-Prot results #####" >> .update.tmp
  cat .update.tmp.fprot >> .update.tmp
fi
if [ "$updated" = "yes" ]; then
  sendmail -G -i -f av-updates -- root < .update.tmp
fi
rm .update.tmp*

Para não receber o email, basta comentar a linha do sendmail 🙂

Leia mais artigos sobre o Postfix!

Postfix verificando Mail From e Header From: contra spams.

Finalmente, depois de muita pesquisa e algum desenvolvimento, construí mais uma poderosa arma na batalha travada contra a disseminação de Spam, virus e pishing em nossos emails! 💡

Com funcionamento simples e objetivo, essa nova ferramenta expande os recursos das verificações do Postfix verificando se o comando de identificação de remetente no smtp (mail from: email.com) corresponde exatamente com o email indicado no cabeçalho do remetente da mensagem enviada (From: email.com)!

É possível instalá-lo mesmo que o seu postfix já utilize algum filtro de conteúdo (content_filter), sendo necessário nesse caso adicionar a verificação adicional dentro do content_filter de re-injeção da mensagem do seu filtro de conteúdo.

O script acompanha instruções simples de instalação e pode ser obtido aqui!

Leia Mais Artigos Relacionados ao Postfix!

Verificando as Headers Received-SPF: com RegEx.

Como escrito em um rascunho sobre a requisição de comentário da estrutura de política de remetentes. (Em outras palavras… Como escrito nesse Draft sobre a RFC do SPF). Foi definido que os servidores devem verificar a validade dos cabeçalhos Received-SPF, garantindo que o mesmo tenha um tamanho aceitável e não possua caracteres inválidos e ou dados maliciosos. (SPF clients MUST make sure that the Received-SPF header does not contain invalid characters, is not excessively long, and does not contain malicious data that has been provided by the sender.)

A dúvida porém é o que seria considerado excessivamente longo? O padrão POSIX 1003.1-2001 define que os domínios deverão ter no máximo 64 caracteres (com excessão do ponto de terminação) enquanto a RFC 2181 define um máximo de até 255 caracteres (incluindo o ponto de terminação). Pensando a respeito, acredito que o domínio deva ter limite de 64 caracteres enquanto o domínio com seus subdomínios (inclui ponto de terminação) deva ser 255 caracteres. 😉

Seguindo essa idéia, criei algumas regras com RegEx que verificam e permitem o envio de mensagens com cabeçalhos Received-SPF válidos e nega o que não se encaixa no padrão.

As regras podem ser visualizadas nesse link.

Leia Mais Artigos sobre o Postfix!

Testando meu servidor SMTP …

Como me é peculiar, a cada nova idéia acerca de uma implementação em meu Postfix ocorre uma imensa bateria exaustiva de testes no mesmo, com todos os comandos executados via telnet…

Não que por conta disto eu já tenha criado calos nos dedos de tanto digitar helo, mail from, rcpt to, data, enter-ponto-enter, ou tivesse tido pesadelos em um lugar escuro onde uma voz sinistra dizia “erro 470, muitos erros!!” e me desconectava por um simples erro de digitaão… 😆

Mas por esses e futuros motivos resolvi criar um script que facilitará todas as minhas afortunadas aventuras! 💡

É um software muito simples e rudimentar, ainda sequer salva as opções se alteradas… mas preencher o formulário uma vez e apenas clicar em Enviar diversas vezes quantas forem necessárias já é um grande prazer 😀

O download pode ser obtido em meu Live! SkyDrive, e deixo aqui meus agradecimentos ao Grupo de Pesquisas Stephan, do Departamento de Química da Universidade de Toronto pelo ícone bacana de email disponibilizado no site deles!