Servidor Antispam con SpamAssassin

Improvisa :: Informática :: Servidor AntiSpam con SpamAssassinImprovisa :: Servidor Antispam SpamAssassin­El presente documento, manual, howto o como querais llamaralo, intentará explicar como montar una pasarela antispam y antivírica para cualquier sistema o sistemas de correo que tengas implantados en la actualidad.

La instalación se realizará sobre una máquina diferente a las que tengamos, por lo menos en el ejemplo que yo propongo aquí.

Lo bueno de esta solución es que no tendremos que tocar los servidores que tengamos en producción para implantarles una nueva protección y además nos valdrá para los sistemas de correo y dominios que queramos.

El manual explicará como realizar la instalación del servidor para que pase a cada uno de los distintos servidores ayudándose de Bind sobre el magnífico sistema operativo Debian, la gestión de los mensajes la llevarán Postfix y SpamAssassin.

Manos a la obra …. ­

 

Para que nos entendamos la mejor solución es pintar un antes y un despues:

Os pintaré mi ejemplo:

ANTES:

ADSL1 -> EXCHANGE(AS: GFI MailEssen.., AV: Etrust) con 4 dominios.
ADSL2 -> POSTFIX(AS: SpamAssassin, AV: Clamav) con 19 dominios.

DESPUES:

                                                      -> EXCHANGE 
ADSL1 --> NUEVO (SpamAssassin, Clamav) --RED_PRIVADA--|
                                                      -> POSTFIX

 

Con mi solución anterior el porcentaje de virus que quitaba era casi del 100 % en los dos sistemas, pero el Spam, ay! el Spam, maldito Spam, se me colaba muchísimo en los dos sistemas, si que es verdad que muchísimo menos en la máquina que corre en Linux, pero el porcentaje es alto. Teniendo en cuenta que por lo menos el 80% de correo que recibo en los dos sistemas es Spam, es normal que algo se cuele.

Los beneficios de la nueva solución son bastantes, le he quitado trafico a mi segunda adsl, para dárselo a mi primera adsl (el servicio de correo en mi caso es menos crítico en cuanto a tiempo se refiere). No quito ninguna de las soluciones anteriores, siguen intentando quitarme Spam, aunque lo haga la pasarela, si a esta se le cuela alguno los servicios antispam de cada una de las máquinas intentaran quitarlo del medio.

Los únicos cambios que debemos hacer en las segundas máquinas serán muy simples, decirle a los respectivos servicios antispam que todo lo que venga marcado en el asunto con *****SPAM*****, lo considere spam y haga lo que nosotros queramos.

Para que la pasarela sepa donde tiene que enviar cada uno de los correos  utilizaremos bind, si ya lo tenemos instalado lo utilizaremos, sino enseñaremos como utilizarlos con las distintas vistas, locales y externas.

Pongamonos manos a la obra:

Aclaraciones Iniciales:

Lo que está en NEGRITA es lo que yo escribo.
Lo que está en CURSIVA es lo que me responde Debian.

Ojo con los saltos de linea en los archvios de configuración.

Hardware utilizado:

Mi máquina es una muy simple, dependiendo del tráfico que tengan vuestros servidores de correo necesitareies mas o menos maquina, tened en cuenta que SpamAssassin necesita recursos.

Sistema Operativo:

Como siempre, la versión estable de Debian, en este momento, Debian 4.0.

Instalación de Bind9 para la resolución interna de nombres.

Este paso, en mi caso, ya lo tenía hecho, pero es imprescindible para que la resolución de nombres (DNS) que utilizará la maquina AntiSpam sea la correcta. Yo os cuento como lo tengo hecho y vosotros sacareis lo que necesitéis.

Yo tengo alojados en mi servidor de nombres 23 dominios, resuelven direcciones para Internet,para mi red interna y para la red de Guadawireless, es decir 3 distintas resoluciones dependiendo de donde venga la petición, os lo explico con un pequeño gráfico:

Internet ————-> www.improvisa.com ———-> 88.22.247.57
Interna ————–> www.improvisa.com ———-> 192.168.11.7
Guadawireless ——–> www.improvisa.com ———-> 10.34.156.66

A partir de ahora ya solo hablaremos de Internet y de la red Interna, para no liar más la instalación, quede claro que podremos resolver nombres como nos venga en gana y con el numero de redes que queramos.

Cuando, por ejemplo, gmail quiere mandar un correo a improvisa, hace una petición DNS a mi servidor de nombres y le pregunta cual es mi entrada MX, yo le digo la correspondiente resolución (88.22.247.57, porque viene de la red de Internet) y el se pone en contacto con la máquina Antispam que estamos creando. La maquina Antispam estará configurada para hacer relay (permitirá envío de mails a dominios que no tiene ella misma alojados) al dominio Improvisa, y preguntará a su servidor de nombres donde está el MX de Improvisa, y aquí le diremos que es la 192.168.11.7. De esta forma todas las resluciones cara a Internet tendrán la misma dirección 88.22.247.57, pero internamente cada dominio tendrá su servidor de correo, improvisa.com el 192.168.11.7 y por ejemplo jc5.com tendrá la 192.168.11.13. Espero que quede claro :-S.

Vosotros si no queréis resolver cara a internet tendréis solo tendréis que configurarlo para el servidor de antispam.

Para instalar el servidor de nombres teclearemos lo siguiente:

antispam:/# apt-get install bind9

Debian estructura los archivos de la siguiente manera, el archivo madre por así llamarlo es /etc/bind/named.conf, este llama a /etc/bind/named.conf.local, que es donde deberemos hacer los cambios, y en /var/cache/bind/nombrededominio.com.zone sera donde editeremos la resolución de los nombres. Vamos a ello, utilizaremos para ello el dominio Improvisa.

Debemos saber diferenciar tipos de vista y tipos de lista, la acl (lista) LAN resolverá con la vista que llamaremos interna y los demás con la vista externa.

Editeremos el archivo /etc/bind/named.conf.options y lo dejaremos como sigue (haced vuestros cambios)

antispam:/# vi /etc/bind/named.conf.options

 acl "transfer_permitidos"
  {
   80.35.110.14;
   87.216.20.218;
   localhost;
  };

acl "recursion_permitidos"
  {
  localhost;
  };

acl "lan" //Red de Interna
        {
        10.19.4.0/24;
        };


options {
        directory "/var/cache/bind";

        forwarders {
                130.206.1.3;
                195.53.20.2;
                195.53.20.3;
         };
        // Permite transferencias de zona sóa los indicados:
        allow-transfer
        {
                transfer_permitidos;
        };

        // Permite preguntas recursivas sóa los indicados:
        allow-recursion
        {
                recursion_permitidos;
                lan;
        };

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

Muy bien, os explico ahora todo esto, hemos creado tres ACL (Listas) transfer_permitidos, recursion_permitidos, lan. Las ips que aparecen en transfer_permitidos son a las que permitimos que copien nuestra configuración para ser servidores secundarios de nombres (por si algún día se nos cae el servicio el servidor de nombres secundario hará ese trabajo por nosotro, importantísimo si resolvemos cara a internet y no queremos perder nada). recursion_permitidos permitirá hacer preguntas recursivas a quien le digamos (en nuestro caso solo a la LAN que es otra ACL, se pueden usar ACL dentro de otras, siempre habiendolas definido antes), y en la Lista ACL definiremos nuestra red interna.

Los forwarders serán los que resuelvan peticiones que nosotros no tenemos, si un cliente nos pregunta por www.google.es nosotros se lo preguntaremos a nuestro primer forwarder el cual nos contestará (tenga o no tenga el la dirección utilizará un forwarder al igual que nosotros) y se la daremos a nuestro cliente.

Ahora debemos crear las vistas en el archivo named.conf.local

antispam:/# vi /etc/bind/named.conf.local

view "interna"
        {
        match-clients
                {
                lan;
                };

    zone "improvisa.com" {
        type master;
        file "/var/cache/bind/interna/improvisa.com.zone";
        };
};
view "externa"
        {
        match-clients
                {
                any;
                };

        zone "247.22.88.in-addr.arpa" {
        type master;
        file "/var/cache/bind/externa/57.247.22.88.zone";
        };

        zone "improvisa.com" {
        type master;
        file "/var/cache/bind/externa/improvisa.com.zone";
        };

};

Dependiendo de que cliente (ip del cliente) nos haga la pregunta le responderemos de una forma u otra, fijaros en view interna y view externa (match-clients LAN o any) La vista interna debe ir antes que la externa ya que el comprueba de arriba a abajo, si entrase primero en externa como esta en match-clients any ya nos resolvería con la vista externa.

Si os fijáis la zona "247.22.88.in-addr.arpa" será la que haga la resolución inversa, la mayoría de nuestras ips (al ser de telefónica u otro ISA) no lo permiten a no ser que paguemos, yo aun así os lo pongo por si lo necesitáis.

Con estos cambios el archivo madre, hemos definido que dominios tenemos resolvemos, ahora tenemos que definir cada sitio, vamos a ello editando el archivo /var/cache/bind/externa/improvisa.com.zone (empezaremos con la externa)

antispam:/# cd /var/cache/bind/
antispam:/var/cache/bind# mkdir externa

Hemos creado el directorio, creemos el archivo:

antispam:/# vi /var/cache/bind/externa/improvisa.com.zone

;
; ACORDARSE DEL SERIAL SINO LOS ESCLAVOS NO ACTUALIZAN
;
;
$TTL 172800
;@       IN      SOA     ns1.improvisa.com.      juanmi.improvisa.com. (
                        2007082101   ; Serial
                        7200         ; Refresh (2 horas)
                        1800         ; Retry (30 minutos)
                        2419200      ; Expire (4 semanas)
                        172800 )     ; Negative Cache TTL (2 días)
;
;@               IN      NS      ns1.improvisa.com.
;@               IN      NS      ns2.improvisa.com.
;@               IN      MX      10 mx1.improvisa.com.
;@               IN      MX      20 mx2.improvisa.com.
;@               IN      MX      30 mx3.improvisa.com.
;
;@               IN      A       88.22.247.57
ns1             IN      A       88.22.247.57
ns2             IN      A       80.35.110.14
mail            IN      A       88.22.247.57
mx1             IN      A       2.125.13.132
mx2             IN      A       80.35.110.14
mx3             IN      A       88.22.247.57
www             IN      A       88.22.247.57
; ALIAS
ns              IN      CNAME   ns1 

 

¿Que significa todo esto? vamos a ver ns1 y ns2 son los nombres que dí de alta cuando compre el dominio y tienen las ips correspondientes a mis servidores de nombre, ns1 es mi propia ip y ns2 la de un amiguete que me hace de secundario (le permití arriba en acl "transfer_permitidos")

Los servidores de correo se definen con las entradas "@               IN      MX      10 mx1.improvisa.com." En mi caso me hacen de servidores esclavos dos servidores mas (a lo mejor no es vuestro caso y solo debéis definir uno).

El resto de nombres mail, www, son servidres web, os he dejado también un alias de ejemplo, llamar a ns es lo mismo que llamar a ns1.

Debemos darle permisos:

antispam:/var/cache/bind# chown root:bind -R externa/
antispam:/var/cache/bind# chmod 775 -R externa/

Creemos ahora la zona recursiva (pregunto por la ip y me dice el nombre), solo a modo de tutorial, ya que como sabemos telefónica, y los principales operadores en el país no nos darán este servicio a no ser que paguemos.

antispam:/# vi /var/cache/bind/externa/57.247.22.88.zone

 $TTL 172800
;@       IN      SOA     ns.improvisa.com.      juanmi.improvisa.com. (
                        2006121501   ; Serial
                        7200         ; Refresh (2 horas)
                        1800         ; Retry (30 minutos)
                        2419200      ; Expire (4 semanas)
                        172800 )     ; Negative Cache TTL (2 días)
;
;@   IN NS  ns1.improvisa.com.
57  IN PTR ns1.improvisa.com.

 
Lo único que definimos es nuestra maquina (la 57) dentro de la red 88.22.247, de esta forma si preguntamos: host 88.22.247.57 nos respondera ns1.improvisa.com. Recordad que no funciona, si lo hacéis os respondera 57.247.22.88.in-addr.arpa domain name pointer 57.Red-88-22-247.staticIP.rima-tde.net.

    
Creemos ahora la vista interna:

antispam:/# cd /var/cache/bind/
antispam:/var/cache/bind# mkdir interna

vi /var/cache/bind/externa/improvisa.com.zone

 

$TTL 172800
;@       IN      SOA     ns1.improvisa.com.      juanmi.improvisa.com. (
                        2007082101   ; Serial
                        7200         ; Refresh (2 horas)
                        1800         ; Retry (30 minutos)
                        2419200      ; Expire (4 semanas)
                        172800 )     ; Negative Cache TTL (2 días)
;
;@               IN      NS      ns1.improvisa.com.
;@               IN      MX      10 mx1.improvisa.com.
;
;@               IN      A       192.168.0.15
ns1             IN      A       192.168.0.15
mail            IN      A       192.168.0.13
mx1             IN      A       192.168.0.13
www             IN      A       192.168.0.13
; ALIAS
ns              IN      CNAME   ns1

 

 

Si os fijáis los cambios son que ya no dispongo de otros servidores de nombres ni de otras maquinas de correo.

La ip de servidor de nombres es la 192.168.0.15 y la del servidor de correo Postfix, que tiene alojado a Improvisa es 192.168.0.13

Démosle permisos

antispam:/var/cache/bind# chown root:bind -R interna/
antispam:/var/cache/bind# chmod 775 -R interna/

Muy bien una vez que hemos realizado estos cambios reiniciemos el servicio y hagamos unas pruebas:

antispam:/# /etc/init.d/bind9 restart
Stopping domain name service…: bind.
Starting domain name service…: bind.

antispam:/# host www.improvisa.com 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

www.improvisa.com has address 88.22.247.57

antispam:/# host www.improvisa.com 192.168.1.15
Using domain server:
Name: 192.168.1.15
Address:
192.168.1.15#53
Aliases:

www.improvisa.com has address 192.168.0.13

Si os fijáis ya está discriminando por las listas ACL como le estamos preguntando a la 127.0.0.1, que no pertenece a la LAN, se está metiendo en la lista externa, pero si le preguntamos a su ip local (192.168.0.15) si pertenece a la lista LAN y no s contesta como queremos. Ahora solo nos falta añadir bien los dominios y definir bien en que direcciones IP internas se encuentran nuestros servidores de correo.

Comencemos con la instalación de Postfix.

Instalación de Postfix:

Para toda la gestión de correo utilizaremos a Postfix, el nos recibirá todos los mensajes y se encargará de encolarlos en la pila de Amavis, para su análisis de virus y luego se lo pasará al demonio de SpamAssassin para que compruebe si es Spam, una vez marcado el mensaje con su cabecera correspondiente (spam o ham) se lo pasara al servidor de correo que convenga, mediante la resolución interna de nombres con Bind.

Para instalar Postfix haremos lo siguiente:

antispam:/# apt-get install postfix

Si tenemos instalado Exim, que es lo mas probable, nos lo desinstalará.

Postfix guarda sus configuraciones en dos archivos, /etc/postfix/main.cf y /etc/postfix/master.cf. Por ahora dejaremos estas configuraciones sin tocar, ya que estas vendrán una vez hayamos instalado los demás paquetes.

Instalación de Amavis y Clamav y Configuración.

Debemos cambiar los repositorios para que la instalación de Clamav sea la óptima para el sistema, el repositorio es oficial de Debian y no nos causara ningún problema:

antispam:/# vi /etc/apt/sources.list

Y lo dejamos así:

deb http://ftp.rediris.es/debian/ etch main non-free
deb-src http://ftp.rediris.es/debian/ etch main non-free

deb http://ftp2.de.debian.org/debian-volatile etch/volatile main

deb http://security.debian.org/ etch/updates main non-free
deb-src http://security.debian.org/ etch/updates main non-free

Hemos añadido la tercera linea, de donde se bajará las actualizaciones del antivirus y los repositorio non-free y contrib a los originales, necesitaremos descargar urar y algunos descompresores de archivo no libres, para que nuestro antivirus descomprima archivos y busque virus en ellos.

Actualicemos los repositorios e instalemos:

antispam:/# apt-get update
antispam:/# apt-get install amavisd-new clamav clamav-daemon zoo unzip bzip2 unzoo lzop lha arj unrar cabextract

Con esto instalaremos el antivirus, su actualizador, y la pasarela entre postfix y el antivirus (amavis), si nos da algún error de FQDN, revisad los archivos /etc/hostname y /etc/hosts.

La configuración de Amavis es algo compleja por su gran número de posibilidades, todos los archivos de configuración están metidos dentro de la carpeta /etc/amavis/conf.d

Iré repasando los cambios que he realizado en cada uno:

En /etc/amavis/conf.d/01-debian No he tocado nada

En /etc/amavis/conf.d/05-domain_id No he tocado nada

En /etc/amavis/conf.d/05-node_id No he tocado nada

En /etc/amavis/conf.d/15-av_scanners Si que se han realizado cambios:
Este archivo se divide en dos en av_scanners y en av_scanners_backup en las dos partes solo he dejado sin descomentar lo relacionado con clamav, os dejo como me ha quedado, solo lo NO comentado:

 use strict;
;@av_scanners = (
 ['ClamAV-clamd',
   &ask_daemon, ["CONTSCAN {} ", "/var/run/clamav/clamd.ctl"],
   qr/OK$/, qr/FOUND$/,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ]
);


;@av_scanners_backup = (
  ['ClamAV-clamscan', 'clamscan',
    "--stdout --disable-summary -r --tempdir=$TEMPBASE {}",
    [0], qr/:.*sFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ]
);


1;

Ojo al editar el archivo con los cierres de parentesis y las comas.

En /etc/amavis/conf.d/15-content_filter_mode No he realizado cambios.

En /etc/amavis/conf.d/20-debian_defaults Si se han realizado cambios en alguna variable, dejo las que he modificado:

 

 

$sa_tag_level_deflt  = 0.1;
$sa_tag2_level_deflt = 5.0;
$virus_admin = "antispam@improvisa.com";
$virus_quarantine_to = "antispam@improvisa.com"; # Si falta añadir
$spam_quarantine_to = "antispam@improvisa.com"; # Si falta añadir

#  qr'{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}}?'i, # Windows Class ID CLSID
, strict
#  qr'^application/x-msdownload$'i,                  # block these MIME types
#  qr'^application/x-msdos-program$'i,
#  qr'^application/hta$'i,
#  qr'..(exe|vbs|pif|scr|bat|cmd|com|cpl)$'i, # banned extension - basic
 qr'..(mim|b64|bhx|hqx|xxe|uu|uue)$'i,  # banned extension - WinZip vulnerab.
#  qr'^.(exe-ms)$',                       # banned file(1) types

 

 

 

Si la linea aprece comentada es porque en el original venia sin comentar y la he comentado.

En /etc/amavis/conf.d/25-amavis_helpers No he realizado cambios.
En /etc/amavis/conf.d/30-template_localization No he realizado cambios.

Solo utilizaremos a Amavis para buscar virus, no para buscar Spam eso lo haremos directamente con Postfix

Una vez configurados todos los archivos reiniciemos el demonio:

antispam:/# /etc/init.d/amavis restart

Sobre los archivos de configuración de Clamav podemos reseñar un cambio que si queréis podéis hacerlo, en el archivo /etc/clamav/freshclam.conf podemos decirle que mire los repositorios de actualización cada mas o menos horas en la variable Checks

Debemos añadir el usuario Clamav al grupo Amavis:

antispam:/# adduser clamav amavis

Instalación de SpamAssassin:

Para instalar SpamAssassin debemos teclear lo siguiente:

antispam:/# apt-get install spamassassin

Aceptad las dependencias y empecemos a configurarlo.

Utilizaremos SpamAssassin como demonios es decir tendremos que tocar el archivo /etc/default/spamassassin y cambiar Enabled a 1 y un par de cosas mas:

Os dejo los cambios:

antispam:/# vi /etc/default/spamassassin

ENABLED=1
OPTIONS="-m 5 -H -u spamd –nouser-config"
NICE="–nicelevel 19"

Antes de reiniciar el demonio debemos crear el grupo y el usuario:

antispam:/# groupadd spamd
antispam:/# useradd -g spamd -s /bin/false -c "spamd" -m -d /var/lib/spamassassin/bayes spamd

Creamos el usuario spamd y le colocamos como home el directorio /var/lib/spamassassin/bayes que sera donde coloquemos la base de datos bayesiana.

Debemos modificar el archivo de configuración de SpamAssassin:

Os dejo lo que he modificado:

antispam:/# vi /etc/spamassassin/local.cf

rewrite_header Subject *****SPAM*****
report_safe 1
required_score 5.0
use_bayes 1
bayes_auto_learn 1

bayes_learn_during_report  1 # Si no está añadir
bayes_path /var/lib/spamassassin/bayes # Si no está añadir
bayes_auto_expire 1 # Si no está añadir
bayes_expiry_max_db_size 1500000 # Si no está añadir
bayes_journal_max_size 102400 # Si no está añadir
bayes_use_hapaxes 1 # Si no está añadir
skip_rbl_checks 0 # Si no está añadir
use_dcc 0 # Si no está añadir
use_pyzor 0 # Si no está añadir
use_razor2 0 # Si no está añadir

ok_languages            es
score DRUGS_ANXIETY 2.100
score DRUGS_ANXIETY_EREC 2.100
score DRUGS_ANXIETY_OBFU 3.964
score DRUGS_DIET 2.100
score DRUGS_DIET_OBFU 2.100
score DRUGS_ERECTILE 2.100
score DRUGS_ERECTILE_OBFU 2.100
score DRUGS_MANYKINDS 2.734
score DRUGS_MUSCLE 2.100
score DRUGS_PAIN 2.100
score DRUGS_PAIN_OBFU 2.431
score DRUGS_SLEEP 2.100
score DRUGS_SLEEP_EREC 2.719
score DRUGS_SMEAR1 2.100
score DRUG_DOSAGE 2.100
score DRUG_ED_CAPS 2.100
score DRUG_ED_COMBO 2.100
score DRUG_ED_GENERIC 2.100
score DRUG_ED_ONLINE 2.100
score DRUG_ED_SILD 2.100

score HTML_00_10 0.985
score HTML_10_20 1.050
score HTML_20_30 1.241
score HTML_30_40 0.879
score HTML_40_50 0.527
score HTML_50_60 1.053
score HTML_60_70 0.516
score HTML_70_80 0.151
score HTML_80_90 0.027
score HTML_90_100 0.346

score UNWANTED_LANGUAGE_BODY 4.000 

Ahora si podemos reiniciar el demonio:

antispam:/# /etc/init.d/spamassassin restart

Ahora podemos pasar a la configuración de Postfix:

Configuración de Postfix:

Empecemos con el primero de los archivos /etc/postfix/master.cf, debemos decirle que debe pasar todos los mail que le lleguen por el antivirus (vía amavis) y luego por el antispam.

Para añadir el filtro antivírico y el filtro antispam debemos dejar el archivo así:

antispam:/# vi /etc/postfix/master.cf

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================

#smtp      inet  n       -       -       -       -       smtpd ## OJO Comentada!!
############################################################
## Pasamos el mail por la regla Spamassassin creada abajo ##
############################################################
smtp      inet  n       -       -       -       -       smtpd -o content_filter=spamassassin:dummy

#submission inet n       -       -       -       -       smtpd
#  -o smtpd_enforce_tls=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#smtps     inet  n       -       -       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       -       300     1       oqmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
smtp      unix  -       -       -       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       -       -       -       smtp
        -o fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
############
## AMAVIS ##
############
127.0.0.1:10025 inet    n       -       n       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000

smtp-amavis unix - - n - 2 lmtp
        -o lmtp_data_done_timeout=1200
        -o lmtp_send_xforward_command=yes
###############################
## SpamAssassin como Demonio ##
###############################
spamassassin unix - n n - - pipe user=spamd
                 argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}


Pasemos ahora al otro archivo de configuración /etc/postfix/main.cf

 

 

antispam:/# vi /etc/postfix/main.cf

 

 

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

#smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_banner = antispam ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

##################
# TLS parameters #
##################

smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
message_size_limit = 0
myhostname = antispam.tudominio.local
mydomain = tudominio.local
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = antispam.tudominio.local, localhost
relay_domains = dominio1.com, dominio2.com
mynetworks = 127.0.0.0/8
##mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter =
inet_interfaces = all

###########################################
# COPIA DE MENSAJES PARA FILTRO BAYESIANO #
###########################################

##always_bcc = antispam@improvisa.com

##########
# AMAVIS #
##########

content_filter = smtp-amavis:[127.0.0.1]:10024

############################################################################
# PARA NO RESPONDER MENSAJES CON DIRECCION ERRONEA si no se llena el mailq #
############################################################################

unknown_local_recipient_reject_code = 550

 

Aquí esta la chicha del documento, permitimos hacer relay de los dominios que están en la variable relay_domains, es decir que aunque no seamos los poseedores de los buzones de esos dominios los cogeremos y los intentaremos enviar. Como la resolución interna del servidor antispam es la correcta enviara el mensaje al servidor de correo poseedor de los buzones correspondiente.

Si os fijáis en el el archivo main.cf tenemos un apartado comentado, el del filtro bayesiano, dejémoslo así por un momento, para contaros como enseñar bien a este magnifico filtro, es el que al final nos quitará el 90% de los mails que nos lleguen, por eso hago incapie en enseñarle bien.

Podemos reiniciar el demonio de postfix:

antispam:/# /etc/init.d/postfix restart

Enseñando a SpamAssassin:

Es momento de enseñar a SpamAssassin a que diferencie el correo SPAM y el correo HAM que nos llega. Surge un problema con esto y es que el servidor AntiSpam no esta configurado para recoger correos, solo para hacer relays de los demonios que el tiene por dentro. Yo lo he hecho de la siguiente forma, me he creado una cuanta en el segundo servidor, el poseedor de los buzones (es postfix), y le mando una copia de todos los mails que me llegan a esa cuenta. Para ello deshabilito el filtro AntiSpam de nuestro nuevo servidor y le dejo que me envíe unos 7000 correos, yo tarde un fin de semana en recogerlos. Es importante deshabilitar el AntiSpam, que no se añadan cabeceras de ningún tipo para que a la hora de ir a enseñar al filtro bayesiano se encuentre los mails como le van a llegar. No intentéis generar Spam, ni Ham, no los copiéis de otros servidores, estas técnicas no nos llegara a funcionar del todo bien, lo mejor es esperar a tener un buen numero de mails "verdaderos" para que nuestro filtro funcione a las mil maravillas.

Para deshabilitar el filtro AntiSpam, parece mentira nada mas creado tenemos que deshabilitarlo, debemos dejar el archivo master.cf así, os dejo las lineas que cambian:

antispam:/# vi /etc/postfix/master.cf

 

 

 

smtp      inet  n       -       -       -       -       smtpd ## OJO YA NO ESTA Comentada!!
############################################################
## Pasamos el mail por la regla Spamassassin creada abajo ##
############################################################
#smtp      inet  n       -       -       -       -       smtpd -o content_filter=spamassassin:dummy

###############################
## SpamAssassin como Demonio ##
###############################
#spamassassin unix - n n - - pipe user=spamd
#                 argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

 

 


De esta forma ya no tenemos AntiSpam en el servidor y ahora debemos decirle a que buzón debe copiar todos los mensajes que le lleguen, editando el archivo main.cf y descomentando la linea always_bcc

antispam:/# vi /etc/postfix/main.cf

 

 

###########################################
# COPIA DE MENSAJES PARA FILTRO BAYESIANO #
###########################################

always_bcc = antispam@improvisa.com

 

 

Ahora todos los mensajes que lleguen serán enviados a antispam@improvisa.com, y sin ningún tipo de análisis antispam, como lo queremos. En mi caso la máquina que tenia los buzones también tenia un segundo filtro AntiSpam, debemos deshabilitarlo también, sino el nos marcara los mensajes, dependiendo de que tipo de filtro tengáis tendréis que hacerlo de una forma u otra, el mio era también SpamAssassin así que lo hice igual que en el nuevo.

Una vez tengamos unos 5000 correos Spam y unos 1000 correos Ham podemos de nuevo deshabilitar el always_bcc y habilitar el filtro AntiSpam del nuevo servidor.

Yo me fui repasando los 6000 correos diciendo que era Spam y que no, me ayudo muchísimo el cliente de correo web que tengo instalado SquirrelMAil, cree una nueva carpeta Spam y otra Ham y según iban apareciendo mensajes de un tipo u otro los iba moviendo de carpeta (físicamente en el disco duro también se mueven, es lo interesante para luego pasarle al nuevo servidor los mensajes de un tipo u otro).

Tenemos otro problemilla, los mail están ahora en otra maquina y debemos copiarlos a la nueva para decirle a SpamAssassin que aprenda. En mi caso tengo un Maildrop, que me deja los archivos en un directorio y en un formato que conoce el archivo perl que enseña al filtro Bayesiano.

Realice lo siguiente:

scp /buzones/improvisa.com/antispam/Maildir/.Spam/cur/* root@192.168.1.15:/cosas/spamassassin/Spam/


scp /buzones/improvisa.com/antispam/Maildir/.Ham/cur/* root@192.168.1.15:/cosas/spamassassin/Ham/

Perfecto ya tengo todos los mails Spam y Ham en distintas carpetas de mi servidor. Enseñemos al filtro bayesiano, ojo que dependiendo del numero de mensajes puede llegar a tardar mucho tiempo (4 o 5 horas)

antispam:/# sa-learn –ham /cosas/spamassassin/Ham/
antispam:/# sa-learn –spam /cosas/spamassassin/Spam/

Muy bien, seguramente hayamos ejecutado esto como root, con lo cual nos habra dejado las bases de datos bayesianas en el home de root y debemos moverlas al home del usuario que escaneará los mails (acordaros que es spamd, lo creamos arriba) y darle unos permisos aceptables:

Comprobad si esta o no creado el directorio .spamassassin dentro de /var/lib/spamassassin/bayes, y si tenemos salgo borrarlo, parando antes el demonio de SpamAssassin

antispam:/# /etc/init.d/spamassassin stop
antispam:/# rm -R /var/lib/spamassassin/bayes/.spamassassin
antispam:/# mkdir /var/lib/spamassassin/bayes/.spamassassin
antispam:/# cp -R /root/.spamassassin/* /var/lib/spamassassin/bayes/.spamassassin
antispam:/# chown spamd:spamd -R /var/lib/spamassassin/bayes/.spamassassin
antispam:/# chmod 600 -R /var/lib/spamassassin/bayes/.spamassassin
antispam:/# /etc/init.d/spamassassin start

No olvidéis habilitar de nuevo los filtros antispam que tengáis en vuestras segundas maquinas, seguramente tendréis que "enseñarle" a que todo lo que venga marcado como *****SPAM***** (el lo que hará nuestro nuevo servidor si localiza un Spam) lo considere SPAM y lo mande a donde vosotros digáis.

Esto es todo solo me queda dar las gracias:

A Alfonso de Microalcarria, siempre dando buenas ideas 😉
A toda la lista de SpamAssassin.
Y como siempre ­a vosotros que con vuestra ayuda mejoraremos este documento.

Las preguntas, por favor en el FORO, gracias.

Print Friendly, PDF & Email
Comentarios
  • CeLSuM dice:

    Una vez más otro impresionante documento… Vaya curradas!! *clap clap clap*

    En verdad que vas a tener razón, el que no se pase a Linux es porque no quiere, porque vamos los documentos más detallados, imposible.

    Salu2

    P.D. Lo que te decía Informática-Cine, las demás secciones …..LOST IN TRASLATION… *silba*

  • Juanmi dice:

    Gracias CeLSuM, por cierto animate y pasate tu el primero a Debian.

    Sobre las demas secciones mejor ni hablar….

    Besos