HomeMapIndexSearchNewsArchivesLinksAbout LF
[Top Bar]
[Bottom Bar]
[Photo of the Author] 
Javi Polo  
A propos de l'auteur: J'ai 18 ans et je subit les études au lycée. L'informatique est ma passion, et j'espère être admis à UIB pour démarrer des études en Ingénierie des Télécommunications et en Informatique. J'aime la musique hardcore, et je participe à un groupe appelé Niko-Chan's Kingdom. Pas grand chose d'autre à dire, sauf que j'ai une super copine appelée Xiska 0:) 

Contacter l'auteur 
 

TCPD et pare-feu (firewall) avec IPFWADM 

[Ilustration] 

Résumé: Cet article décrit très brièvement comment configurer les services inetd pour améliorer la sécurité de votre système. Nous nous focaliserons sur l'outil IPFWADM pour administrer et configurer les services inetd. 


Pour commencer, il nous faut une idée précise des fonctionalités d'inetd. A la base, inetd est un démon qui contrôle les services fournis par le système aux hôtes connectés à travers le réseau. Il est possible qu'inetd ne soit pas configuré par défaut sur un système pour contrôler les services, la première chose à faire est donc d'éditer le fichier /etc/inetd.conf et vérifier quels sont les services réellement contrôlés par inetd (toutes les lignes qui ne commencent pas par #). Le premier conseil à suivre est de ne pas activer plus de services que nécessaire, ce qui permet d'éviter les attaques à travers des démons qui ne sont de toute façon pas utilisés. Je suppose que le lecteur a une copie de son fichier inetd.conf sous la main, je peux donc expliquer plus précisément ce qu'il définit. 
Prenons pour exemple la ligne: 

ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
Le premier mot correspond au service offert (dans ce cas "ftp", et l'on peut ensuite vérifier dans le fichier /etc/services à quel port ce service est attaché). 

Le second champ correspond au type de socket (point de communication) ouverte. Les types possibles sont: stream (comme dans l'exemple), dgram, raw, rdm et seqpacket

Le champ suivant est le protocole à utiliser. Ce protocole doit être déclaré dans le fichier /etc/protocols. Le protocole TCP doit exister dans ce fichier. 

Après le protocole, on trouve le champ wait/nowait. Il devrait toujours indiquer nowait, sauf pour les sockets de type datagramme (dgram); dans ce cas, on indiquera nowait si le serveur supporte les unités d'exécution (threads) multiples, ou wait si le serveur est à unité d'exécution simple. La raison est qu'un système à multiple unités d'exécution, lance une nouvelle unité d'exécution à chaque requête de connexion, puis libère la socket. Il est donc prêt à traiter d'autres requêtes, d'où l'utilisation de nowait. Le système à unité d'exécution unique ne peut faire la même chose, il faut donc indiquer wait. Il existe une variation supplémentaire, on aurait pu écrire nowait.50 -- indiquant le nombre maximum (50) de démons pouvant être lancés en une minute (ou de demandes acceptées, selon le point de vue). La valeur par défaut est 40. 

Le cinquième champ indique le nom de l'utilisateur sous lequel le démon tourne, dans notre exemple ftp tourne sous l'identification d'utilisateur (userid) root

Les champs suivants sont le programme lancé (sixième champ) et les paramètres qui lui sont passés. Dans l'exemple, le démon tcpd est lancé avec l'argument in.ftpd et les paramètres -l -a. Ici apparaît la partie la plus intéressante de ce paragraphe, le démon tcpd

tcpd est un démon qui filtre les requêtes de connexion, et réalise l'action correspondant à l'argument fourni et à l'adresse IP de la requête. Les fichiers /etc/hosts.allow et /etc/hosts.deny permettent d'autoriser ou refuser un service. 

En principe, le fichier /etc/hosts.deny indique les hôtes pour lesquels un démon est refusé, et /etc/hosts.allow donne les hôtes ayant accès à un démon. 

Le format de ces fichiers est: 

DAEMON: IP[: OPTION1 [: OPTION2 ]]
où DAEMON peut être le démon à lancer, comme in.ftpd dans l'exemple, ou la constante prédéfinie ALL qui fait référence à tous les démons. 

IP peut être une adresse IP spécifique, une URL, une plage d'adresses IP (ou d'URL), et peut comprendre l'un des jokers que je vais présenter. 

Pour indiquer une plage d'adresses IP on peut utiliser la notation: `123.32.' qui représente toutes les adresses IP de la forme 123.32.XXX.XXX. De même une plage d'URL peut être écrite sous la forme `.ml.org' qui représente tous les sous domaines de ml.org 

Une façon plus traditionnelle de spécifier une plage d'adresses IP est la forme IP/MASK. De cette manière, la plage 127.0.0.0 à 127.0.255.255 s'écrit 127.0.0.0/255.255.0.0. 

Les jokers sont: 
ALL n'importe quelle valeur autorisée pour le champ
LOCAL n'importe quel nom sans ?.? (hôte local)
UNKNOWN tout hôte dont le nom ou l'adresse IP est inconnue
KNOWN toute machine dont à la fois le nom et l'adresse IP sont connus
PARANOID les machines dont le nom ne correspond pas à leur adresse IP
Les options possibles sont: 
allow signifie que la connexion doit être acceptée quels que soient les contenus de hosts.allow et hosts.deny. Cette option doit être la dernière sur la ligne.
deny identique à la précédente mais la connexion est refusée
spawn lance une commande lorsqu'une demande de connexion est reçue, par exemple j'aime déclencher un son lorsque quelqu'un tente de se connecter sur ma machine
twist identique à la précédente mais la connexion est coupée lorsque la commande se termine. Cette option doit être la dernière sur la ligne.
Les deux dernières options permettent l'utilisation de caractères d'expansion propres à  tcpd: 
 
%a adresse de la machine cliente
%c information sur le client (par exemple,  utilisateur@machine, ou autre chose selon le client)
%d
%h nom ou adresse IP du client s'il est disponible
%n nom du client 
%p PID du démon
%s information sur le serveur (daemon@machine ou seulement daemon)
%u nom de l'utilisateur client
%% le caractère %
Avec ces options et les caractères d'expansion, on peut déjà réaliser beaucoup d'actions. Par exemple, je connais quelqu'un qui envoie automatiquement une "larme" quand quelqu'un essaie d'entrer sur son système par telnet :) 

NOTE: une larme est un  DoS (Denial of Service -Refus de Service , une attaque pour provoquer un redémarrage ou une réinitialisation du système). Cette attaque est basée sur une bogue dans la défragmentation des paquets TCP que la plupart des systèmes d'exploitation présentent (ou plutôt présentaient, car les noyaux ont été corrigés depuis). Les données envoyées sur Internet utilisent la suite de protocoles TCP/IP, aussi utilisée sur d'autres réseaux comme les intranets. TCP s'occupe de découper les données en paquets, qui sont passés à IP qui les envoie à la machine de destination; lorsque les paquets arrivent à destination, TCP vérifie puis ré-assemble les paquets, afin de reconstituer les données. L'attaque mentionnée (et de nombreuses autres basées sur le même principe) exploite le fait que de nombreux systèmes d'exploitation ne vérifient pas la taille des paquets. Si les paquets sont trop petits, la reconstitution des données pose problème. Il est clair que je ne suis pas très sûr de l'explication, les critiques et conseils sont bienvenus. Bien, après cette petite digression, reprenons le cours de l'article... 

Exemples: 

#hosts.allow 

ALL: 127.0.0.1 # Autorise l'acces de la machine locale a tous les services

in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & )
# Autorise l'acces FTP a n'importe qui, mais lance
# un signal sonore (pour que je sois averti)

in.telnetd:  ALL: twist ( teardrop %h %h )
# envoie une "larme" à n'importe qui
# essaye d'entrer via telnet

#fin
#hosts.deny

ALL: `.bsa.org'   # interdit l'entrée depuis le domaine bsa.org

in.fingerd: ALL   # service finger interdit :)

#fin
Voila ce que j'ai à dire sur tcpd. J'ai déjà mentionné que je n'étais pas un expert. Je recommande d'expérimenter plusieurs configuration, et de lire les pages du manuel (tcpd, host_access(5)), je suis persuadé que le lecteur en apprendra beaucoup plus ainsi que je ne pourrais enseigner. 

Passons maintenant à l'outil IPFWADM. 

Un prérequis est que le noyau supporte IP Firewalling ( Networking -> Network firewalls + IP: firewalling ). Si nécessaire recompilez le noyau et relancez votre machine, vous serez ensuite prêts à utiliser cet outil. 

IPFWADM permet entre autre de gérer l'entrée et la sortie des packets TCP, UDP et ICMP (je ne discuterai ici que cette application). En bref, l'administrateur peut définir quels sont les paquets admis à entrer, en spécifiant des adresses ou des plages d'adresses IP, en spécifiant les ports autorisés, avec quel protocole, et toutes les combinaisons possibles... Le même degré de contrôle est fourni pour les paquets sortants. 

ipfwadm a plusieurs paramètres principaux: 

  • -A précise les règles de comptabilité,
  • -I définit les règles pour les paquets entrants,
  • -O définit les règles pour les paquets sortants,
  • -F précise les règles de transmissions (forwarding) des paquets, 
  • -M sert à l'administration du masquage IP (IP masquerading). 
Nous discuterons dans cet article uniquement les paramètres -I et -O. Ils suivent une syntaxe identique. 
Les options pour ces paramètres sont: 
  • -a ajoute une ou plusieurs règles à la fin de la liste,
  • -i ajoute une ou plusieurs règles au début de la liste, 
  • -d supprime une ou plusieurs règles de la liste,
  • -l affiche les règles de la liste,
  • -f supprime toutes les règles de la liste,
  • -p pour indiquer si les paquets doivent être acceptés (a), refusés (d) ou rejetés (r), 
  • -c vérifie les règles suivies par un paquet,
  • -h aide.
Les paramètres importants sont: 
-P spécifie le protocole sur lequel l'ensemble de règles s'applique, parmi TCP, UDP, ICMP ou ALL (n'importe quel protocole),
-S spécifie l'adresse d'origine du paquets. Le format est: ADDRESS[/MASK][PORT]   Par exemple, une adresse valide serait 123.32.34.0/255.255.255.250 qui signifie la plage d'adresses IP de 123.32.34.0 to 123.32.34.5,
-D précise l'adresse de destination, selon le format précédent.
Ce sont les paramètres fondamentaux, donc pour autoriser toutes les trames de mon système à atteindre mon propre système, j'ajoute la règle suivante: 
ipfwadm -I -i a -S 127.0.0.1 

et pour refuser les paquets qui proviennent de 123.34.22.XXX : 
ipfwadm -I -a d -S 123.34.22.0/255.255.255.0 

ensuite pour interdire tout accès au port NETBIOS sauf pour l'adresse IP 111.222.123.221: 
ipfwadm -I -a a -P tcp -S 111.222.123.221 139 
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139 

Ceci terminera mon article, un peu pauvre peut-être mais ma connaissance est elle aussi limitée O:) 

Traduit par Jean-Denis Girard.

This website is maintained by Miguel Angel Sepulveda 
© Javi Polo 1998 
LinuxFocus 1998