Sécuriser son Syno lorsqu’il est connecté à un VPN

Bonjour,

Suite à pas mal de posts traitants de connexion VPN a partir d’un Syno, j’ai remarqué que presque personne ne se soucie de l’aspect sécurité.

Lorsque le NAS passe par un tunnel VPN en vue d’être anonyme sur internet, le fait d’avoir une IP publique vous expose complètement. La sécurité apportée par un routeur/box/… est inefficace car le NAS est connecté et visible directement sur internet, un peu comme si le câble réseau du syno était publique.

Le DSM (4.1 dans mon cas)  propose une interface pour configurer le firewall mais celle ci ne reprends pas l’interface virtuelle créée lors de l’établissement du tunnel VPN. Il n’est donc pas possible d’appliquer des règles pour bloquer les ports ouverts sur votre NAS et son interface VPN.

Lorsque vous avez une connexion VPN fonctionnelle (PPTP ou openVPN) il est possible d’appliquer manuellement des règles pour filtrer les connections vers votre NAS. Le problème est que ces règles disparaissent lorsque le VPN est déconnecté ou qu’il est reconnecté automatiquement après une interruption.

Pour éviter de devoir scruter manuellement la présence des filtres, j’ai fais un script qui vérifiera toutes les minutes si le VPN est connecté et si oui, si les filtres sont présent. Si les filtres ne sont pas présent, il jouera les commandes nécessaires pour créer les filtres.

Cron (planificateur de tâches Unix/Linux) se chargera d’exécuter le script à intervalles réguliers.

Pour suivre ce tuto vous devez avoir au minimum les connaissances de base linux. Toute la marche à suivre est à exécuter en tant que root. Je tiens quand même à vous avertir que si vous ne comprenez rien à ce qui est dit, il est risqué d’aller plus loin.

le script doit être accessible dans l’arborescence de votre syno (par exemple dans /usr/local/scripts/ ) et exécutable (chmod +x lenomduscript.sh)

Le script est le suivant:

####################################################################
# This script coverts the lack of security when machine is fully #
# exposed on its public IP address once connected to a VPN. #
# It is designed to work on Synology NAS running DSM 4.1 but #
# general linux rules apply, it should be usefull for other #
# purpose. #
# e−raw [@] e−raw.be #
####################################################################

# Local settings definition #
#
#iptables binary path
iptables= »/sbin/iptables »
#VPN interface
#Should be tun0 for openVPN instance and ppp0 for PPTP
interface= »tun0″
#
# Test if VPN is up and iptables rules have been defined yet #
#
if [ −n « $(ifconfig | grep « $interface ») » ] && [ −z « $($iptables −L −v | grep « $interface ») » ]; then
#Incoming connections ACCEPT on the VPN interface #

$iptables −A INPUT −i $interface −p tcp −−destination−port 22 −j ACCEPT
#[…]
$iptables −A INPUT −i $interface −p tcp −−destination−port 5001 −j ACCEPT
##EDIT: Mandatory to allow DDNS client to resolve it own public address:
$iptables −A INPUT −m state −−state ESTABLISHED,RELATED −j ACCEPT

#if none of the rules were matched DROP #
$iptables −A INPUT −i $interface −p tcp −j DROP
$iptables −A INPUT −i $interface −p udp −j DROP
$iptables −A INPUT −i $interface −p icmp −j DROP
fi
exit 0;

La ligne iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT doit être ajoutée sinon (entre autre) l’update DDNS ne pourra se faire (cette ligne autorise les packets qui font partie d’une session déjà ouverte, dans ce cas par le client DDNS qui dois connaître son IP publique).

Deux choses sont à adapter a vos besoins:

  •     Le type de VPN. L’interface virtuelle créée lors de la connection est  tun0  dans le cas d’openVPN et ppp0 dans le cas du PPTP
  •     Les ports à ouvrir. Ceux çi doivent être l’équivalent de ce que vous avez routé sur votre box pour pouvoir y avoir accès de l’extérieur. faites attentions au protocole (udp/tcp) ainsi qu’au port (en rouge)

Une fois le script modifié et exécutable, connectez-vous au VPN. Vous pourrez vérifier que il n’y a aucun filtre avec la commande iptables -L -v

Lancez le script manuellement une première fois et rejouez la commande iptables -L -v

Les filtres sont désormais appliqués et visibles.

Pour rendre le tout automatique, il faut utiliser crontab. Dans mon cas, le script est exécuté toute les minutes. Il y aura donc maximum une minute ou le NAS sera exposé lors de chaque reboot/reconnexion.

Sur le syno, les entrées du cron se trouvent dans le crontab dans /etc/crontab:

DiskStation> cat /etc/crontab
#minute hour mday month wday who command
32 18 * * 2,5 root /usr/syno/bin/synopkg chkupgradepkg
0 4 * * 1 root /var/packages/AntiVirus/target/bin/synoavscan --all
* * * * * root /usr/local/scripts/vpn_iptables.sh

Chaque ligne représente une tache planifiée. On remarque ici que vpn_iptables.sh (le script en question) est exécuté toute les minutes. Les autres lignes ne doivent pas être touchées!

Ajoutez à l’aide de vi par exemple la ligne en rouge correspondant à votre script. Redémarrez crond avec les commandes :

/usr/syno/etc.defaults/rc.d/S04crond.sh stop
/usr/syno/etc.defaults/rc.d/S04crond.sh start

Pour vérifier que votre script fonctionne bien, vous pouvez vider les règles de filtres avec la commande iptables -F ce qui aura le même effet qu’une nouvelle (re)connexion.

Après maximum une minute (suivant l’intervalle que vous avez configuré dans cron) les filtres devraient réapparaitre, à vérifier avec iptables -L -v

J’espère que ça en aidera quelques uns!

Remarque: Ce post est initialement posté sur NAS-Forum


Je tenais à remercier grandement E-Raw pour cet article. Il est dans la lignée de ce que le blog veut être. Vulgariser l’ usage des VPN et apporter des tutos clairs et de qualités.

 

Share

1 Commentaire sur “Sécuriser son Syno lorsqu’il est connecté à un VPN”

LAISSER UN COMMENTAIRE

  1. Mojo dit :

    Excellent Article / tuto.
    Je suis tombé dessus justement en cherchant comment sécuriser la connexion VPN de mon Synology, qui non-firewallée est un énorme trou de sécurité dans le cas d’une connexion à un VPN public / non trusté.
    Il semble que Synology envisage ce client VPN uniquement établir des connexions à des des VPN privés. Il suffirait pourtant simplement d’ajouter les interfaces  PPPx et TUNx à l’app de configuration du firewall du syno pour combler ce trou et rendre le client VPN beaucoup plus intéressant.