Si vous arrivez ici car vous recherchez la cause du message “Error establishing a database connection” qui s’affiche lorsque vous tentez d’accéder à un site web, je vais ici vous en indiquer une cause probable et une façon de remédier au problème.
Les causes de l’erreur “Error establishing a database connection”
A première vue, le process mysql qui permet de faire fonctionner la base de donnée du site web s’est arrêté. Tentons de comprendre pourquoi !
Tapez “dmesg” dans l’invité de commande de votre serveur
[4747880.173192] Out of memory: Kill process 6898 (apache2) score 102 or sacrifice child
[4747880.176918] Killed process 6898 (apache2) total-vm:319164kB, anon-rss:61624kB, file-rss:41932kB
[4747881.542885] init: mysql main process (6526) terminated with status 1
[4747881.542913] init: mysql main process ended, respawning
[4747881.577925] type=1400 audit(1466221659.162:47): apparmor=”STATUS” operation=”profile_replace” profile=”unconfined” name=”/usr/sbin/mysqld” pid=6963 comm=”apparmor_parser”
[4747881.692184] init: mysql main process (6975) terminated with status 1
[4747881.692197] init: mysql main process ended, respawning
[4747882.677913] init: mysql post-start process (6976) terminated with status 1
[4747882.704025] type=1400 audit(1466221660.286:48): apparmor=”STATUS” operation=”profile_replace” profile=”unconfined” name=”/usr/sbin/mysqld” pid=6999 comm=”apparmor_parser”
[4747882.988167] init: mysql main process (7011) terminated with status 1
[4747882.988183] init: mysql respawning too fast, stopped
Relancer le serveur mysql avec la commande “service mysql start” fera repartir votre site web et corrigera le problème… temporairement. Car en y regardant de plus près, on trouve les causes du problème dans les logs apache :
Tapez “grep xmlrpc /var/log/apache2/access.log”
63.251.225.206 – – [20/Jun/2016:11:17:34 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
63.251.225.206 – – [20/Jun/2016:11:17:34 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
63.251.225.206 – – [20/Jun/2016:11:17:36 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
63.251.225.206 – – [20/Jun/2016:11:17:36 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
63.251.225.207 – – [20/Jun/2016:11:17:41 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
63.251.225.207 – – [20/Jun/2016:11:17:41 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
63.251.225.207 – – [20/Jun/2016:11:17:43 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
63.251.225.207 – – [20/Jun/2016:11:17:43 -0400] “POST /xmlrpc.php HTTP/1.0” 200 820 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)”
Tout un tas de requêtes XMLRPC, saturant la mémoire de votre serveur déclenchant ainsi les systèmes de protection du kernel : terminer le processus qui consomme de façon excessive !
Il s’agit donc d’une attaque de type DOS. Voyons maintenant un moyen efficace de se protéger contre cette attaque
Se protéger d’une attaque DOS XMLRPC
Installation et configuration de Fail2Ban
Fail2ban est un outil très puissant vous permettant de déclencher des actions précises en s’appuyant sur les fichiers de logs de vos différents outils (ssh, apache, etc)
Dans notre cas, nous devons créer un nouveau filtre pour nous protéger de cette attaque.
En premier lieu, installez fail2ban : Tapez “sudo apt-get install fail2ban”
Créons ensuite un filtre apache-xmlrpc : Tapez “vim /etc/fail2ban/filter.d/apache-xmlrpc.conf”
Ajoutez ensuite la configuration suivante qui vous permet de détecter ce type de requêtes XMLRPC grâce à l’expression régulière suivante :
[Definition]
failregex = ^<HOST>.*\”POST /xmlrpc.php HTTP/1.0
ignoreregex =
Enregistrez et quittez en appuyant sur ECHAP+:wq + ENTREE
Ensuite, nous allons définir les actions à prendre lorsque les conditions précédentes sont rencontrées. Cela se passe dans le fichier /etc/fail2ban/jail.conf
[apache-xmlrpc]
enabled = true
port = http,https
filter = apache-xmlrpc
logpath = /var/log/apache2/access.log
maxretry = 3
bantime = 240000
Enregistrez et quittez en appuyant sur ECHAP+:wq + ENTREE
Cette configuration indique donc à Fail2ban quel fichier de log surveiller, et quelles actions entreprendre lorsque un accès XMLRPC est détecté dans le fichier de log apache. Ici, au bout de 3 tentatives de la même adresse IP, nous bannissons l’adresse IP pendant 240.000 secondes (66 heures)
Relancez enfin fail2ban afin de prendre en compte cette nouvelle configuration : “service fail2ban restart”
Constatons le resultat quelques jours plus tard dans les logs de fail2ban, plus de problèmes de apache2 ou mysql qui crashent !
2016-06-20 01:31:41,361 fail2ban.jail : INFO Jail 'apache-xmlrpc' stopped
2016-06-20 01:31:42,842 fail2ban.jail : INFO Creating new jail 'apache-xmlrpc'
2016-06-20 01:31:42,843 fail2ban.jail : INFO Jail 'apache-xmlrpc' uses pyinotify
2016-06-20 01:31:42,859 fail2ban.jail : INFO Jail 'apache-xmlrpc' started
2016-06-20 11:17:38,062 fail2ban.actions: WARNING [apache-xmlrpc] Ban 63.251.225.206
2016-06-20 11:17:45,076 fail2ban.actions: WARNING [apache-xmlrpc] Ban 63.251.225.207
2016-06-20 11:27:10,390 fail2ban.actions: WARNING [apache-xmlrpc] Ban 128.199.230.229
2016-06-20 11:27:11,406 fail2ban.actions: WARNING [apache-xmlrpc] Ban 107.170.112.47
2016-06-20 11:27:13,419 fail2ban.actions: WARNING [apache-xmlrpc] Ban 52.172.157.148
2016-06-21 14:49:34,250 fail2ban.actions: WARNING [apache-xmlrpc] Ban 162.243.73.135
2016-06-21 15:32:37,567 fail2ban.actions: WARNING [apache-xmlrpc] Ban 46.101.238.216
2016-06-21 15:33:01,603 fail2ban.actions: WARNING [apache-xmlrpc] Ban 104.236.7.133
Et pour cause ! L’attaque a continué à partir d’autres adresses IP, toutes bannies, mais maintenant votre serveur est paré contre ce genre d’attaques !
Pour en savoir plus sur la gestion de risque et comment anticiper et traiter ce genres de menaces, consulter notre guide “S’approcher du risque 0 – Edition Entreprise”