A la découverte d'UNIX (FreeBSD)

A la découverte d'UNIX (FreeBSD)

Mis à jour le mardi 8 janvier 2013

Un serveur est là pour ... servir des clients. C'est vrai dans un café, et aussi entre ordinateurs. Cela implique que les ordinateurs communiquent entre eux. On peut les relier les uns aux autres par des fibres optiques, des cables ethernet, les ondes de la Wi-Fi, etc.

A - Adresses, ports et sockets

Les interfaces réseau sont les portes de votre ordinateur : elles lui permettent de communiquer avec le reste du monde.

Image utilisateur

Votre machine a donc plusieurs portes mais, ce que vous ne savez peut-être pas, c'est que chacune a une adresse différente. En plus de votre adresse publique, accessible en vous connectant au site whatsmyip, vous avez donc aussi plusieurs adresses locales. Dans ce chapitre, nous ne parlerons que de ces dernières.

Tapez ifconfig dans un terminal pour en savoir plus sur vos interfaces réseau.

Image utilisateur

Même sur un système simple, il y a toujours au moins deux interfaces réseau. Sur la capture d'écran ci-dessus, vous voyez rl0 et lo0.

Pourquoi ces deux là ? J'en compte cinq, moi.

fwe0, fwip0 et plip0 ne sont pas de vraies interfaces. Vous voyez que dans leur liste de drapeaux (flags), il n'y a pas le drapeau UP. Et elles n'ont pas non plus d'adresse locale (inet).

lo0 (adresse locale 127.0.0.1) correspond à ce qu'on appelle la boucle locale : c'est une connexion entre l'ordinateur et... lui-même. Eh oui ! Je ne sais pas quel âge a votre machine, mais sachez qu'il lui arrive fréquemment de parler toute seule. :D Cela vous a déjà servi pour communiquer avec CUPS.

L'autre interface (adresse locale 192.168.1.38 dans mon cas) n'a pas forcément le même nom chez vous. Tout dépend du modèle de votre carte réseau. Chez moi, c'est rl0. Chez vous, c'est peut-être em0, re0 ou autre chose. Dans la suite du chapitre, chaque fois que j'écrirai rl0, rectifiez par le nom de votre interface à vous.

Image utilisateur

Vous voyez sur ce schéma qu'il n'y a pas vraiment de barrière entre internet et les précieuses données que renferme votre ordinateur. La moindre des choses, c'est d'installer un pare-feu, qui filtrera les données. Et sous FreeBSD, il y a une deuxième ligne de défense : la prison.

Vous allez installer un serveur web sur votre ordinateur, afin de créer votre propre site. Bientôt, les visiteurs afflueront dessus par milliers (mais si, soyez un peu optimistes ;) ). Comment être certain que toutes ces requêtes sur votre serveur n'endommageront :waw: pas le reste de votre machine ? Ou encore qu'un pirate :pirate: qui parviendrait à s'introduire dans le serveur ne puisse pas aller plus loin ?

Réponse : en établissant une cloison étanche entre le serveur et le reste. C'est à dire, en mettant le serveur dans une prison, qui aura sa propre interface réseau, différente de celles de votre système principal.

Image utilisateur

Le problème, c'est qu'il faut maintenant trier les données en provenance d'internet. Il y en a qui ne doivent pas passer, d'autres qui doivent être acheminées vers votre serveur HTTP (donc vers lo1) et d'autres encore sont destinées à votre système principal via rl0. Comment faire pour s'y retrouver ?

Pensez aux vrais courriers papiers. Chacun comporte l'adresse de son destinataire, un contenu et l'adresse de l'expéditeur. De même, chaque paquet comporte, en plus de son contenu, un ensemble de quatre numéros, qu'on appelle un socket. Parmi ces quatre numéros, il y a l'adresse IP de l'ordinateur d'origine, celle de l'ordinateur destinataire,...

Si seulement la vie pouvait être aussi simple ! Mais l'adresse de destination indiquée dans le paquet est en réalité votre adresse publique ! Ce n'est donc ni l'adresse locale de rl0 ni celle de lo1. Impossible de s'en servir pour faire le tri. :( Heureusement, :) le socket comporte deux autres informations : des numéros de ports.

C'est bon ? Pas trop embrouillés ? o_O Je vous explique.

Les ports sont numérotés. Par exemple, les ports 20 et 21 concernent les communications FTP, dont nous avons déjà parlé. Vous connaissez aussi 631, le port de CUPS. 22 est consacré aux connexions sécurisées de type SSH. Les serveurs DHCP, qui attribuent automatiquement les adresses aux autres machines, se servent des ports 67 et 68.

Votre futur serveur HTTP, quant à lui, utilisera les ports 80 et 443.

Donc, lorsqu'un internaute cherchera à contacter votre futur serveur web, il lui enverra des paquets dont les sockets comprendront :

  • Votre adresse IP publique.

  • Son adresse IP publique.

  • Le numéro de port de votre serveur web.

  • Le numéro de port du programme expéditeur.

La solution, par conséquent, c'est de demander à votre pare-feu de détourner vers lo1 tous les paquets destinés aux ports 80 et 443.

Image utilisateur

Bon, là, j'ai un peu simplifié. Il est évident que votre prison pourra recevoir d'autres communications que celles des ports 80 et 443, notamment quand c'est elle qui cherchera à joindre un serveur extérieur.

B - Wi-Fi

Avec la Wi-Fi, les ordinateurs peuvent aussi communiquer par la seule magie des ondes électromagnétiques. :magicien:

Si votre machine dispose d'une connection Wi-Fi, elle peut être activée à l'aide de trois fichiers de configuration : /boot/loader.conf, /etc/rc.conf et /etc/wpa_supplicant.conf. On ne présente plus les deux premiers. Quant au troisième, c'est vous qui allez l'écrire.

Voyons d'abord si FreeBSD a détecté votre carte Wi-Fi. Le programme ifconfig ne demande qu'à vous renseigner. Parmi les interfaces réseau, il vous affichera quelque chose comme :

ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
        ether f0:7b:cb:57:1b:d5
        media: IEEE 802.11 Wireless Ethernet autoselect mode 11b
        status: associated

Le votre ne commence peut-être pas par ath0 mais la présence du mot Wireless vous indique qu'il s'agit bien de l'interface Wi-Fi. FreeBSD dispose donc du pilote nécessaire pour la faire fonctionner. En principe, il dispose de tous les pilotes pour toutes les cartes Wi-Fi courantes. Mais si la votre est plus atypique, il est possible qu'il ne la détecte pas.

Mais attention : ce n'est pas parce que votre interface est détectée qu'elle est prise en charge pour autant. Il faut pour cela charger dans le noyau le module adéquat. Ajoutez donc au fichier /boot/loader.conf, la ligne :

if_ath_load="YES"

De plus en plus souvent, les communications Wi-Fi sont cryptées. Vous aurez donc besoin, toujours dans /boot/loader.conf, de l'instruction :

wlan_wep_load="YES"

Sur un réseau local peu sécurisé, qui utilise un chiffrage de type WEP, c'est suffisant. Mais rien n'est plus facile, pour tout pirate :pirate: un peu sérieux, que de craquer un WEP. Des systèmes plus sophistiqués ont donc été mis au point, comme le chiffrage WPA et ses variantes. Par conséquent, vous devez ajouter :

wlan_ccmp_load="YES"                                                                                                                                                                            
wlan_tkip_load="YES"

Je vais continuer en prenant l'exemple du cryptage WPA : c'est maintenant le plus répandu (et c'est celui-là que j'ai). Vous allez vous identifier à l'aide du fichier /etc/wpa_supplicant.conf. Créez-le avec l'éditeur de votre choix et écrivez :

network={
  ssid="NEUF_2200"
  psk="motdepasseduréseau"
}

En remplaçant évidemment NEUF_2200 par le nom de votre réseau Wi-Fi local. Le mot de passe psk est inscrit sur votre "box" ou dans sa documentation.

Passons enfin au fameux rc.conf, où vous ajouterez ces lignes :

wlans_ath0="wlan0"
ifconfig_wlan0="WPA DHCP mode 11n"

Là, quelques explications s'imposent. WLAN est le Wireless Local Area Network (Réseau local sans fil). Vous vous connectez à lui via l'interface ath0. La première ligne ci-dessus va créer une interface fictive wlan0, associée à ath0. La deuxième ligne configure wlan0 en confiant à DHCP l'attribution d'une adresse IP et en précisant que le cryptage local est de type WPA.

Et le mode 11n ?

Le protocole Wi-Fi s'appelle aussi 802.11 et il comporte plusieurs variantes, avec des fréquences et des performances diverses. Par défaut, ath0 est en mode 11b, comme le montre le ifconfig un peu plus haut. Mais le mode 11n permet un meilleur débit.

La prochaine fois que vous allumerez votre ordinateur portable, ouvrez un navigateur web et surfez tant qu'il vous plaira... sans fil ! :)

C - Le pare-feu

Packet Filter (pf pour les intimes) n'est pas n'importe quel pare-feu. C'est la grande fierté d'OpenBSD, son OS d'origine, et certainement l'un des meilleurs qui soient. Avec Packet Filter d'un côté et ses prisons de l'autre, FreeBSD est donc ultra-sécurisé ! A condition, bien sûr, de le configurer correctement. ;)

Image utilisateur

Pour en profiter, il faut bien sûr l'activer en ajoutant à notre cher /etc/rc.conf :

pf_enable="YES"
pf_rules="/etc/pf.conf"

Et il faut aussi le configurer :

[Nom de l'ordinateur]# emacs /etc/pf.conf

Vous allez définir dans ce fichier les règles qui indiquent quels paquets refuser, accepter ou rediriger. Vous commencerez par tout bloquer avec :

block in  all
block out all

Puis vous ajouterez des règles pour autoriser au cas par cas les services dont vous avez besoin. La documentation d'OpenBSD explique très bien comment.

En attendant, ce n'est pas l'aspect sécurité qui nous intéresse. C'est plutôt l'acheminement du traffic internet vers les interfaces rl0 et lo1. Trois instructions suffisent pour ça. Commentez donc provisoirement les deux lignes block all.

nat on rl0 from lo1:network to any -> (rl0)
rdr pass on rl0 inet proto tcp to port http -> 10.1.1.1 port http
rdr pass on rl0 inet proto tcp to port https -> 10.1.1.1 port https

Je rappelle qu'il vous faut personnaliser ces lignes si votre interface réseau principale n'est pas rl0. Veillez bien à ce que pf.conf ne contienne, pour l'instant, aucune autre instruction (à part les commentaires qui, vous le savez, sont ignorés). S'il y en a, commentez-les.

nat (Network Address Translation) est le système de traduction d'adresse réseau. Il permet à la prison de solliciter des communications avec l'extérieur.

rdr, lui, redirige le traffic destiné aux ports 80 (http) et 443 (https) de l'adresse inet de rl0 vers ceux de 10.1.1.1 (l'adresse inet de lo1). Cette redirection fait intervenir le protocole TCP/IP, celui qui permet les échanges de données sur internet, et qui a d'ailleurs été développé sous BSD.

Il va maintenant falloir créer la prison. Et ce n'est pas une mince affaire. La première étape consiste en effet à recompiler FreeBSD.

Découvrez aussi ce cours en...

Exemple de certificat de réussite
Exemple de certificat de réussite