2010/8/2 Federico Alberto Sayd <fs...@uncu.edu.ar>

> El 02/08/10 08:39, Marc Aymerich escribió:
>
>  Buenas listeros,
>> el otro día un spammer consiguió el password de varios usuarios del
>> servidor de correo y empezó a mandar spam a través de sus cuentas. Que
>> métodos conocéis para detectar y combatir este tipo de spam?
>>
>> De entrada se me ocurre filtrar el correo saliente con mailscanner, o
>> mejor, utilizar un policy daemond como policyd y definir "recipient
>> rate limits".
>>
>> ¿Que hacéis vosotros para prevenir este tipo el spam? ¿que se os ocurre?
>>
>> Saludos!
>> --
>> Marc
>>
>>
>>
>>
> Hola Marc:
>
> A mi ha pasado justo como a ti. He configurado el servidor con todos los
> filtros para que no entre spam, pero desde luego es muy difícil configurar
> un servidor para filtrar lo que sale pues lo que quieres es que tus usuarios
> puedan mandar correo. Claro está que el problema es cuando algún usuario
> "inteligente" cae en la trampa de responder un correo falso donde le piden
> su usuario y contraseña.
>
> Yo para mitigar un poco el problema he hecho lo siguiente. Como mucho de
> este spam salía a través de squirrelmail, instalé el plugín squirrel logger
> que me informa con un correo cuando un usuario manda a más de 20
> destinatarios.


Buenas,
Siguiendo las ideas de Federico esta tarde la he dedicado a hacer un script
para el /etc/cron.hourly. Funciona a partir de la base de datos del
mailwatch y manda alertas cuando un usuario manda muchos mails por hora, o a
muchos remitentes. Si alguien lo quiere aprovechar aquí lo tiene.


#!/bin/bash
# Query Mailwatch database looking for mail abuses, from authenticated
senders and relayed servers.
##################
##### CONFIG #####
##################

# This threshold configure the maximum number of recipients per time period
# Max Recipients per mail
TO_THRESHOLD_TO=25
# Max Number of mails for the same account that reach $TO_THRESHOLD_TO
TO_THRESHOLD_FROM=7
TO_INTERVAL="1 HOUR"

# This threshold configure the maximum number of emails for the same account
per time period
# Max Mails per account
FROM_THRESHOLD=25
FROM_INTERVAL="1 HOUR"

# Mails to scan:
# Relayed ips: like webmail server or secondary mail server.
REGEX_RELAY_IPS='"78.254.514.*"'
# Authenticated Senders
REGEX_AUTH_HEADER='"Received:.*Authenticated sender: .*"'

# Exceptions for Mailman, Mailer-Daemon and Nagios.
REGEX_MAILMAN_HEADER='"\nX-Mailman-Version: 2.1.11\n"'
REGEX_MAILER_DAEMON='"\nFrom: mailer-dae...@mail2.organitzation.org "'
NAGIOS_FROM='"nag...@xarxes.organitzation.org"'

# Email alert configuration
EMAIL="r...@organitzation.org"
PERIOD="Hourly"
MAIL_SERVER="mail.organitzation.org"

# MySQL Connection Options (not implemented)
#MYSQL_HOST=""
#MYSQL_DB=""
#MYSAL_USER=""
#MYSQL_PASS=""

##################
### END CONFIG ###
##################

# Retrieving mailwatch information
sql_result_to=$(mysql mailscanner -e "SET @mytime=(SELECT
DATE_FORMAT(SUBDATE(CURRENT_TIMESTAMP(),INTERVAL $TO_INTERVAL),'%H:%i:%s'));
SET @mydate=(SELECT DATE_FORMAT(SUBDATE(CURRENT_TIMESTAMP(),INTERVAL
$TO_INTERVAL),'%Y-%m-%d')); SELECT from_address, subject FROM maillog WHERE
((date = @mydate AND time > @mytime) OR date > @mydate) AND
LENGTH(to_address) - LENGTH(REPLACE(to_address, '@', ''))  >
$TO_THRESHOLD_TO AND (headers REGEXP $REGEX_AUTH_HEADER OR clientip REGEXP
$REGEX_RELAY_IPS) AND NOT headers REGEXP $REGEX_MAILMAN_HEADER ORDER BY
from_address;")

sql_result_from=$(mysql mailscanner -e "SET @mytime=(SELECT
DATE_FORMAT(SUBDATE(CURRENT_TIMESTAMP(),INTERVAL
$FROM_INTERVAL),'%H:%i:%s')); SET @mydate=(SELECT
DATE_FORMAT(SUBDATE(CURRENT_TIMESTAMP(),INTERVAL
$FROM_INTERVAL),'%Y-%m-%d')); SELECT from_address, subject FROM maillog
WHERE ((date = @mydate AND time > @mytime) OR date > @mydate) AND (headers
REGEXP $REGEX_AUTH_HEADER OR clientip REGEXP $REGEX_RELAY_IPS) AND NOT
headers REGEXP $REGEX_MAILMAN_HEADER AND from_address!=$NAGIOS_FROM AND NOT
headers REGEXP $REGEX_MAILER_DAEMON ORDER BY from_address;");

# Formatting the sql output
result_to=$(echo "$sql_result_to"|awk {'print $1'}|grep -v
"^from_address.*subject$"|uniq -c);
result_from=$(echo "$sql_result_from"|awk {'print $1'}|grep -v
"^from_address.*subject$"|uniq -c);

# Looking for abuses
spamers_to=""
while read line; do
mails=$(echo "$line"|awk {'print $1'});
 if [ $mails -gt $TO_THRESHOLD_FROM ]; then
                # Subject is only orientative and not necessarily the most
repeated, simply is the first one.
 posible_subject=$(echo "$sql_result_to"|grep "${line#*' '}"|head -n1)
spamers_to=$(echo -e "${spamers_to}\n$mails $posible_subject");
 fi;
done << EOF
$(echo "$result_to");
EOF

spamers_from=""
while read line; do
 mails=$(echo "$line"|awk {'print $1'});
if [ $mails -gt $FROM_THRESHOLD ]; then
 # Subject is only orientative and not necessarily the most repeated, simply
is the first one.
                posible_subject=$(echo "$sql_result_from"|grep "${line#*'
'}"|head -n1)
                spamers_from=$(echo -e "${spamers_from}\n$mails
$posible_subject");
fi;
done << EOF
$(echo "$result_from");
EOF

# Sending mail alert
if [[ "$spamers_to" != "" || $spamers_from != "" ]]; then
          (
            echo "Subject: MAIL ABUSE REPORT - $MAIL_SERVER - $PERIOD
report"
            echo "To: $EMAIL"
            echo ""
    if [ "$spamers_to" != "" ]; then
            echo "During the last $TO_INTERVAL the following senders have
sent at least $TO_THRESHOLD_FROM e-mails to more than $TO_THRESHOLD_TO
recipients."
    echo "$spamers_to"
    echo ""
    echo ""
            fi;
    if [ "$spamers_from" != "" ]; then
    echo "During the last $FROM_INTERVAL the following senders have sent at
least $FROM_THRESHOLD e-mails."
    echo "$spamers_from"
    echo ""
    fi;
    echo ""
          ) | /usr/sbin/sendmail $EMAIL
fi;

exit 0;



pd. como veis no me avergüenzo de mi pésimo nivel del inglez :P

-- 
Marc

Responder a