[FUGSPBR] [off-topic] badrcptto qmail

Renato Botelho rbgarga em gmail.com
Qua Set 1 07:30:06 BRT 2004


On Tue, 31 Aug 2004 16:26:13 -0000, Martin Augusto
<martin em newsite.com.br> wrote:
> Ola amigos,
> 
> Tenho um cliente que precisa restringir o envio de mensagens de maneira
> particular. Por exemplo, o usuario local fulano em dominio soh poderia enviar
> mensagens para *@dominio. Jah os demais usuarios poderiam mandar emails
> livremente.
> 
> Estou usando os patches spamcontrol no qmail e poderia habilitar essa
> funcionalidade adicionando "!*@dominio" em qmail/control/badrcptto. Porem,
> isso seria aplicado a todos os usuarios, e nao apenas para o usuario em
> questao.
> 
> Alguem sabe como eu poderia resolver isso?

Bom, tenho essa solução implementada aqui na empresa, e já postei uma
solução na lista, poreém, como fui melhorando, acho que não custa
postar novamente a solução atualizada. ;-)

Para funcionar isso estou usando qmail + SpamControl, vpopmail,
courier-imap, daemontools, qmail-scanner.

O primeiro passo é separar o qmail-smtpd pra rede interna e externa,
ou seja, tenho dois diretórios no /var/service, o smtpd-internal e o
smtpd-external, as diferenças entre eles são as seguintes:

smtpd-internal:
- Usa pop-before-smtp
- Usa uma versão alterada do qmail-scanner
(qmail-scanner-queue-internal.pl) onde eu removi o SpamAssassin, com
isso não perco tempo e nem processamento, já que os mails são internos
- Não faz nenhum tipo de checagem de DNS, nem de reverso

smtpd-external:
- Usa autenticação através do vchkpw
- Faz checagens de DNS (LOCALMFCHECK, MFDNSCHECK)
- Usa uma versão alterada do REQUIREAUTH que não permite que entrem
mails com o from @seu-dominio sem estar autenticado

Feito isso, faço o controle de envio/recebimento de determinados
usuários que só podem ser locais, fiz um script que altera o usuário,
chamei de so_mail_interno.sh, aqui vai ele

-------------------------------------------------
#!/bin/sh

if [ "$1" = ""  -o "$2" = "" ]; then
  echo "Sintaxe: $0 conta dominio [on|off]"
  exit 1
fi

CONTA=$1
DOMAIN=$2
ON_OFF=$3

VMODUSER="/usr/local/vpopmail/bin/vmoduser"

if [ ! -d /var/domains/$DOMAIN ]; then
  echo "Dominio invalido"
  exit 1
fi

if [ ! -d /var/domains/$DOMAIN/$CONTA ]; then
  echo "Conta invalida"
  exit 1
fi

case $ON_OFF in
[oO][nN])
  [ ! -e /var/domains/$DOMAIN/$CONTA/.qmail ] && \
   cd /var/domains/$DOMAIN/$CONTA && \
   cat /var/domains/dot-qmail-internal | sed "s/\|conta\|/$CONTA/g" > \
   ./.qmail && chown vpopmail ./.qmail
  ${VMODUSER} -x -u -w -i -r -q 1048576 $CONTA@$DOMAIN
  ;;
[Oo][Ff][Ff])
  [ -e /var/domains/$DOMAIN/$CONTA/.qmail ] && \
    rm -f /var/domains/$DOMAIN/$CONTA /.qmail
  ${VMODUSER} -x -u -q 10485760 $CONTA@$DOMAIN
  ;;
*)
  echo "Sintaxe: $0 conta dominio [on|off]"
  exit 1
esac

exit 0
-------------------------------------------------

Esse script poe alguns "flags" no usuário, um deles é para não
permitir relay, isso só funciona se você usar pop-before-smtp, pois
ele não adiciona esses usuários na lista de open-relay quando eles
acessam o pop.

Como você vai notar, esse script copia um arquivo
/var/domains/dot-qmail-internal, para o .qmail na home do usuário (eu
uso /var/domains, porque tenho mais espaco no /var, mas o padrão é
/usr/local/bpopmail/domains)

Aqui vai também o conteúdo desse arquivo

-------------------------------------------------
|condredirect internos em galle.com.br /var/qmail/bin/mail_interno.pl
/var/domains/galle.com.br/|conta|/Maildir/
-------------------------------------------------

Como você pode ver também, esse .qmail chama um script em perl, o
/var/qmail/bin/mail_interno.pl, e o conteúdo dele está aqui também:

-------------------------------------------------
#!/usr/local/bin/perl

exit (($ENV{'SENDER'} =~ /^[^\@ ]+\@[^ ]*\.?gall?[eiy]\.com\.br$/i) ? 2 : 0);
-------------------------------------------------

Esse script verifica se o SENDER é de um dos meus domínios locais, se
for, deixa passar, senão desvia para uma outra conta chamada internos.

Como eu alterei a função REQUIREAUTH do spamcontrol para que exija
autenticação apenas se o from for de um domínio local, quem mandar de
fora, não conseguirá mandar pra um desses usuários nem se tentar
forjar o from.

Espero não ter esquecido de nada, essa solução funciona perfeitamente
aqui, mas, como você pode ver, não é tão simples... =)

[]´s
-- 
Renato Botelho
ICQ: 54596223
AIM: RBGargaBR
_______________________________________________________________
Para enviar um novo email para a lista: fugspbr em fugspbr.org
Sair da Lista: http://lists.fugspbr.org/listinfo.cgi
Historico: http://www4.fugspbr.org/lista/html/FUG-BR/



Mais detalhes sobre a lista de discussão freebsd