Sécurité d'un ordinateur sur un réseau local (en IPv4)

Forum sur la sécurité des réseaux, la configuration des firewalls, la mise en place de protections contre les attaques, de DMZ, de systèmes anti-intrusion ...

Modérateur: modos Ixus

Sécurité d'un ordinateur sur un réseau local (en IPv4)

Messagepar La_Binocle » 06 Sep 2008 00:25

Sécurité d'un ordinateur sur un réseau local (en IPv4)

Bonjour

Le but de ce script bash est de connecter, de façon sécurisée, un ordinateur au sein d'un réseau local hostile.

Le réseau local est dit « hostile » car il contient des ordinateurs appartenant à des personnes en qui vous n'avez pas confiance, ou susceptibles d'être infectés par des logiciels malveillants (les ordinateurs, pas les personnes :-)). Le réseau local est en IPv4, et peut éventuellement contenir une passerelle vers un autre réseau, typiquement internet. Notre ordinateur est équipé d'une distribution GNU/Linux quelconque.

Le script met en place différents paramètres afin de garantir la meilleure sécurité possible pour notre ordinateur : on configure Netfilter afin d'interdire la réception/l'envoi de paquets réseaux depuis/vers les autres ordinateurs du réseau local, à l'exception, de 3 « ordinateurs de confiance ». On configure également le cache ARP avec des entrées statiques, pour diminuer le risque d'usurpation d'identité.

Ce script est susceptible de modification afin de convenir à votre situation personnelle (si vous utilisez une interface réseau wifi plutôt qu'ethernet, ou bien si votre ordinateur est lui-même un serveur ou une passerelle, etc). N'hésitez pas à l'adapter à votre cas !

Pourquoi avoir créé ce script ?
J'habite depuis peu un appartement, dans un immeuble. Le propriétaire de l'immeuble partage sympathiquement sa connexion à internet entre tous ses locataires, en utilisant un routeur.

Ainsi, pour bénéficier de l'abonnement internet du propriétaire, les différents locataires sont dans un même réseau local :
- 192.168.1.59 : C'est le couple de retraités du troisième étage
- 192.168.1.27 : Voici l'étudiant fêtard du rez-de-chaussé.
- 192.168.1.99 : C'est le bidouilleur informatique du premier étage, je le soupçonne de télécharger plein de trucs louches.
- 192.168.1.102 : Hé ! C'est moi !
- 192.168.1.156 : Voici l'imprimante réseau de notre propriétaire
- 192.168.1.1 : Notre bien-aimé routeur, qui fait office de passerelle vers internet
- 192.168.1.7 : Je n'ai pas la moindre idée de la personne titulaire de cette IP-là.
- ... et il y a plein d'autres locataires dans notre immeuble. Tous font partis de ce réseau local.

Mon ordinateur se retrouve donc dans un réseau local avec ceux de mes voisins de palier. Hmmmm ... Est-ce dangereux ? Je ne connais pas les intentions de mes voisins. Peut-être sont-ils mal intentionnés, à l'écoute du réseau lorsque je me connecte sur le site de ma banque ? Leurs ordinateurs sont peuvent être infectés de logiciels malveillants.

Je me suis donc intéressé à la sécurité informatique dans le cadre de ce réseau local. J'ai d'abord paramétré mon client de messagerie pour qu'il utilise des connexions SSL (envois de courrier par le port 465 plutôt que 25, réception du courrier par le port 995 plutôt que 110).

Comment sécuriser au mieux mon ordinateur dans ce réseau local ? Comment me protéger de mes voisins ?
Je ne peux malheureusement pas les empêcher de sniffer le réseau, mais je peux limiter les communications entre mon ordinateur et les leurs. Ma recherche d'une plus grande sécurité a débouché sur l'écriture de ce script. Vos commentaires, critiques et propositions d'amélioration sont les bienvenus !



Début du script
#!/bin/bash
# Script de connexion sécurisée au réseau local
# Version 1.0 - septembre 2008

# Caractéristiques de notre réseau local :
MASQUE_RESEAU=255.255.255.0
RESEAU=192.168.1.0/$MASQUE_RESEAU

# Adresse IP de notre ordinateur :
MON_IP=192.168.1.102
# Le script nécessite d'utiliser une adresse IP fixe.
# Si vous utilisez un serveur DHCP pour l'attribution des adresses IP sur votre réseau local,
# paramétrez-le pour qu'il vous attribue systématiquement la même IP
# (en se fiant à l'adresse MAC de votre interface réseau).

# Notre interface réseau (INTerface RESeau), ainsi que son adresse MAC :
INT_RES=eth0
MAC_INT_RES=00:9D:09:81:CC:6A


Nous acceptons de communiquer avec 3 autres ordinateurs du réseau local. Ce sont 3 ordinateurs « de confiance ». Il peut s'agir d'une passerelle vers internet, d'un serveur DNS, d'un serveur de fichier, etc.
Nous connaissons les adresses IP de ces 3 ordinateurs, ainsi que l'adresse MAC de leur interface réseau.
IP_ORDI_1=192.168.1.1
MAC_ORDI_1=00:7B:35:5A:94:0C

IP_ORDI_2=192.168.1.18
MAC_ORDI_2=00:C5:1A:CA:69:E2

IP_ORDI_3=192.168.1.36
MAC_ORDI_3=00:49:DD:8A:1C:E4

Toutes les communications avec les autres ordinateurs du réseau local seront bloquées.


On désactive l'interface réseau ; on la réactivera à la fin du script, lorsque les différents paramètres de sécurité seront actifs.
ifconfig $INT_RES down


À présent, paramétrons Netfilter :
En savoir plus sur Netfilter ici
# Interdiction de tous les paquets réseaux IPv6 avec « ip6tables ».
ip6tables -t filter -F
ip6tables -t filter -X
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P OUTPUT DROP
ip6tables -t filter -P FORWARD DROP

ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -t mangle -P PREROUTING DROP
ip6tables -t mangle -P INPUT DROP
ip6tables -t mangle -P FORWARD DROP
ip6tables -t mangle -P OUTPUT DROP
ip6tables -t mangle -P POSTROUTING DROP

ip6tables -t raw -F
ip6tables -t raw -X
ip6tables -t raw -P PREROUTING DROP
ip6tables -t raw -P OUTPUT DROP



Occupons-nous maintenant du paramétrage de Netfilter vis-à-vis des paquets réseaux IPv4 :
# On fait le ménage des règles existantes pour les 3 tables "filter", "mangle" et "nat".
iptables -t filter -F
iptables -t filter -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t nat -F
iptables -t nat -X


# On règle les tables mangle et nat.
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT


# On règle également la chaîne FORWARD de la table filter.
iptables -t filter -P FORWARD DROP



On définit les règles de la chaîne INPUT de la table filter.
# On crée une chaîne « ControleIPinput » qui bloque les paquets réseaux
# en provenance du réseau local, à l'exception de ceux provenant
# de nos 3 ordinateurs de confiance :

iptables -t filter -N ControleIPinput
iptables -t filter -A ControleIPinput -s $IP_ORDI_1 -j RETURN
iptables -t filter -A ControleIPinput -s $IP_ORDI_2 -j RETURN
iptables -t filter -A ControleIPinput -s $IP_ORDI_3 -j RETURN
iptables -t filter -A ControleIPinput -j DROP


# À présent, on paramètre la chaîne INPUT :

iptables -t filter -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -s $RESEAU -j ControleIPinput
iptables -t filter -A INPUT -i $INT_RES -d $MON_IP -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -P INPUT DROP
On utilise le module de suivi de connexion « conntrack ». En savoir plus sur le suivi de connexion ici. Nous utilisons « -m conntrack --ctstate » à la place du traditionnel « -m state --state ». Voir ici.

On définit les règles de la chaîne OUTPUT de la table filter.
# On crée une chaîne « ControleIPouput » qui bloque les paquets réseaux
# à destination du réseau local, à l'exception de ceux à destination
# de nos 3 ordinateurs de confiance :

iptables -t filter -N ControleIPoutput
iptables -t filter -A ControleIPoutput -d $IP_ORDI_1 -j RETURN
iptables -t filter -A ControleIPoutput -d $IP_ORDI_2 -j RETURN
iptables -t filter -A ControleIPoutput -d $IP_ORDI_3 -j RETURN
iptables -t filter -A ControleIPoutput -j DROP

# À présent, on paramètre la chaîne OUTPUT :

iptables -t filter -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -t filter -A OUTPUT -o lo -j ACCEPT
iptables -t filter -A OUTPUT -d $RESEAU -j ControleIPoutput
iptables -t filter -A OUTPUT -s ! $MON_IP -j DROP
iptables -t filter -A OUTPUT -o ! $INT_RES -j DROP
iptables -t filter -P OUTPUT ACCEPT

Netfilter est maintenant totalement paramétré.


On active à présent diverses options de sécurité. Je ne comprends pas vraiment la signification de ces options, c'est du copier-coller de différents tutoriaux trouvés sur internet. :-| N'hésitez pas à éclairer ma lanterne !
# Supprimer le NAT dans le kernel
echo 0 > /proc/sys/net/ipv4/ip_forward

# Activer les options anti-spoofing du kernel
for Casablanca in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $Casablanca;
done

# Activer les options anti-ping du kernel
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all;
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts;
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses;

# Interdire le synflood
if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
fi



Pour éviter l'empoisonnement du cache ARP, on renseigne de façon statique les adresses MAC de nos 3 ordinateurs de confiance.
arp -s -i $INT_RES $IP_ORDI_1 $MAC_ORDI_1
arp -s -i $INT_RES $IP_ORDI_2 $MAC_ORDI_2
arp -s -i $INT_RES $IP_ORDI_3 $MAC_ORDI_3

# Nous pouvons voir le contenu de votre cache ARP
# avec la commande "arp -vn"
# En savoir plus sur le protocle ARP ici et



Pour paramétrer les réactions de notre ordinateur face aux paquets ARP, on utilise le logiciel « arptables ».
En savoir plus sur arptables ici et .
# Faisons d'abord le ménage des règles existantes.
arptables -F
arptables -X
# Paramétrage de la chaîne FORWARD
arptables -P FORWARD DROP
# Paramétrage de la chaîne INPUT
# On accepte uniquement les requêtes ARP venant de nos 3 ordinateurs de confiance.
# Ces requêtes questionnent notre ordinateur pour connaître l'adresse MAC de son interface réseau.

arptables -A INPUT -i $INT_RES -s $IP_ORDI_1 --source-mac $MAC_ORDI_1 -d $MON_IP --opcode 1 -j ACCEPT
arptables -A INPUT -i $INT_RES -s $IP_ORDI_2 --source-mac $MAC_ORDI_2 -d $MON_IP --opcode 1 -j ACCEPT
arptables -A INPUT -i $INT_RES -s $IP_ORDI_3 --source-mac $MAC_ORDI_3 -d $MON_IP --opcode 1 -j ACCEPT
arptables -P INPUT DROP
# Paramétrage de la chaîne OUTPUT
# On autorise uniquement les réponses ARP vers nos 3 ordinateurs de confiance.
# Ces réponses informent nos interlocuteurs de l'adresse MAC de notre interface réseau.

arptables -A OUTPUT -o $INT_RES -s $MON_IP --source-mac $MAC_INT_RES -d $IP_ORDI_1 --destination-mac $MAC_ORDI_1 --opcode 2 -j ACCEPT
arptables -A OUTPUT -o $INT_RES -s $MON_IP --source-mac $MAC_INT_RES -d $IP_ORDI_2 --destination-mac $MAC_ORDI_2 --opcode 2 -j ACCEPT
arptables -A OUTPUT -o $INT_RES -s $MON_IP --source-mac $MAC_INT_RES -d $IP_ORDI_3 --destination-mac $MAC_ORDI_3 --opcode 2 -j ACCEPT
arptables -P OUTPUT DROP

Remarque : si possible, configurez le cache ARP des 3 ordinateurs de confiance en renseignant de façon statique l'adresse MAC de notre ordinateur. Cela évitera l'emploi de requêtes ARP.


Maintenant que les paramètres de sécurité sont actifs, on active notre interface réseau.
Première possibilité : vous n'utilisez pas de serveur DHCP :
# Attribuez manuellement l'adresse IP à l'interface réseau.
ifconfig $INT_RES $MON_IP netmask $MASQUE_RESEAU up

# Dans notre cas, c'est ORDI_1 qui est la passerelle vers internet.
route add default gw $IP_ORDI_1


Seconde possibilité : vous utilisez un serveur DHCP :
ifconfig $INT_RES up
dhclient $INT_RES

À ce stade, la connexion au réseau local fonctionne.

Fin du script.

Commentaires, critiques et propositions d'amélioration sont les bienvenus ! :D
La_Binocle
Matelot
Matelot
 
Messages: 5
Inscrit le: 11 Août 2008 12:28

Retour vers Sécurité et réseaux

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité