Savez-vous ce qu’est la tragédie des communs ? C’est quand une ressource commune est surexploitée et au final, tout le monde est perdant.
C’est un peu ce qui se passe en ce moment sur l’instance officielle de mon logiciel Lutim : https://lut.im.
En effet, depuis déjà quelques jours, ce site est inaccessible en soirée. Trop d’utilisateurs qui veulent voir trop d’images en même temps. Lut.im victime de son succès ?
Oui et non : oui car le site commence à être plutôt connu (surtout en Russie, allez savoir pourquoi) ; non car c’est un problème d’abus de la ressource commune qu’est lut.im : en effet, le problème vient de l’utilisation qui est en faite par quelques personnes.
Pour comprendre ce qui se passait, j’ai activé les logs d’accès au service — en prenant soin de ne pas afficher les adresses des images demandées (voir plus bas) — et j’ai noté quelques adresses de referer suspectes ainsi qu’un nombre incroyable de requêtes demandées par des user-agent Kodi et quelques XBMC.
J’ai été voir sur un des referer suspects : un site de streaming de chaîne télé… et certains des logos des chaînes étaient hébergés sur https://lut.im ! Ça m’a mis la puce à l’oreille quant aux user-agent Kodi. Un peu de recherche genre kodi tv channel "https://lut.im"
et je tombe sur un truc comme http://www.listaiptvbrasil.com.br/paste.php?id=3 (oui, je savais qu’il y avait moyen de voir des chaînes de télé sur Kodi, j’en ai un et j’avais regardé si je pouvais voir des chaînes de télé mais j’avais au final laissé tomber, vu la qualité de ce qu’on peut voir à la télé (pis bon, la pub…)).
J’ai donc bloqué, pour éviter l’indisponibilité fréquente de https://lut.im, les referer de ce genre que j’ai trouvé ainsi que les user-agent Kodi et XBMC :
if ($http_referer ~ (site1|site2) {
return 429;
}
if ($http_user_agent ~* (Kodi|XBMC)) {
return 429;
}
Le statut 429 que je renvoie correspond à « Too Many Requests ». Disons que c’est le statut que j’ai trouvé le plus proche de la situation. Certes, ce n’est pas le client qui fait trop de requêtes, mais bon.
La soirée d’hier s’est passée sans alerte de la part de la supervision et chaque fois que j’ai été voir le site, celui-ci était accessible ! Mes actions ont donc évité la surexploitation de la ressource commune 🙂
Et voilà comment j’ai modifié le format de mon log d’accès pour ne pas loguer les IPs de mes visiteurs ni les URLs des images demandées :
log_format lutim '$remote_user [$time_local] $status $body_bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"';
server {
…
access_log /var/log/nginx/lutim.access.log lutim;
…
}
J’ai après cela remis la configuration à access_log off;
et supprimé les journaux d’accès.
Crédit : Photo de Brad Helmink sur Unsplash