Product SiteDocumentation Site

B.6. Mise à jour de sécurité protégée par un pare-feu

Après une installation standard, un système peut toujours avoir des failles de sécurité. À moins de pouvoir télécharger les mises à jour pour les paquets vulnérables depuis un autre système (ou si vous avez fait un miroir de security.debian.org pour utilisation en local), le système devra être connecté à Internet pour les téléchargements.
Cependant, dès que vous vous connecter à Internet, vous exposez le système. Si l'un des services locaux est vulnérable, votre système peut même être compromis avant la fin de la mise à jour ! Cela peut sembler paranoïaque, mais une analyse du http://www.honeynet.org a démontré que les systèmes peuvent être compromis en moins de trois jours, même si le système n'est pas connu publiquement (c'est-à-dire, non publié dans les enregistrements DNS).
Lorsque vous faites une mise à jour sur un système non protégé par un système externe comme un pare-feu, il est possible de configurer correctement votre pare-feu pour restreindre les connexions n'impliquant que la mise à jour de sécurité elle-même. L'exemple ci-dessous montre comment mettre en place des telles fonctionnalités de pare-feu, ne permettant que les connexions à security.debian.org et en journalisant toutes les autres.
L'exemple suivant permet de configurer un jeu de règles de pare-feu restreint. Exécutez ces commandes depuis une console locale (pas à distance) pour limiter les risques de vous enfermer hors du système.
# iptables -F
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
# iptables -A OUTPUT -d security.debian.org --dport 80 -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -j LOG
# iptables -A OUTPUT -j LOG
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP
# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
LOG        all  --  anywhere             anywhere           LOG level warning

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     80   --  anywhere             security.debian.org
LOG        all  --  anywhere             anywhere           LOG level warning
Remarque : l'utilisation d'une règle DROP dans la chaîne INPUT est la chose la plus correcte à faire, mais soyez particulièrement attentif lorsque c'est fait après avoir nettoyé la chaîne depuis une connexion distante. Lors d'un test des jeux de règles de pare-feu à distance, il est préférable d'exécuter un script avec le jeu de règles de pare-feu (au lieu d'introduire les règles une à une depuis la ligne de commande) et, par précaution, de garder une porte dérobée[88]
Bien sûr, toutes les portes dérobées devraient être désactivées avant de placer le système en production configurée pour pouvoir réactiver l'accès au système en cas d'erreur. Ainsi, il ne sera pas nécessaire de se déplacer pour corriger un jeu de règles de pare-feu bloquant.
FIXME : cela nécessite un DNS opérationnel puisqu'il est nécessaire pour résoudre security.debian.org. security.debian.org pourrait être ajouté à /etc/hosts mais c'est un nom canonique pour plusieurs hôtes (il y a plus d'un miroir de sécurité).
FIXME : cela ne fonctionnera qu'avec les URL HTTP car FTP peut avoir besoin du module ip_conntrack_ftp ou d'utiliser le mode passif.


[88] Par exemple knockd. Sinon, il est possible d'ouvrir une autre console et forcer le système à confirmer que quelqu'un est présent de l'autre côté, et réinitialiser la chaîne de pare-feu en absence de confirmation. Le script de test suivant pourrait servir :
#!/bin/bash while true; do read -n 1 -p "Y a-t-il quelqu'un ? " -t 30 ayt if [ -z "$ayt" ] ; then break fi done # Réinitialiser la chaîne de pare-feu, l'utilisateur n'est pas disponible echo echo "Réinitialisation de la chaîne de pare-feu" iptables -F iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT exit 1