segunda-feira, 15 de janeiro de 2007

Greylisting usando spamd (OpenBSD) em modo bridge - Parte 2

E então? Foi complicada a instalação do OpenBSD?
A princípio, pode assustar (principalmente o particionamento :) ), mas, prometo que agora será mais leve!

Vamos à configuração do nosso greylisting.

Primeiramente, precisamos habilitar o sistema operacional a repassar pacotes de uma interface para a outra, e, além disso, habilitar a ativação do packet filter no boot.
Edite o /etc/sysctl.conf e descomente a seguinte linha:

net.inet.ip.forwarding=1 #1=Permit forwarding (routing) of packets


Edite também o arquivo /etc/rc.conf e adicione a seguinte linha:

pf=YES #Enable PF


Agora, partiremos para a configuração da Bridge.
Para cada interface de rede, é necessário criar um arquivo de configuração. Para a interface xl0, que será ligada à Internet, crie o arquivo /etc/hostname.xl0 . Edite o arquivo e adicione o seguinte (lembre-se o que combinamos no post anterior: no lugar dos IPs representados por letras deve ser usado um IP válido na Internet):

inet aaa.bbb.ccc.ddd 255.255.255.0 NONE


O IP usado na interface externa (xl0) deve pertencer à mesma sub-rede dos seus servidores de e-mail.

Agora para a interface xl1, crie o /etc/hostname.xl1 e adicione no arquivo:

inet 192.168.10.10 255.255.255.0 NONE


E, na interface xl2, crie o /etc/hostname.xl2 e adicione no arquivo:

inet 192.168.10.11 255.255.255.0 NONE


Agora, devemos colocar todas estas interfaces como parte da bridge. Para isso, crie o arquivo /etc/bridgename.bridge0 e adicione o seguinte:

add xl0
add xl1
add xl2
up


Agora, é necessário configurar o spamd. Para isso, edite o arquivo /etc/rc.conf e habilite as seguintes configurações:

spamd_flags="-v -G 25:4:864" #para entender esses números, leia o manual do spamd (man spamd)
spamd_grey=YES # use spamd greylisting if YES
spamlogd_flags="" # use eg. "-i interface" and see spamlogd(8)


O spamd pode consultar listas públicas onde são cadastrados domínios que já enviaram Spam. Isso pode ser configurado no arquivo /etc/spamd.conf . Eu nunca testei essas consultas pois faço isso em outro momento no sistema. Minha configuração é a seguinte:

all:\
:blacklist:whitelist:
whitelist:\
:white:\
:method=file:\
:file=/etc/whitelist.conf:
blacklist:\
:black:\
:msg="SPAM. Your address %A is blocked":\
:method=file:\
:file=/etc/blacklist.conf:


É muito importante que você leia o manual do spamd.conf e entenda o que quer dizer cada linha desta, e, principalmente, como estas listas branca e negra se anulam. Basicamente, nesta configuração, estou dizendo em qual arquivo estão os IPs que não precisam ser filtrados (whitelist) e em qual arquivo estão os IPs dos quais não quero receber e-mail de maneira alguma (blacklist). Mesmo que não os utilize, crie os arquivos whitelist.conf e blacklist.conf

touch /etc/whitelist.conf
touch /etc/blacklist.conf


Agora, a parte mais divertida e elaborada desta implementação: a configuração do pf! Adianto que ela não foi desenvolvida por mim, mas sim por Graham Toal, da Universidade do Texas. O link onde ele disponibilizou isso não está mais no ar. Portanto, coloco aqui para prosperar a criação de Graham (que não é o Bell, mas sim o Toal. Thanks Graham! (os dois!) ). Enfim, fiz apenas algumas pequenas adaptações para facilitar o entendimento do arquivo, o qual está a seguir. Edite o /etc/pf.conf e copie para lá a seguinte configuração, adaptando para o seu cenário. Vou configurar o arquivo de acordo com o nosso:

# $OpenBSD: pf.conf,v 1.29 2005/08/23 02:52:58 henning Exp $
#
# See pf.conf(5) and /usr/share/pf for syntax and examples.
# Remember to set net.inet.ip.forwarding=1 and/or net.inet6.ip6.forwarding=1
# in /etc/sysctl.conf if packets are to be forwarded between interfaces.

#variaveis

ext_if="xl0" #ligada a Internet
int_if= "{ xl1, xl2 }" #interfaces da maquina. Temos tres: uma para entrada da internet
# e outras duas para ligar cada um dos dois MX's.

ip_local="aaa.bbb.ccc.ddd" #esse é o ip pelo qual você consegue conectar na bridge
mail_server= "{ eee.fff.ggg.hhh, iii.jjj.kkk.lll }" #IPs dos MXs que estao atrás da brigde

#Maquinas ou redes da sua instituicao permitidas a acessar servicos no $mail_server

ip_snmp= "{ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx }" #esses IPs podem ter aceso à porta SNMP dos #$mail_server
ip_ssh= "{ xxx.xxx.0/24, xxx.xxx.xxx.0/24, xxx.xxx.xxx.0/24 }" #IPs podem ter acesso à porta SSH #dos $mail_server


#Tabelas usadas em conjunto com o spamd
table < spamd > persist file "/etc/blacklist.conf"
table < spamd-white > persist
table < whitelist > persist file "/etc/whitelist.conf"

set block-policy drop

#Aumentar o limite de entradas nas tabelas (Padrao: 100000)
set limit table-entries 500000

scrub on $ext_if reassemble tcp no-df random-id

# testes de redirecionamento para o spamd

# Está na whitelist? - Então passe sem ser tocado
no rdr on $ext_if \
inet \
proto tcp \
from < whitelist > \
to any

# Se chegou aqui, não está em whitelist. Está na blacklist?
# Redireciono para o spamd, o qual vai "gastar o tempo" do spammer
# e no final da "interação smtp" dirá que ele está na blacklist

rdr on $ext_if \
inet \
proto tcp \
from < spamd >\
to any \
port smtp -> 127.0.0.1 port spamd

# ainda não está na tabela dinâmica spamd-white
# redireciono para o spamd que vai tratar a mensagem

rdr on $ext_if \
inet \
proto tcp \
from !< spamd-white > \
to any \
port smtp -> 127.0.0.1 port spamd

#bloquear tudo por padrão
block in all
block out all

#libera conexao do localhost para porta de configuracao do spamd 8026
pass in quick proto tcp from 127.0.0.1 to 127.0.0.1 port 8026

#liberar ICMP
pass in quick on $ext_if proto icmp from any to any

#liberar SSH para IPs contidos nas variáveis

pass in quick on $ext_if proto tcp from $ip_ssh to $mail_server port 22 keep state
pass in quick on $ext_if proto tcp from $ip_ssh to $ip_local port 22 keep state


#SNMP

pass in quick on $ext_if proto udp from $ip_snmp to $mail_server port 161 keep state
pass in quick on $ext_if proto tcp from $ip_snmp to $mail_server port 161 keep state
pass in quick on $ext_if proto udp from $ip_snmp to $ip_local port 161 keep state
pass in quick on $ext_if proto tcp from $ip_snmp to $ip_local port 161 keep state


# permitir especificamente os pacotes que foram redirecionados acima
pass in quick on $ext_if \
inet \
proto tcp \
from < whitelist > \
to port smtp

# Pacotes permitidos passam diretamente para o mail_server
# ou seja, já estão na tabela dinâmica spamd_white

pass in quick on $ext_if \
inet \
proto tcp \
from < spamd-white > \
to port smtp


pass in on $ext_if \
route-to lo0 \
inet \
proto tcp \
from any \
to 127.0.0.1 \
port spamd

pass out quick on $ext_if \
inet \
proto tcp \
from $ext_if \
to any \
port smtp \
flags S/SA \
keep state

pass out quick on $int_if \
inet \
proto tcp \
from $int_if \
to any \
port smtp \
flags S/SA \
keep state

pass out keep state

pass quick on { lo xl0 xl1 xl2 } #nomes das interfaces. Adapte para sua configuracao.
#Mantenha lo

antispoof log quick for { lo xl0 xl1 xl2 } #nomes das interfaces. Adapte para seu caso.
#Mantenha lo


Agora, é necessário ativar a atualização da tabela do pf pelo spamd, adicionando uma entrada no crontab. Para isso, como root, faça o seguinte:

#crontab -e


E, no arquivo, adicione as linhas:

#atualizacao spamdb
5 * * * * /usr/libexec/spamd-setup



Esta é toda a configuração necessária. Reinicie a máquina para que elas "entrem em vigor"! :D

Agora, antes de colocar em produção, faça testes enviando e-mail de fora da sua rede. Diminua os tempos configurados no /etc/rc.conf para que seu teste não demore muito (ao invés de 25 minutos como coloquei, coloque 1 minuto. Não use o valor de 1 minuto em produção. Será pouco efetivo. Eu utilizo estes valores que mostrei).

Dicas de comandos úteis

Leia os seguintes manuais
- man spamd
- man spamd-setup
- man spamdb
- man spamd.conf

Comandos do pf
- Adicionar endereço IP na tabela spamd-white:
pfctl -t spamd-white -T add xxx.yyy.zzz.www

- Ver as regras carregadas:
pfctl -s rules

- Testar o arquivo pf.conf antes de carregá-lo
pfctl -nf /etc/pf.conf

- Carregar o arquivo de configuração /etc/pf.conf
pfctl -f /etc/pf.conf


Boa sorte nas configurações! Torço para que seja útil!

Um comentário:

Marcus Vinicius disse...

Parabens, muito legal e útil seu artigo. I love OpenBSD!

No aguardo de mais sobre o puffy =)