La machine
C a volontairement été placée dans une plage d'adresses
publiques afin qu'elle soit accessible depuis l'
Internet.
Le sous-réseau regroupant les services qui sont directement accessibles
depuis l'extérieur est usuellement désigné par
DMZ
(
“zone démilitarisée”).
Ce sous-réseau demande une attention très particulière car, contrairement
aux postes en adresses privées qui sont inaccessibles, les postes en
DMZ sont directement exposés aux tentatives d'actions malveillantes
issues de l'
Internet.
Il convient donc de sécuriser ces postes particulièrement exposés ainsi que
leur sous-réseau.
Une première démarche consiste à décorréler les adresses publiques visibles
depuis l'
Internet des adresses privées effectivement utilisés par ces
machines.
En effet, les actions malveillantes commencent généralement par une
cartographie du réseau pour en détecter les vulnérabilités : le fait
de brouiller les pistes rend cette démarche plus difficile.
Commençons alors par modifier les adresses de notre
DMZ pour qu'elles
correspondent au sous-réseau privé
192.168.30.0/24.
[D]~# ip addr del 193.100.XX.1/24 dev eth3 ↵
[D]~# ip addr add 192.168.30.1/24 dev eth3 ↵
[C]~# ip addr del 193.100.XX.2/24 dev eth0 ↵
[C]~# ip addr add 192.168.30.2/24 dev eth0 ↵
Attention, après reconfiguration de la machine
C, il faudra lui indiquer
à nouveau sa route par défaut par
D/
eth3 ; vérifiez alors que
vos machines
A et
B communiquent toujours correctement avec
C.
Si vous faites des erreurs lors de la reconfiguration de ces adresses et
routes vous pouvez placer le fichier
reinit.sh
Contenu du fichier reinit.shname=`hostname`
if [ "${1}" != "-y" ] ; then
echo "!!! About to reset network configuration of machine ${name}"
echo -n "!!! Proceed? [y/N] "
read answer
[ "${answer}" != "y" ] && exit 0
fi
for i in `ip link | awk '!/^ / {gsub(":", "", $2); print $2}'` ; do
case ${i} in
eth*) ;;
*) continue ;;
esac
echo "• resetting interface ${i}"
for a in `ip addr show ${i} | awk '/inet/ {print $2}'` ; do
ip addr del ${a} dev ${i} 2>/dev/null
done
ip neigh flush dev ${i}
ip link set dev ${i} down
done
echo "• resetting routes"
for r in `ip route | awk '/via/ {print $1}'` ; do
ip route del ${r}
done
ip route flush cached
echo 0 >/proc/sys/net/ipv4/ip_forward
echo "• resetting firewall"
iptables -t nat -F
iptables -t filter -F
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
dans le répertoire
SHARED de votre poste de travail
Ce répertoire est créé dans votre répertoire de travail au lancement
des machines virtuelles.
Son contenu est accessible, en lecture et en écriture, de manière
partagée par toutes vos machines virtuelles.
.
Il suffit alors de l'invoquer depuis la machine virtuelle concernée :
[C, D]~# sh SHARED/reinit.sh ↵
afin de réinitialiser la configuration de cette machine.
Si vous avez des difficultés, pour gagner du temps vous pouvez également
placer le fichier
labo3.sh
Contenu du fichier labo3.shname=`hostname`
echo "configuring machine ${name}"
XX="${1}"
if [ -z "${XX}" ] ; then
echo "MISSING host number"
exit 1
fi
priv=""
[ "${2}" = "priv" ] && priv="yes"
# XX=`ip link show eth0 | awk '/ether/ {print substr($2, 7, 2)}'`
# XX=`echo "ibase=16; ${XX}" | bc`
IP0=""
IP1=""
IP2=""
IP3=""
case ${name} in
A)
IP0="192.168.10.2/24"
RT="192.168.10.1"
;;
B)
IP0="192.168.20.2/24"
RT="192.168.20.1"
;;
C)
if [ -n "${priv}" ] ; then
IP0="192.168.30.2/24"
RT="192.168.30.1"
else
IP0="193.100.${XX}.2/24"
RT="193.100.${XX}.1"
fi
;;
D)
IP0="20.0.0.${XX} peer 20.0.0.254"
IP1="192.168.10.1/24"
IP2="192.168.20.1/24"
if [ -n "${priv}" ] ; then
IP3="192.168.30.1/24"
RT="192.168.30.1"
else
IP3="193.100.${XX}.1/24"
RT="193.100.${XX}.1"
fi
RT="20.0.0.254"
;;
*)
echo "unknown name ${name}!"
exit 1
;;
esac
sh `dirname ${0}`/reinit.sh -y
for i in 0 1 2 3 ; do
eval ip=\$IP${i}
[ -z "${ip}" ] && continue
echo "• interface eth${i}: ${ip}"
ip link set dev eth${i} up
ip addr add ${ip} dev eth${i}
done
echo "• default route: ${RT}"
ip route add default via ${RT}
if [ "${name}" = "D" ] ; then
echo "• enable ip_forward"
echo 1 >/proc/sys/net/ipv4/ip_forward
if [ -n "${priv}" ] ; then
echo "• enable SNAT from 192.168.10.0/24 to 20.0.0.${XX}"
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 \
-j SNAT --to-source 20.0.0.${XX}
fi
fi
dans le répertoire
SHARED de votre poste de travail et l'invoquer depuis la machine
virtuelle concernée :
[C, D]~# sh SHARED/labo3.sh XX priv ↵
afin d'effectuer automatiquement la configuration de cette machine.
La machine
C n'est donc plus directement accessible depuis
“l'extérieur”.
Pour rendre cet accès à nouveau possible, nous avons besoin de donner des
consignes au système d'exploitation du routeur
D afin qu'il effectue
une
traduction des adresses destinations (DNAT,
redirection d'adresses).
[D]~# iptables -t nat -A PREROUTING -d 193.100.XX.2 -j DNAT --to-destination 192.168.30.2 ↵
Peu importe la forme compliquée de la commande
L'outil iptables est doté d'un très vaste vocabulaire qui
permet d'exprimer des consignes très subtiles.
, elle indique au
firewall qu'il faut traduire (modifier à la volée)
les adresses IP destinations selon l'adresse privée indiquée lorsque des
paquets IP seront destinés à l'adresse publique choisie.
Nous précisons la paire d'adresses IP publique et privée à notre convenance
selon notre configuration.
Bien entendu, le
firewall garde en mémoire les traductions
qu'il effectue pour les paquets entrants et réalise les traductions
réciproques (sur l'adresse IP source) lorsque les réponses à ces
paquets sont produites.
En synchronisation avec un autre participant à l'expérimentation, vérifiez
que votre machine
C est bien accessible de
“l'extérieur” grâce à
l'adresse publique choisie.
Écoutez notamment les interfaces
eth0 et
eth3 de votre routeur
D afin d'observer les traductions d'adresses à l'aller comme au
retour.
Du point de vue de l'extérieur de votre réseau, c'est comme si votre machine
C avait l'adresse IP publique choisie, mais il n'en est rien !
D'ailleurs, si depuis votre machine
C vous tentez de joindre une
adresse IP publique d'un autre participant, vous vous retrouverez
dans la situation de la machine
B.
Votre
DMZ, désormais en adresses privées, ne peut pas décider de quitter
votre site ; elle se contente de répondre aux sollicitations.
Cette propriété est extrêmement intéressante en terme de sécurité car
les actions malveillantes visent souvent à se propager depuis des sites
infestés
En particulier, si un trafic malveillant émane de votre site, vous en
êtes jugé responsable !
Cela pourrait se produire si une de vos machines en DMZ était
corrompue et tentait à son tour d'émettre un trafic malveillant.
Il serait alors difficile de prouver aux autorités que l'origine de
ce trafic illégitime ne vous est pas due.
.
Dans ces conditions, même si votre machine en
DMZ est corrompue, elle
ne pourra émettre aucun trafic vers le reste du monde.
Un autre intérêt très appréciable de la décorrélation entre les adresses
publiques visibles et les adresses privées effectivement utilisées tient
dans la souplesse offerte en terme de reconfiguration.
Nous pouvons séparer notre
DMZ en de multiples sous-réseaux (pour
des raisons de sécurité), ou au contraire regrouper sur une seule machine
des services qui en apparence fonctionnent sur plusieurs (pour des raisons
de disponibilité du matériel par exemple).
Vis-à-vis de l'extérieur, ces détails d'architecture sont invisibles, ce qui
nous autorise à les modifier à tout moment, et pour quelque raison que
ce soit, sans que ce ne soit perceptible.
La traduction
DNAT précédente concernait une machine dans sa globalité
mais il est possible d'être beaucoup plus précis.
[D]~# iptables -t nat -A PREROUTING -d 193.100.XX.3 -p tcp --dport 80 -j DNAT --to-destination 192.168.30.2:8080 ↵
Avec cette commande nous associons le port TCP 80 d'une nouvelle adresse IP
publique au port 8080 de notre machine
C.
Toujours en synchronisation avec un autre participant, démarrez un serveur
TCP simpliste sur votre machine
C
[C]~# ncat -lp 8080 ↵
et sollicitez-le depuis un poste externe à votre réseau.
[distant A]~# ncat 193.100.XX.3 80 ↵
afin que les saisies au clavier de part et d'autre soient échangées entre
ces deux interlocuteurs.
Écoutez encore les interfaces
eth0 et
eth3 de votre routeur
D afin d'observer les traductions d'adresses et de ports à l'aller
comme au retour.
Le poste distant a l'illusion de dialoguer avec un serveur TCP sur le
port 80 de la nouvelle adresse IP publique choisie, mais le serveur
est situé à nouveau sur notre unique machine
C et utilise un
tout autre port.
D'ailleurs, cette nouvelle adresse IP publique ne répond même pas à
l'outil
ping ; la communication n'est autorisée que pour le
service désigné très précisément (TCP sur le port 80).
Si nous ne pouvions pas disposer de la plage d'adresses IP publiques
193.100.XX.0/24
Seul un établissement de grande envergure (entreprise, université...)
dispose d'une telle plage d'adresses IP publiques normalement.
, mais uniquement de la seule adresse IP publique sur l'interface externe
du routeur
C'est le cas de l'Internet domestique par exemple.
Le boîtier fait office de routeur et lui seul dispose d'une adresse IP
publique attribuée par le fournisseur d'accès ; tous les autres
équipements de la maison utilisent des adresses privées.
nous aurions pu, malgré tout, exposer des services en
DMZ selon
le même procédé
DNAT.
[D]~# iptables -t nat -A PREROUTING -d 20.0.0.XX -p tcp --dport 80 -j DNAT --to-destination 192.168.30.2:8080 ↵
Reprenez alors l'expérimentation précédente (dialogue en TCP sur le port 80
depuis une machine
A distante) en visant cette fois-ci l'adresse
publique
20.0.0.XX.
C'est cette solution qui est utilisée pour
“ouvrir des ports” sur les
boîtiers offrant l'accès à l'
Internet domestique.