Sécurité réseau : TcpWrapper

Cet article présente une technique de sécurité propre aux réseaux Unix : le wrapping ou emballage TCP.

Principe

Les systèmes d'exploitation de type Unix intègrent des mécanismes de protection limitant les risques de piratage. Citons l'authentification des utilisateurs, le contrôle des ressources, la tenue de journaux de bord ... Cependant, la forte croissance du traffic Internet nécessite la mise en oeuvre de véritables politiques de régulation. Dans cette optique, TcpWrapper restreint l'accès aux services disponibles en un point du réseau. Quelques précisions relatives au modèle IP et au démon Internet aideront à en comprendre le fonctionnement.

Le modèle IP

Modèle en couches

Les protocoles de communication de classe IP règlent les échanges de données Internet. Ils respectent un modèle dit "en couches". Cette expression désigne le découpage d'un logiciel complexe en couches coordonnées par un jeu d'interfaces. Le modèle OSI (Open System Interconnection) en compte 7 englobant une communication du niveau matériel au niveau des applications.

Couche application
Couche transport
Couche Internet
Couche réseau

Commutation de paquets

La couche Internet ou IP assure la fragmentation des données en paquets et leur routage au fil des réseaux. La couche transport introduit les protocoles TCP (Transmission Control Protocol) et UDP (Universal Datagram Protocol). Messages d'acquittement et sommes de contrôle garantissent la réception correcte et ordonnée des paquets TCP. La communication entre deux machines implique l'allocation d'une paire de ports. Le fichier /etc/services associe numéros de port et services. Le port 21 est dédié au service FTP, le 23 à telnet ...

Démon Internet

Les exemples ont été testés sous Red Hat 6.0 et compte root. Votre Linux Box doit disposer d'un accès Internet opérationnel.

Principe

Des programmes tournant en arrière-plan, les démons, offrent certains services. Par exemple, lpd organise les tâches d'impression. Ces démons monopolisent des ressources système alors même qu'ils demeurent passifs la plupart du temps. Le démon Internet inetd apporte une solution élégante à ce problème. Il s'intercale entre clients et serveurs, invoquant ces derniers quand nécessaire.

Configuration

Le fichier /etc/inetd.conf établit les caractéristiques de chaque service. Une ligne suit le format :

service type protocole attente uid serveur arguments

service		Nom du service tel que déclaré dans /etc/services.
type		Stream pour un service TCP, dgram pour un service UDP.
protocole	Nom du protocole tel que déclaré dans /etc/protocols.
attente		Nowait pour un service TCP, wait pour un service UDP.
uid		UID du démon. Souvent root.
serveur		Chemin et nom du serveur, internal si service interne.
arguments	Nom et arguments éventuels du serveur.

Voici une entrée possible du fichier inetd.conf :

telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd

En clair, in.telnetd honore le service TCP telnet. Root est le propriétaire du processus lors de son exécution.

Activité du démon Internet

Vérifiez l'activité du démon Internet :

ps -A | grep inetd
200 ?        00:00:00 inetd

Linux active Inetd lors de la phase d'initialisation. Si tel n'est pas le cas sur votre système, entrez (Red Hat) :

chkconfig -add inet

Une session telnet illustre le fonctionnement d'inetd. Ouvrez deux fenêtres terminal. Dans la première, établissez la liaison :

telnet localhost

Dans la seconde, réclamez la liste des processus :

ps -A --forest

L'option --forest active l'affichage des liens de parenté entre processus. Nous obtenons :

  PID TTY          TIME CMD
 ...
 388 ?        00:00:00 inetd
 975 ?        00:00:00  \_ in.telnetd
 976 pts/0    00:00:00      \_ login
 977 pts/0    00:00:00          \_ bash

Inetd a détecté la demande de connexion telnet sur le port 23. Consultant la table de correspondance, il détermine que ce service est fourni par le serveur in.telnetd et l'exécute. in.telnetd cède ensuite la place à la procédure de login. Correctement identifié, l'utilisateur se retrouve sous interpréteur de commandes. Ici, Bourne Again Shell. Retournez dans la première fenêtre et quittez la session telnet avec exit. Réclamez à nouveau la liste des processus :

ps -A --forest

 ...
 388 ?        00:00:00 inetd

Le serveur in.telnetd et sa descendance sont tués à la déconnexion.

TCP Wrapper

Principe

Certains serveurs gèrent leur propre sécurité. Ainsi, les Fournisseurs d'Accès Internet réservent leurs prestations à leurs abonnés : courrier, forums de discussion ... Ils analysent le traffic à la recherche d'anomalies.

Un wrapper TCP, littéralement emballeur TCP, est un outil générique qui facilite ces tâches. Il s'intercale entre le démon Internet et les serveurs, relayant ou non les requêtes sur la base de règles spécifiées par l'administrateur du réseau. Voici une variante du fichier inetd.conf exploitant TCP Wrapper :

telnet	stream	tcp	nowait	root	/usr/sbin/tcpd	in.telnetd

Désormais, tcpd intercepte les appels telnet, décidant du lancement du serveur in.telnetd. La distribution Red Hat lie dès l'origine les actions d'inetd et de tcpd. Ouvrez une nouvelle session telnet puis affichez la fin du fichier d'audit /var/log/secure (défaut) :

tail /var/log/secure
...
Dec 19 17:49:13 robby in.telnetd[787]: connect from 127.0.0.1

La ligne précédente confirme l'action de tcpd.

Règles de filtrage

Le format des fichiers de configuration a évolué. Nous nous référons à la version 7.6 du paquetage tcp_wrappers.

Les fichiers /etc/hosts.allow et /etc/hosts.deny regroupent les règles appliquées aux requêtes. Les versions récentes de TCP Wrapper autorisent la déclaration de règles d'accès et de rejet dans les deux fichiers. Elles respectent la syntaxe :

serveurs : clients : option : option ...

serveurs liste des serveurs surveillés
clients  liste des clients surveillés
option   action à appliquer

Espace et virgule font office de séparateurs.

Motifs

Les motifs suivants décrivent un ensemble de machines ou d'utilisateurs. La page man 5 hosts_access en fournit la liste complète :

.n            Machine de nom *.n
a.            Machine d'adresse a.*
r/m           Machine du réseau r de masque m
ALL           Machine ou utilisateur quelconque
LOCAL         Machine locale (pas de notation pointée)
KNOWN         Utilisateur de nom connu
              Machine de nom et d'adresse connus
UNKNOWN       Utilisateur de nom inconnu
              Machine de nom ou d'adresse inconnus
PARANOID      Machine dont nom et adresse ne correspondent pas

L'opérateur @ combine utilisateurs et machines sous la forme u@m.

Options

Les options suivantes déclenchent des actions. La page man hosts_options répertorie la liste complète.

ALLOW         Autoriser la connexion
DENY          Refuser la connexion
SPAWN         Exécuter une commande shell

Variables d'environnement

Vous disposez des variables d'environnement suivantes

%a     Adresse IP du client
%A     Adresse IP du serveur
%c     Informations disponibles sur l'utilisateur : u@m
%d     Nom sous lequel le serveur a été invoqué
%h     Nom ou à défaut adresse du client
%H     Non ou à défaut adresse du serveur
%n     Nom du client ou unknown, paranoid
%N     Nom du serveur
%p     Numéro de processus du démon
%s     Informations disponibles sur le serveur : s@m
%u     Nom de l'utilisateur ou unknown
%%     Caractère %

Audit

Le fichier /var/log/secure (défaut) (/var/log/auth.log sur certaines distributions) enregistre les appels tcpd, qu'ils aboutissent ou non. Conformément à l'usage, heure, date, service et adresse IP du client sont indiqués.

Exemple - Serveur FTP

Organisation

Illustrons notre propos. Les fichiers hosts.allow et hosts.deny sont initialement vides. Tous les services sont alors disponibles, quel que soit le client. Supposons que nous souhaitons sécuriser le serveur FTP krell d'adresse IP 192.168.0.3 appartenant au réseau privé altair.net. Il proposera cet unique service et un accès telnet à la machine monster d'adresse IP 192.168.0.128.

Serveur

Le serveur employé est WU-FTPD (Washington University FTP Server), fourni avec la distribution Red Hat. Voici l'entrée correspondante de /etc/inetd.conf :

ftp	stream	tcp	nowait	root	/usr/sbin/tcpd	in.ftpd -l -a

hosts.allow

Nous centralisons les règles dans /etc/hosts.allow :

in.ftpd : 192.168.0. : ALLOW
in.telnetd : 192.168.0.128 : ALLOW
ALL : ALL : DENY

La dernière règle bloque l'accès à tous les services. Les deux premières autorisent des accès FTP et telnet limités. tcpd procède en séquence jusqu'à trouver la première règle applicable, puis interrompt son action.

Tests

Vérifions la syntaxe des règles :

tcpdchk -v

Finalement, forçons la relecture de la configuration :

killall -HUP inetd

Tout est prêt. Le comportement de tcpd peut être testé directement depuis les machines concernées. En complément, TCP Wrapper propose tcpdmatch, un utilitaire très complet. Le moyen de simuler l'action de TCP Wrapper sur une station isolée :

Session telnet depuis monster

tcpdmatch in.telnetd 192.168.0.128

client:  adress 192.168.0.128
server:  process in.telnetd
matched: /etc/hosts.allow line 7
option:  ALLOW
access:  granted

Session telnet non autorisée

tcpdmatch in.telnetd 192.168.0.1

client:  adress 192.168.0.1
server:  process in.telnetd
matched: /etc/hosts.allow line 9
option:  DENY
access:  denied

Session FTP

tcpdmatch in.ftpd 192.168.0.2

client:  adress 192.168.0.2
server:  process in.ftpd
matched: /etc/hosts.allow line 8
option:  ALLOW
access:  granted

Plus loin avec TCP Wrapper

Les limites de TCP Wrapper

TCP Wrapper améliore certes la sécurité des réseaux mais il faut être conscient de ses limites. Tout d'abord, un serveur mal configuré risque toujours d'ouvrir l'accès de votre réseau à un utilisateur mal intentionné. Mais surtout, TCP Wrapper ne saurait résoudre tous les problèmes liés à l'absence d'authentification satisfaisante dans IP version 4.

Détournement d'adresse IP

Schématiquement, cette attaque consiste à adresser des paquets possédant une adresse IP d'émission fictive à une machine cible. On la choisit dans le domaine du réseau visé. Morris a décrit le premier cette faille dans le protocole de négociation d'une liaison TCP.

Détournement de nom

Cette deuxième attaque suppose la corruption d'un serveur de noms de domaine. Ces serveurs fonctionnent de concert. Ils prennent en charge les conversions nom de machine <--> adresse IP. Malheureusement, certains services basent leur "authentification" sur le nom des machines clientes. TCP Wrapper contre ces attaques en procédant à des résolutions adresse -> nom et nom -> adresse puis en confrontant les résultats obtenus. En cas de différence, paranoid est retourné.

Serveur d'identité

Le serveur d'identité Ident retourne des informations sur l'utilisateur d'une connexion TCP/IP. Par ce moyen, et dans l'hypothèse où le service est installé sur la machine distante, on peut détecter une tentative de détournement d'adresse IP. Il est en effet plus difficile de forcer deux services simultanément. known est retourné si l'utilisateur est identifié, unknown sinon.

Commandes

L'administrateur système peut souhaiter déclencher des commandes particulières lors des connexions. L'option spawn lance une procédure shell exploitant les variables d'environnement précédemment citées. Dans notre exemple, nous informons le super utilisateur des tentatives de connexion interdites :

ALL : ALL : SPAWN echo "Service %d IP %a Utilisateur %c" | /bin/mail root -s "Alerte tcpd" : DENY

A chaque tentative infructueuse, un courrier d'alerte sera adressé au super utilisateur.

Conclusion

TCP Wrapper constitue un élément de sécurité intéressant. Mais il doit être considéré dans le cadre d'une politique globale combinant mesures de niveau hôte et réseau. Le site référencé en annexe compile des liens sur des sujets connexes : coupe feu, manuel de sécurité orange... Bonne lecture.

En ligne

Liens sécurité www.alw.nih.gov/Security/first-papers.html

Remarques, questions, Cyril Nocton cyril.nocton@bigfoot.com
Relecture, Danièle Momont danimom@club-internet.fr

Linux Magazine France n°14 - Février 2000