Debian / Ubuntu - Bloquer les attaques reçues sur les principaux protocoles (mails, web et FTP)

Page 1 / 1

Si vous avez déjà administré un serveur en ligne (que ce soit un serveur dédié ou un VPS), vous avez sans doute remarqué que les pirates passent leur temps à attaquer les serveurs accessibles depuis Internet. Pour bloquer un pirate, rien de plus simple. Il suffit de bloquer son adresse IP dans le pare-feu de votre serveur. En règle général, cette méthode fonctionnera. L'exception étant l'utilisation d'un Botnet (dans ce cas : une multitude d'adresses IP se retrouveront dans vos historiques (logs) et vous aurez donc du mal à bloquer ce pirate. De plus, vous risquez de bloquer un de vos visiteurs infectés par un virus (+ exactement : un client botnet)).

Il y a donc 3 étapes :

  1. Configurer le pare-feu pour autoriser seulement ce qui est nécessaire. Pour cela, suivez notre tutoriel : Debian / Ubuntu - Sécuriser votre serveur dédié ou VPS via Iptables
  2. Trouver les adresses IP des pirates grâce aux logs de votre serveur. Sous Linux, ceux-ci se trouvent dans : /var/log/...
  3. Bloquez ces adresses IP dans le pare-feu de votre serveur. Sous Linux, nous utiliserons Iptables pour configurer le pare-feu Netfilter.
  1. Bloquer une adresse IP ou une plage d'adresses IP grêce à Iptables
  2. Bloquer une attaque sur le protocole SMTP (Authentification SASL) - Postfix
  3. Bloquer une attaque sur le protocole IMAP/POP3 - Courier
  4. Bloquer une attaque sur le webmail RoundCube
  5. Bloquer une attaque sur le protocole HTTP/HTTPS - Apache
  6. Bloquer une attaque sur le protocole FTP - ProFTPD
  7. Bloquer les petites attaques DDoS grâce à No More DDOS

1. Bloquer une adresse IP ou une plage d'adresses IP grêce à Iptables

Pour bloquer un pirate, il suffit de bloquer son adresse IP dans le pare-feu de votre serveur Linux.
Pour cela, nous allons utiliser Iptables pour bloquer le trafic entrant venant de l'adresse IP "xx.xx.xx.xx" (où xx.xx.xx.xx correspond à l'adresse IP du pirate).

Bash

iptables -I INPUT -s xx.xx.xx.xx -j DROP

Si le pirate utilise une plage d'adresse IP (ex : 10.0.0.10, 10.0.0.11, 10.0.0.12, ... 10.0.0.20), il suffit d'utiliser cette commande :

Bash

iptables -I INPUT -m iprange --src-range 10.0.0.10-10.0.0.20 -j DROP

Si vous souhaitez bloquer la connexion sortante (votre serveur => autres serveurs) vers une plage d'adresses IP, utiliser le paramètre "--dst-range" au lieu de "--src-range".
Ainsi, votre serveur ne pourra plus envoyer de données à cette plage d'adresses IP.

Bash

iptables -I INPUT -m iprange --dst-range 10.0.0.10-10.0.0.20 -j DROP

 

2. Bloquer une attaque sur le protocole SMTP (Authentification SASL) - Postfix

Lorsque l'on sécurise un serveur de mails, on active l'authentification SASL sur celui-ci pour éviter que n'importe qui n'utilise notre serveur de mails. Les utilisateurs sont donc obligés de s'authentifier via SASL pour pouvoir envoyer des mails. Ce qui évite de blacklister notre serveur au niveau des autres serveurs de mails étant donné que les pirates ne pourront pas l'utiliser pour envoyer des spams.
Étant donné qu'un serveur de mail sécurisé est protégé par une authentification, les pirates tentent de trouver les identifiants d'un de vos comptes e-mail grâce à une attaque bruteforce. C'est-à-dire que les pirates essayent une liste d'identifiants comme "info@votre-domaine.com", "contact@votre-domaine.com", "webmaster@votre-domaine.com", ... avec des mots de passes comme "1234", "maison", ... ou des mots présents dans le dictionnaire.

Bien évidemment, toutes ces tentatives d'authentification sur votre serveur sont enregistrées dans des fichiers log.

Pour lister les adresses e-mails que le pirate a essayé de pirater, vous devez lister les lignes du fichier "/var/log/auth.log" en cherchant l'occurrence "auth failure".

Bash

grep "auth failure" /var/log/auth.log

Ce qui affichera des lignes similaires à celle-ci :

Plain Text

Mois Jour xx:xx:xx Nom du serveur saslauthd[xxxx]: do_auth         : auth failure: [user=compte@domaine.com] [service=smtp] [realm=domaine.com] [mech=pam] [reason=PAM auth error]

Pour lister les adresses IP utilisées pour ces attaques, vous devez lister les lignes du fichier "/var/log/mail.log" en cherchant l'occurrence "SASL LOGIN authentication failed".

Bash

grep "SASL LOGIN authentication failed" /var/log/mail.log

Ce qui affichera des lignes similaires à celle-ci :
Note : xx.xx.xx.xx correspond à l'adresse IP du pirate.

Plain Text

Mois Jour xx:xx:xx Nom du serveur postfix/smtpd[xxxxx]: warning: unknown[xx.xx.xx.xx]: SASL LOGIN authentication failed: authentication failure

 

Pour les utilisateurs de "Logwatch", vous verrez des lignes comme celles-ci dans les rapports que vous recevrez par mail :

Plain Text

 SASL Authentications failed xx Time(s)
 Service smtp (pam) - xx Time(s):
 Realm domaine.com - xx Time(s):
 User: compte@domaine.com - PAM auth error - xx Time(s):

Grâce à ces informations, vous savez qu'un pirate a essayé ces identifiants sur votre serveur. Néanmoins, vous n'avez pas son adresse IP pour le bloquer. Pour trouver son ou ses adresses IP, référez-vous à la partie ci-dessus.
Pour installer et configurer "Logwatch", référez-vous à notre tutoriel : Debian / Ubuntu - Détecter les attaques effectuées contre votre serveur grâce à Logwatch

Pour finir, bloquez le ou les pirates en tapant la commande :

Bash

iptables -I INPUT -s xx.xx.xx.xx -j DROP

 

3. Bloquer une attaque sur le protocole IMAP/POP3 - Courier

Lorsque l'on configure un serveur de mails complet, on installe plusieurs choses :

  • Le serveur de mails (en général : Postfix)
  • Le protocole SMTP qui permet d'envoyer de mails (intégré dans Postfix)
  • Un webmail (interface web permettant de consulter ces mails)
  • Les protocoles IMAP et/ou POP3

Les protocoles IMAP et POP3 permettent de consulter ces mails grâce à un client de messagerie. Lorsque l'on installe ces protocoles, on est obligé d'autoriser tout le monde pour les ports suivants : IMAP (143), IMAPS (993), POP3 (110) et POP3S (995). Cela vous permet de consulter vos mails depuis n'importe quel ordinateur, smartphone, ... et ce depuis n'importe où. Cela permet aussi à n'importe qui (dont les pirates) de se connecter sur ces ports pour effectuer une attaque bruteforce.

Pour lister les adresses IP utilisées pour ces attaques, vous devez lister les lignes du fichier "/var/log/mail.log" en cherchant l'occurrence "LOGIN FAILED".

Bash

grep "LOGIN FAILED" /var/log/mail.log

Ce qui affichera des lignes similaires à celle-ci :
Note :
- Remarquez que ce fichier contient l'historique du serveur POP3 (pop3d) ainsi que du serveur IMAP (imapd).
- xx.xx.xx.xx correspond à l'adresse IP du pirate. Si un pirate tente de se connecter via votre webmail, l'adresse IP sera "127.0.0.1" ou celle de votre serveur. Dans ce cas, ne bloquez pas cette adresse IP, sinon le webmail sera inutilisable.

Plain Text

Mois Jour xx:xx:xx Nom du serveur pop3d: LOGIN FAILED, user=compte@domaine.com, ip=[::ffff:xx.xx.xx.xx]
Mois Jour xx:xx:xx Nom du serveur imapd: LOGIN FAILED, user=compte@domaine.com, ip=[::ffff:xx.xx.xx.xx]

Idem si le pirate se connecte via ces protocoles sécurisés via SSL (donc : POP3S et IMAPS) :

Plain Text

Mois Jour xx:xx:xx Nom du serveur pop3d-ssl: LOGIN FAILED, user=compte@domaine.com, ip=[::ffff:xx.xx.xx.xx]
Mois Jour xx:xx:xx Nom du serveur imapd-ssl: LOGIN FAILED, user=compte@domaine.com, ip=[::ffff:xx.xx.xx.xx]

 

Pour les utilisateurs de "Logwatch", vous verrez des lignes comme celles-ci dans les rapports que vous recevrez par mail :

Plain Text

 --------------------- IMAP Begin ------------------------
 
 [IMAPd] Logout stats:
 ====================
                                    User | Logouts | Downloaded |  Mbox Size
 --------------------------------------- | ------- | ---------- | ----------
                      compte@domaine.com |       x |       xxxx |          x
 ---------------------------------------------------------------------------
                                                 x |       xxxx |          x

 **Unmatched Entries**
    Failed to connect to socket /tmp/fam-vmail-: x Time(s)
    LOGIN FAILED, method=PLAIN, ip=[::ffff:xx.xx.xx.xx]: x Time(s)
    LOGIN FAILED, user=compte@domaine.com, ip=[::ffff:xx.xx.xx.xx]: x Time(s) ---------------------- IMAP End ------------------------- --------------------- POP-3 Begin ------------------------ [POP3] Login failures: ========================= Host (user) | # ------------------------------------------------------------- | ----------- xx.xx.xx.xx (compte@domaine.com) | x --------------------------------------------------------------------------- x ---------------------- POP-3 End -------------------------

Grâce à ces informations, vous pourrez connaitre les adresses IP des pirates pour les protocoles "POP3" et "IMAP".

Pour finir, bloquez le ou les pirates en tapant la commande :

Bash

iptables -I INPUT -s xx.xx.xx.xx -j DROP

 

4. Bloquer une attaque sur le webmail RoundCube

Si un pirate ou une personne mal intentionnée essaye de pirater un de vos comptes e-mail en passant par votre webmail, vous devrez regarder dans l'historique du webmail et non dans l'historique du serveur IMAP.
La raison est simple : étant donné que le pirate se connecte au webmail, c'est ce webmail qui se connecte sur le serveur imap et non le pirate en lui-même, c'est donc l'adresse IP du webmail qui sera enregistrée dans l'historique du serveur IMAP.

Pour le webmail "RoundCube" (qui est un webmail professionnel utilisé notamment par OVH et LWS), il suffit de lister les lignes du fichier "<dossier de RoundCube>/logs/errors" en cherchant l'occurrence "Login failed".

Bash

grep "Login failed" <dossier de RoundCube>/logs/errors

Ce qui affichera des lignes similaires à celle-ci :
Note : xx.xx.xx.xx correspond à l'adresse IP du pirate.

Plain Text

[Jour-Mois-Année xx:xx:xx +0200]: <xxxxxxxx> IMAP Error: Login failed for compte@domaine.com from xx.xx.xx.xx. Could not connect to ssl://imap.domaine.com:993: Connexion refusée in <dossier de RoundCube>/program/lib/Roundcube/rcube_imap.php on line 198 (POST /?_task=mail&_action=refresh?_task=&_action=)

Pour finir, bloquez le ou les pirates en tapant la commande :

Bash

iptables -I INPUT -s xx.xx.xx.xx -j DROP

 

5. Bloquer une attaque sur le protocole HTTP/HTTPS - Apache

Un serveur web peut aussi subir une attaque.
Les pirates qui attaquent un serveur web ont plusieurs buts :

  1. injecter un code malveillant dans la mémoire d'apache (le serveur web sous Linux). Ce que l'on appelle un "exploit".
  2. tenter d'accéder à des pages d'administration du serveur.
  3. rendre inaccessible un site Internet ou un serveur grâce à une attaque DDOS.

Dans les 2 premiers cas, il est possible de bloquer les attaques du pirate.
Dans le dernier cas, vous devez utiliser un Reverse proxy ou un routeur matériel (comme un routeur Cisco) pour pouvoir bloquer ou atténuer les effets de l'attaque DDOS.

5.1. Bloquer les injections de codes malveillants

Pour ce type d'attaque, il y a 2 opérations à effectuer :

  1. En préventif : Mettre à jour le serveur web (Apache) ainsi que le module "PHP" qui permet de créer des pages dynamiques et ses extensions.
  2. Ensuite, il suffit de bloquer les adresses IP des pirates qui ont effectués ces attaques

Pour détecter ces attaques, il suffit de consulter le fichier "/var/log/apache2/error.log".
Note : la commande "tail" permet d'afficher les xx dernières lignes du fichier spécifié en paramètre.

Bash

tail -n xx /var/log/apache2/error.log

Les attaques de type "exploits" (utilisation d'une faille d'un programme), si il y en a, sont similaires à ceci :
Note : Nous avons tronqué les lignes volontairement pour ne pas que ces lignes soient utilisées par des personnes mal intentionnées.

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] client denied by server configuration: /var/www/cgi-sys, referer: () { :;} ;echo;/usr/local/bin...
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] client denied by server configuration: /var/www/cgi-mod, referer: () { :;} ;echo;/usr/local/bin...
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] client denied by server configuration: /var/www/cgi-bin-sdb, referer: () { :;} ;echo;/usr/local/bin...
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] client denied by server configuration: /var/www/, referer: () { :;} ;echo;/usr/local/bin...
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] client denied by server configuration: /var/www/, referer: () { :;}; /bin/bash...

5.2. Bloquer les tentatives d'accès aux pages d'administration

Les tentatives d'accès aux pages d'administration sont très simples à repérer.
Ces lignes contiennent toujours les adresses par défaut des pages d'administration des CMS.
Voici différents exemples d'attaques reçues sur notre serveur web.

L'administration du site :

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] client denied by server configuration: /var/www/admin
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] client denied by server configuration: /var/www/administration

phpMyadmin qui permet de gérer sa base de données MySQL depuis une interface web programmée en PHP :

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/phpMyAdmin
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/phpMyAdmin-4.2.1-all-languages
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/phpMyAdmin-4.2.1-english
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/pma

MySQLDumper (similaire à phpMyAdmin) :

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/mysql
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/MySQLDumper

phpPgAdmin (similaire à phpMyAdmin mais pour PostgreSQL) :

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/phppgadmin

Wordpress :

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/wp-admin.php
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/wp-login.php

Les variables d'environnement CGI sont des variables transmises à un programme CGI, par le serveur Web l'invoquant, lors de son exécution
Définition de wikipedia.
Étant donné nous avons supprimé cet alias, ces attaques sont inutiles et laissent des traces dans le fichier de log.

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /var/www/cgi-bin

Et bien d'autres :

Plain Text

[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /ftpmanager
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /ftpmanager
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /xmlrpc.php
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: .../trackback
[Nom du jour Mois Jour xx:xx:xx Année] [error] [client xx.xx.xx.xx] File does not exist: /www.domaine.com.sql

Pour les utilisateurs de "Logwatch", vous verrez des lignes comme celles-ci dans les rapports que vous recevrez par mail :

Plain Text

 --------------------- httpd Begin ------------------------
 
 A total of xx sites probed the server
    xx.xx.xx.xx
    xx.xx.xx.xx
    
 Requests with error response codes
    400 Bad Request
       /une-mauvaise-requete.html: x Time(s)
    401 Unauthorized
       /une-page-restreinte.php: x Time(s)
    404 Not Found
       /une-page-inexistante.html: x Time(s)
    405 Method Not Allowed
       /methode-non-autorisee.jpg: x Time(s)
    408 Request Timeout
       null: x Time(s)
    500 Internal Server Error
       /: 1 Time(s)
    501 Not Implemented
       /: x Time(s)
 
 ---------------------- httpd End -------------------------

Grâce à ces informations, vous détectez facilement les attaques citées ci-dessus (avec le nombre d'essais : x Time(s)). Néanmoins, vous n'avez pas son adresse IP pour le bloquer. Pour trouver son ou ses adresses IP, référez-vous à la partie ci-dessus.
De plus, ce rapport vous affichera la liste des adresses IP qui se sont connectées à votre serveur (par défaut : pour le jour précédent). Si vous voyez plusieurs adresses IP qui possède le même début (ex : xx.xx.xx.10, xx.xx.xx.11, xx.xx.xx.12, ...), il s'agit d'un Crawler (ou Bot) ou d'un pirate qui utilisent plusieurs IP d'un même réseau.
Pour le savoir, cherchez l'adresse IP (ou le début de cette adresse IP) dans le fichier "/var/log/apache2/access.log".
Attention : Ne bloquez pas les robots de Google, Bing, Yahoo, Msn, ... sinon votre site disparaitra des moteurs de recherche. Étant donné que les robots de Google et autres n'auront plus accès à votre serveur, ils considéreront que le site web n'existe plus. Si vous utilisez les outils "Google Webmasters", "Bing - Webmaster Tools", ... vous recevrez peut-être une alerte de leur part. (c'est le cas pour Google Webmasters).

Bash

grep "xx.xx.xx.xx" /var/log/apache2/access.log

Pour finir, bloquez le ou les pirates en tapant la commande :

Bash

iptables -I INPUT -s xx.xx.xx.xx -j DROP

 

5.3. Les attaques DDOS

Si un pirate lance une attaque DDOS sur votre serveur, il y a 3 solutions possibles :
- Utiliser Nginx en Reverse proxy. Dans ce cas : Nginx est accessible depuis Internet mais votre serveur n'est accessible que par ce serveur Nginx. Ainsi, il est possible de bloquer ou atténuer les effets d'une attaque DDOS lancés contre votre serveur. Si l'attaque DDOS est trop importante, cette solution ne suffira pas.
- Utiliser un routeur matériel (comme un routeur Cisco) pour pouvoir bloquer l'attaque DDOS. Il s'agit d'une solution utilisée par les hébergeurs ou les sociétés comme Google, Facebook, ...
- Mitiger l'attaque DDOS en redirigeant le flux dans différents réseaux possédant une très grande bande passante pour détecter quelles requêtes sont légitimes et lesquelles ne le sont pas. Ensuite, les pirates sont bloqués et les visiteurs réels peuvent de nouveau accéder au serveur sans passer par cette redirection transparente. Exemple avec la protection anti-DDOS d'OVH : Qu’est-ce que la protection anti-DDoS ?

 

6. Bloquer une attaque sur le protocole FTP - ProFTPD

Pour récupérer les adresses IP des pirates, il suffit de consulter le fichier "/var/log/proftpd/proftpd.log".

Soit, le pirate tente de trouver le mot de passe d'un compte existant. Dans ce cas, cherchez l'occurrence : "Incorrect password".

Bash

grep "Incorrect password" /var/log/proftpd/proftpd.log

Ce qui affichera des lignes similaires à celle-ci :
Note : xx.xx.xx.xx correspond à l'adresse IP du pirate.

Plain Text

Mois Jour xx:xx:xx vpsxxxxxx.herbegeur.com proftpd[8516] votre-domaine.com (reverse-dns[xx.xx.xx.xx]): USER compte-existant (Login failed): Incorrect password.

Soit, le pirate tente de trouver le mot de passe d'un compte qui n'existe pas. Dans ce cas, cherchez l'occurrence : "no such user found".

Bash

grep "no such user found" /var/log/proftpd/proftpd.log

Ce qui affichera des lignes similaires à celle-ci :
Note : xx.xx.xx.xx correspond à l'adresse IP du pirate. yy.yy.yy.yy correspond à l'adresse IP de votre serveur.

Plain Text

Mois Jour xx:xx:xx vpsxxxxxx.herbegeur.com proftpd[8426] votre-domaine.com (reverse-dns[xx.xx.xx.xx]): USER compte-inexistant: no such user found from reverse-dns [xx.xx.xx.xx] to ::ffff:yy.yy.yy.yy

Soit, le pirate tente de se connecter avec le compte root. Dans ce cas, cherchez l'occurrence : "root login attempted".

Bash

grep "root login attempted" /var/log/proftpd/proftpd.log

Ce qui affichera des lignes similaires à celle-ci :
Note : xx.xx.xx.xx correspond à l'adresse IP du pirate.

Plain Text

Mois Jour xx:xx:xx vpsxxxxxx.herbegeur.com proftpd[8477] votre-domaine.com (reverse-dns[xx.xx.xx.xx]): SECURITY VIOLATION: root login attempted.

Pour finir, bloquez le ou les pirates en tapant la commande :

Bash

iptables -I INPUT -s xx.xx.xx.xx -j DROP

7. Bloquer les petites attaques DDoS grâce à No More DDOS

Pour installer "No More DDOS", référez-vous à notre tutoriel : Debian / Ubuntu / CentOs - Bloquer les attaques DDOS grâce à No More DDOS (anciennement : DDoS Deflate)