BlogNetwork
Studio

Bloquer un compte qui spamme…


En général c’est lié à une campagne de phishing qui a fait son job…
Quelques centaines de mails à la minute si on a une plateforme qui tient le coup qui partent à travers des sessions SMTP en provenance de plein d’IP différentes (et avec des « from » aléatoires, histoire d’être encore plus pénible).

On peut faire tourner un script sur le MTA sortant (ZCS) qui va parser zimbra.log pour y trouver toutes les connexions SMTP authentifiées et agir (en bloquant le compte) s’il y en a trop par minute.
Ce script gère une whitelist, envoie un mail au support lorsqu’un compte est bloqué et peut être lancé chaque cinq minutes (par root) via la crontab.
Il ne s’agit que d’une base, à adapter selon vos besoins…

#!/bin/bash

logfile="/var/log/zimbra.log"
maxmails="100"
mydomain="mondomaine.tld"
support="support@$mydomain"
accounts="/tmp/active_accounts"
log="/home/zimbra/closed.log"
WL="/root/whitelist.txt"
redemarre=false

su - zimbra -c "/opt/zimbra/bin/zmaccts" | grep "@" | grep active | awk '{print $1}' > $accounts

zgrep -i "sasl_method=LOGIN, sasl_username" $logfile | sed 's/  / /g' | awk -F"[ :]" '{print $3":"$4,$13;}' | sed 's/sasl_username=//g' | sort | uniq -c | sort -n |\
while read line
do
  count=`echo ${line} | cut -d' ' -f 1`
  userid=`echo ${line} | cut -d' ' -f 3`
  userid=${userid,,}
  timestamp=`echo ${line} | cut -d' ' -f 2`
  active=`grep -i "$userid@$mydomain" $accounts`

  if [ "$count" -gt "$maxmails" ] && [ "$active" == "$userid@$mydomain" ];
  then
    # On vient de détecter un utilisateur
    if zgrep --quiet -i $userid $WL;
    then
      # WhiteList
      # A vous de définir les opérations à réaliser si whitelist...
    else
      # On envoie le mail d'alerte et on bloque le compte
      subject="Compte $userid détecté - trop de connexions SMTP"
      message="/tmp/emailmessage.txt"
      echo "Le compte $userid a été verrouillé : $count connexions en une minute à $timestamp."> $message
      /bin/mail -r "postmaster@$mydomain" -s "$subject" "$support" > $log
      redemarre=true
    fi

    rm -f $message

    #update list of active accounts
    su - zimbra -c "/opt/zimbra/bin/zmaccts" | grep "@" | grep active | awk '{print $1}' > $accounts
  fi
done

rm -f $accounts

if [ $redemarre = true ];
then
  su - zimbra -c "postfix stop ; postfix start"
fi