Automatiser le blocage d'adresses IP à partir d'une liste publique "blacklisting"
(Testé sur le DSM 6.2.3-25423)
Prérequis avant de commencer :
- Avoir activer SSH et pouvoir se connecter en root
- Avoir installer OPKG sur le Synology
- Avoir installer l'editeur de texte nano pour modifier les fichiers de configuration
La propriété de blocage automatique aide à améliorer la sécurité du NAS Synology en bloquant les adresses IP des clients ayant de trop nombreux échecs de tentatives de connexion. Ces réglages se trouvent dans “Panneau de configuration” > “Sécurité” > “Compte”. Une fenêtre permet de gérer un liste blanche (liste des permissions) et une liste noire (liste des blocages). Elle permet aussi d’importer des listes d’adresses IP déjà connues pour leurs tentatives répétées de connexion.
Les listes disponibles sur Internet
Le site www.blocklist.de met à disposition plusieurs listes mise à jour toutes les 30 minutes. Elles sont disponibles sur le site https://www.blocklist.de/.
Le site met à disposition des listes d’adresses IP tentant de se connecter en ssh, sur les serveurs FTP, mail etc. Il met aussi à disposition une liste globale.
Vous pouvez importer une des listes téléchargées de www.blocklist.de grâce à l’option “Importer une liste d’adresses IP”.
La base de données interne du Synology regroupant les adresses IP bloquées
Les adresses IP bloquées sont stockées dans une base de données synoautoblock.db
:
/etc/synoautoblock.db
Pour manipuler ce fichier, il faut que vous ayez les privilèges root
. Inutile de tenter de la lire avec une commande comme nano, pico ou vim : c’est une base de données au format sqlite3. Pour découvrir comment elle fonctionne, faisons quelques petites opérations.
Ouvrons la base :
root@DS620slim:~# sqlite3 /etc/synoautoblock.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite>
Puis demandons quelles sont les tables présentes dans la base de données :
sqlite> .table
AutoBlockIP
Il y a dans la base une table qui s’appelle ÀutoBlockIP
. Demandons maintenant comment est construite la base :
sqlite> .schema
CREATE TABLE AutoBlockIP(IP varchar(50) PRIMARY KEY,RecordTime date NOT NULL,ExpireTime date NOT NULL,Deny boolean NOT NULL,IPStd varchr(50) NOT NULL,Type INTEGER,Meta varchar(256));
CREATE INDEX result_expiretime_idx ON AutoBlockIP(ExpireTime);
CREATE INDEX result_deny_idx ON AutoBlockIP(Deny);
La commande .help
permet d’accéder à l’aide et la commande .quit
de quitter l’invite de commande de la base sqlite.
On peut aussi obtenir via le shell classique les mêmes informations :
root@DS620slim:~# sqlite3 /etc/synoautoblock.db ".tables"
AutoBlockIP
On peut aussi lire les entrées présentes dans la base :
root@DS620slim:~# sqlite3 /etc/synoautoblock.db "select * from AutoBlockIP;"
95.54.142.170|1587506220|1590098220|1|0000:0000:0000:0000:0000:FFFF:5F36:8EAA|0|
95.246.168.254|1587506220|1590098220|1|0000:0000:0000:0000:0000:FFFF:5FF6:A8FE|0|
...
L’ensemble des entrées défile sur l’écran : l’examen d’une ligne, c’est-à-dire une entrée, correspond bien au schema de la base :
adresse IP v4 | Date d'entrée dans la base | Date d'expiration ! 1 | adresse IP v6 | 0 |
Avec la commande hearders
sqlite> .headers on
sqlite> select * from AutoBlockIP;
IP|RecordTime|ExpireTime|Deny|IPStd|Type|Meta
1.0.145.170|1587519247|1590111247|1|0000:0000:0000:0000:0000:FFFF:0100:91AA|0|
1.0.145.236|1587519247|1590111247|1|0000:0000:0000:0000:0000:FFFF:0100:91EC|0|
La commande suivante permet de ne lire que la première colonne des données :
root@DS620slim:~# sqlite3 -csv /etc/synoautoblock.db "select * from AutoBlockIP;" | awk -F',' '{print $1}'
95.94.162.12
96.10.168.146
...
...
96.70.41.109
Une commande importante qui permet de vider l’intégralité des données dans la base de données :
root@DS620slim:~# sqlite3 /etc/synoautoblock.db "delete from AutoBlockIP where DENY = 1;"
Avec ces éléments, vous serez en capacité de comprendre comment fonctionne le script et d’agir sur la base de données directement.
Les scripts utilisés
Le script utilisé sur ce serveur update-synoautoblock.db.sh
est disponible sur la page “fichiers”.
Si vous avez installé opkg, le script peut ne pas fonctionner selon les priorités des répertoires de recherche des exécutables. En effet, vous pouvez avoir installé une version de date
dans /opt/bin/
qui ne fonctionne pas comme l’exécutable date
du DSM qui se trouve lui dans /bin/
. Dans le script utilisé sur ce serveur (qui est le plus simple et et le plus basique), le code renvoit bien à /bin/date
. Il a été testé et il est actuellement en fonctionnement.
Dans le script, vous pouvez ajuster deux variables :
BLOCKLIST : Cette variable correspond au type de liste issue de blocklist.de que vous souhaitez utiliser : all, ssh, ftp, etc.
DELETE_IP_AFTER : Nombre de jours après lequel les IP sont retirées de la liste de blocage.
Installation du script
Télécharger le script “update-synoautoblock.db.sh” sur la page “fichiers”, le renommer en enlevant l’extension “.txt” et le placer par exemple dans votre dossier home
. Il peut être bon de se connecter en ssh et de rentre le fichier executable (chmod 755
) si vous souhaitez le lancer directement. Le script doit être lancé en tant qu’utilisateur root
car c’est l’utilisateur root
qui peut lire la base /etc/synoautoblock.db
. Le script n’est pas optimisé au niveau de l’ajout dans la base /etc/synoautoblock.db
mais il fonctionne actuellement sur ce serveur. La première fois que vous l’exécuterez, si vous sélectionnez la base complète de blocklist.de, l’ajout des IP à bloquer prendra beaucoup de temps. Les mises à jour, chaque soir demanderont quant à elles, beaucoup moins de temps.
Il faut maintenant créer la tâche programmée qui exécutera chaque nuit le script. Cela est possible dans “Panneau de configuration” > “Planificateurs de tâches”, puis “Créer” > “Tâche planifiée” > “Script défini par l’utilisateur”. La tâche doit appartenir à l’utilisateur root
. Voici le paramètre de la tâche :