Synology DS620slim  

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 :

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 rootqui 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 :

· DSM, blacklisting