outlook.com y greylisting

Desde hace años, tengo mi propia solución antispam, basada en:

– debian
– postfix
– Greylist
– openSPF
– RBL
– Spam Assassin
– MailScanner & MailWatch

Funciona bastante bien y tengo muy pocas quejas, ya que con los filtros de postgrey, descarto de un plumazo el 70% de spam.

Como era de esperar, el servicio de greyList y microsoft no son amigos…. cuando envías un mail por primera vez, devuelves un 4.5.0 try later y en 300 segundos, deberías de volver a intentarlo desde la misma IP, peeeero Microsoft no y vuelve a intentarlo desde otra, con lo que se van sumando así 5 minutos cada vez.

Google, con su servicio bastante extendido (¿quién no tiene un gmail?), hace la entrega desde la misma IP, con lo que el servicio greyList funciona bien.

Como no voy a desactivar el greyList y por fuerza tengo que comunicarme con gente que usa outlook.com o tiene el office365 contratado, tengo que solucionar el problema…. no puedo permitir que un mail tarde 12 horas en llegar.

Googleando un poco, veo bastante gente que se ha dado por vencido y ha acabado desactivando el greylisting, pero si observamos bien, Microsoft tiene unos rangos:


https://technet.microsoft.com/en-us/library/dn163583(v=exchg.150).aspx

Resumiendo:

Tengo que hacer un bypass de estos rangos en el greyList.

Vamos a nuestro postgrey:

# nano /etc/postgrey/whitelist_clients

Editamos este fichero y añadimos los rangos de M$

# postgrey whitelist for mail client hostnames
# --------------------------------------------
# put this file in /etc/postgrey or specify its path
# with --whitelist-clients=xxx
#
# postgrey version: 1.34, build date: 2011-05-04

# Debian-specific additions
# I *know* they run real mail queues, so greylisting only creates
# bigger load for them.
23.103.132.0/22
23.103.136.0/21
23.103.144.0/20
23.103.156.0/22
23.103.191.0/24
23.103.198.0/23
23.103.198.0/24
23.103.199.0/24
23.103.200.0/22
23.103.212.0/22
40.92.0.0/14
40.107.0.0/17
40.107.128.0/18
52.100.0.0/14
65.55.88.0/24
65.55.169.0/24
94.245.120.64/26
104.47.0.0/17
104.212.58.0/23
134.170.132.0/24
134.170.140.0/24
157.55.234.0/24
157.56.110.0/23
157.56.112.0/24
207.46.51.64/26
207.46.100.0/24
207.46.163.0/24
213.199.154.0/24
213.199.180.128/26
216.32.180.0/23
2a01:111:f400:7c00::/54
2a01:111:f403::/48
104.47.0.0/17
40.107.0.0/16
/.*outbound.protection.outlook.com$/
/outlook/

Añadimos las ip’s al principio.

ahora, para que el postgrey use este fichero, tenemos que editar el siguiente fichero:

# nano /etc/default/postgrey

Y lo dejamos tal que:

# postgrey startup options, created for Debian

# you may want to set
# --delay=N how long to greylist, seconds (default: 300)
# --max-age=N delete old entries after N days (default: 35)
# see also the postgrey(8) manpage

# POSTGREY_OPTS="--inet=60000"
POSTGREY_OPTS="--inet=60000 --whitelist-clients=/etc/postgrey/whitelist_clients"
# the --greylist-text commandline argument can not be easily passed through
# POSTGREY_OPTS when it contains spaces. So, insert your text here:
#POSTGREY_TEXT="Your customized rejection message here"

Una vez hecho esto, nos toca reiniciar servicios….

En mi caso, el postgrey 1.34 con debian 7, el /etc/init.d/postgrey restart no acaba de ir bien, con lo que tengo que acabar matando el servicio con kill 9 y el postfix, de la manera habitual

enjoy 😉

Instalar servidor anti-spam, parte 4

Configurando mailwatch…..

dentro del directorio /var/www/, creamos, a partir del ejemplo, el fichero de configuración..

# cd /var/www/mailscanner
# cp config.php.example config.php

Editamos el fichero y modificamos:

define(‘DB_TYPE’, ‘mysql’);
define(‘DB_USER’, ‘mailscanner’);
define(‘DB_PASS’, ‘mailscanner’);
define(‘DB_HOST’, ‘localhost’);
define(‘DB_NAME’, ‘mailscanner’);
define(‘DB_DSN’, DB_TYPE.’://’.DB_USER.”:”.DB_PASS.”@”.DB_HOST.”/”.DB_NAME);

Seguimos modificando:

// Set Time Zone
define(‘TIME_ZONE’, ‘Europe/Madrid’);
/*
For a list of usable timezones please check:
http://php.net/manual/en/timezones.php
*/

// Paths
define(‘MAILWATCH_HOME’, ‘/var/www/mailscanner’);
define(‘MS_CONFIG_DIR’, ‘/opt/MailScanner/etc/’);
define(‘MS_LIB_DIR’, ‘/opt/MailScanner/lib/’);

define(‘QUARANTINE_USE_FLAG’, true);

Ahora copiamos el script que ‘loggueará’ en el mysql los emails y en la web…

cd /usr/src/mailwatch-1.1.5.1/MailScanner_perl_scripts

editamos el fichero MailWatch.pm y cambiamos el acceso a la BBDD

# Modify this as necessary for your configuration
my($db_name) = ‘mailscanner’;
my($db_host) = ‘localhost’;
my($db_user) = ‘mailscanner’;
my($db_pass) = ‘mailscanner’;

Y lo copiamos:

cp MailWatch.pm /opt/MailScanner/lib/MailScanner/CustomFunctions/

Ahora, editamos de nuevo el fichero /opt/MailScanner/etc/MailScanner.conf

%org-name% = craem.net
%org-long-name% = cRaEM.Net Org
%web-site% = www.craem.net
%report-dir% = /opt/MailScanner/etc/reports/es
Always Looked Up Last = &MailWatchLogging
Detailed Spam Report = yes
Quarantine Whole Message = yes
Quarantine Whole Message As Queue Files = no
Include Scores In SpamAssassin Report = yes
Quarantine User = root
Quarantine Group = apache (this should be the same group as your web server)
Quarantine Permissions = 0660

Ahora, copiamos los ficheros del directorio:
/usr/src/mailwatch-1.1.5.1/MailScanner_perl_scripts

SQLBlackWhiteList.pm
SQLSpamSettings.pm

a: /opt/MailScanner/lib/MailScanner/CustomFunctions/

Y modificamos SQLBlackWhiteList.pm con:

sub CreateList {
my($type, $BlackWhite) = @_;
my($dbh, $sth, $sql, $to_address, $from_address, $count, $filter);
my($db_name) = ‘mailscanner’;
my($db_host) = ‘localhost’;
my($db_user) = ‘mailscanner’;
my($db_pass) = ‘mailscanner’;

Y del SQLSpamSettings.pm

use DBI;
my(%LowSpamScores, %HighSpamScores);
my(%ScanList);
my($db_name) = ‘mailscanner’;
my($db_host) = ‘localhost’;
my($db_user) = ‘mailscanner’;
my($db_pass) = ‘mailscanner’;

Ahora, en el directorio /var/spool/MailScanner, modificamos los permisos:

chmod -R 666 *

Reiniciamos MailScanner y probamos la entrega de mail, para ver si loguea en la web:

http://ip.del.servidor.mailss/mailscanner

nos pedirá el user/password que hemos creado antes.

Instalar servidor anti-spam, parte 3

Ahora nos toca configurar Postfix.

Hacemos una copia del fichero /etc/postfix/main.cf

#cp main.cf main.cf_old

Y lo dejamos tal que:

myhostname = antispam.craem.net
mydomain = craem.net
myorgin = $mydomain
masquerade_domain = $mydomain
mydestination = $myhostname, localhost.$mydomain, $mydomain
mynetwork_style = host
######################################################
mynetworks = 192.168.2.0/24
relay_domains = craem.net, craem.cat, craem.es
transport_maps = hash:/etc/postfix/transport
append_at_myorigin = no
local_recipient_maps =
header_checks = regexp:/etc/postfix/header_checks
Disarmed_Modify_Subject = no

# Medidas antispam (anti-UCE)
smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes

smtpd_recipient_restrictions =
reject_invalid_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client dul.dnsbl.sorbs.net,
reject_rbl_client dnsbl.sorbs.net,permit

smtpd_data_restrictions =
reject_unauth_pipelining,
permit

bounce_notice_recipient = postmaster@craem.net
delay_notice_recipient = postmaster@craem.net
2bounce_notice_recipient = postmaster@craem.net
error_notice_recipient = postmaster@craem.net
default_destination_concurrency_limit = 10
smtpd_recipient_limit = 100
maximal_queue_lifetime = 2d
fallback_relay =
smtp_destination_recipient_limit = 200
smtp_destination_concurrency_limit = 10

Ahora crearemos el fichero transport, que tendrá las ip’s a las cuales entregaremos el correo después de filtrarlo:

# nano /etc/postfix/transport

y añadimos:


craem.net smtp:[192.168.2.4]
craem.cat smtp:[192.168.2.4]
craem.es smtp:[192.168.2.4]

Si nuestro servidor de correo corporativo, tiene más dominios, hemos de tener una entrada con cada una de ellas o, si queremos filtrar el correo para otras personas (servicio de pago :-)), pues eso, a añadir más.

Una vez creado el fichero, creamos la DB del transport, para ser consultada por el postfix

# postmap /etc/postfix/transport

Con ésto, nos creará el fichero transport.db. Reiniciamos postfix


# /etc/init.d/postfix restart

Ahora toca descargar mailscanner…


# cd /usr/src
# wget -c http://www.mailscanner.info/files/4/tar/MailScanner-install-4.84.5-2.tar.gz
# tar -zxvf MailScanner-install-4.84.5-2.tar.gz
# cd MailScanner-install-4.84.5/
# ./install.sh

Y tras un rato, tendremos instalado (que no configurado) el mailscanner.

Ahora, tal y como nos pide MailScanner, creamos las entradas en el Crontab, para las actualizaciones:

# crontab -e

Y le añadimos lo siguiente:

37 5 * * * /opt/MailScanner/bin/update_phishing_sites
07 * * * * /opt/MailScanner/bin/update_bad_phishing_sites
58 23 * * * /opt/MailScanner/bin/clean.quarantine
42 * * * * /opt/MailScanner/bin/update_virus_scanners
3,23,43 * * * * /opt/MailScanner/bin/check_mailscanner

Editamos el fichero /etc/default/spamassassin y cambiamos:

ENABLED=0 to ENABLED=1
CRON=0 to CRON=1

Y lo arrancamos;

# /etc/init.d/spamassassin start

Ahora, editamos el fichero /opt/MailScanner/etc/MailScanner.conf y cambiamos

Run As User = postfix
Run As Group = postfix
MTA = postfix
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
Virus Scanners = clamav
Spam List = SBL+XBL
SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin

Ahora, editamos el fichero:
/etc/postfix/header_checks

Y añadimos lo siguiente:

/^Received:/ HOLD

Reiniciamos el postfix y arrancamos el mailscanner

# /etc/init.d/postfix restart
# cd /opt/MailScanner/bin
# ./check_mailscanner

Ahora instalaremos mailwatch , que será la “interfaz” gráfica del mailscanner.

# cd /usr/src/
# wget -c http://downloads.sourceforge.net/project/mailwatch/mailwatch/1.1.5.1/mailwatch-1.1.5.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmailwatch%2F&ts=1330981577&use_mirror=garr

Descomprimes el tar.gz y importamos el *.sql

# mysql -p < create.sql

Creamos el usuario:

# mysql -p
> GRANT ALL ON mailscanner.* TO mailscanner@localhost IDENTIFIED BY 'mailscanner';

Creamos el usuario para loguear en la web de mailwatch:

mysql -u root -pPASSWORD
mysql> INSERT INTO users VALUES ('root',md5('password'),'root','A','0','0','0','0','0');

Movemos el directorio mailscanner a la raiz del webServer:

# mv mailscanner /var/www/

Instalar servidor anti-spam, parte 2

Vamos a suponer que tenemos una debian recién instalada y contando que el antispam, va a contar con:

– postfix (para entregar los correos)
– Spamassassin (para el spam)
– Mailscanner (spamassassin <-> postfix)
– Mailwatch (entorno gráfico vía web)
– PostGrey (greylist)
– openSpf
– Clamav (antivirus)

Primero, hemos de desistalar el exim4, que viene por defecto con nuestra Debian:

# apt-get remove exim4 exim4-config

Y instalamos postfix

# apt-get install postfix postfix-doc

Y ahora instalamos las dependencias necesarias:

apt-get install mc ssh apache2 libapache2-mod-php5 php5-cli php5-common php5-cgi php5-gd -qy bison flex libncurses5-dev zlib1g-dev libssl-dev libnewt-dev libiksemel-dev -qy make linux-headers-`uname -r` gcc g++ libstdc++6 mysql-client mysql-server phpmyadmin linux-headers-`uname -r` bison openssl libssl-dev libeditline0 libeditline-dev libedit-dev gcc make g++ php5-cli mysql-common libmysqlclient15-dev libnewt-dev

apt-get install apache2 libapache2-mod-php5 php5-cli php5-common php5-cgi php5-gd mysql-client mysql-server phpmyadmin
apt-get install -qy bison flex libncurses5-dev zlib1g-dev libssl-dev libnewt-dev libiksemel-dev -qy make linux-headers-`uname -r` gcc g++ libstdc++6 mysql-client mysql-server phpmyadmin
apt-get install linux-headers-`uname -r` bison openssl libssl-dev libeditline0 libeditline-dev libedit-dev gcc make g++ php5-cli mysql-common libmysqlclient15-dev libnewt-dev

Seguimos ….

aptitude install libconvert-tnef-perl libdbd-sqlite3-perl libfilesys-df-perl libmailtools-perl libmime-tools-perl libmime-perl libnet-cidr-perl libsys-syslog-perl libio-stringy-perl libfile-temp-perl libole-storage-lite-perl libarchive-zip-perl postfix clamav clamav-daemon libsys-hostname-long-perl libnet-cidr-lite-perl spamassassin spamc

Aquí hemos instalado spamassassin y clamav, que son los antivirus y antispam

Instalar servidor anti-spam, parte 1

Ahora toca explicar cómo instalar un servidor anti-spam.

Hasta ahora, en la mayoría de clientes, usaba el trendmicro…. y ahora, con la crisis y demás histórias, la gente no quiere pagar licencias. Es un buen producto, pero me niego a ponerlo pirata; si quieres algo, págalo y sobretodo si es para la empresa.

Yo, en casa, al tener licencias de trendmicro, tenía el IMSS y no iba mal, pero hice el salto al openSource…. poco a poco he ido eliminando todas las máquinas windows y las primeras en eliminar fue la del anti-spam.

Usaremos una solución basada en:

– Debian (rock solid xD)
– Postfix (para la entrega de correos)
– Clamav (antivirus)
– SpamAssassin (antispam) + blacklist
– GreyList
– SPF
– MailScanner (para interactual con el postfix / spamassassin)
– MySQL (para guardar el registro de correos y mailscanner)

El greyList es una buena opción…. recibes un correo y, si es la primera vez que desde esa ip lo recibes, nuestro servidor devuelve un mensaje 4.5.x Greylisted, Try later. Si el servidor que envía es RFC compliant (ojo los exchanges), al cabo de unos 300 segundos lo volverá a intentar y, en este caso, aceptaremos el correo.

Con este primer filtro, evitamos el 70 % de spam, ya que la mayoría virus / troyanos envían a saco y no tienen en cuenta volver a intentarlo.

El segundo paso es el SPF (Sender security Framework). Suponemos que recibimos un email de manolito.com. Nosotros, al recibir el correo miramos si el dominio tiene creado el registro SPF, que no es otra cosa que, la lista de ip’s autorizadas (o dns names) a enviar correo en nombre de manolito.com.

Por ejemplo, el cliente manolito.com tiene el servidor con la ip pública 1.1.1.1, entones, su registro SPF deberá de ser:

manolito.com text = “v=spf1 mx ip4:1.1.1.1 -all”

Con esto explicamos:

v=spf1 : versión spf
mx : Que los registros mx del dominio, están autorizados a enviar correo
ip4 : Esta ip está autorizada
-all : Cualquier otro correo del dominio que no venga del mx o la ip, no es nuestro.

Cada vez, más empresas, clientes y proveedores, están habilitando esta opción, así que nosotros la haremos seguir…. así nos evitamos phising y demás porquerías