Le principe est simple : au lieu de lancer directement le démon souhaité (par exemple in.telnetd), il est activé un programme (tcpd) qui se charge de lancer le serveur voulu si le client est autorisé à se connecter.
Le fichier /etc/inetd.conf doit contenir l'entrée tcpd de la façon suivante :
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/wu.ftpd
telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd
Ainsi, inetd lancera tcpd à la place du vrai serveur.
tcpd se base sur deux fichiers /etc/hosts.allow et /etc/hosts.deny qui autorise ou interdit l'accès à certains démons. Les entrées dans ces fichiers ont la forme suivante :
| liste_démons : hôtes_clients [:commande[:commande:...]] | ||||||||||
Signification des mots clés :
ALL : tous les démons ou tout client (adresse IP ou nom).
LOCAL : représente le domaine local.
UNKNOWN : toute adresse ou nom inconnu.
KNOWN : toute machine connue.
UNKNOWN et KNOWN sont à manier avec des pincettes, dans le cas d'une défaillance du serveur de noms...
| %d | Nom du service utilisé. |
| %h | Nom ou adresse de la machine. |
| %c | Informations sur le client : user@host, user@adresse, nom de la machine, adresse IP, selon ce qui est disponible. |
| %p | Identifiant du process démon. |
| %u | Utilisateur ou unknown |
| %% | Le caractère % |
Ainsi si nous voulons filtrer les finger, on marquera l'entrée dans le /etc/hosts.deny :
| in.fingerd : ALL EXCEPT LOCAL : twist echo "Finger de %u@%h" >> /var/adm/finger.log; | |
| ou | |
| in.fingerd : ALL EXCEPT LOCAL : spawn(/usr/sbin/safe_finger -l %u@%h | /bin/mail/root)& |
twist et spawn sont des options du TCP/WRAPPER.
La première remplace le processus courant par une instance d'une commande shell, l'entrée, la sortie standard et la sortie erreur standard sont liées au processus du client. Cette commande doit être placée en bout de liste des commandes.
La deuxième crée un processus fils, et exécute une commande dans celui-ci. Les sorties et l'entrée sont redirigée vers /dev/null, cela annule tout envoi de message vers le client.
Il existe bien d'autres commandes :
par exemple :
| ALL : .artemis.jussieu.fr : DENY | pour tous les services, autorisé seulement le domaine .artemis.jussieu.fr et refusé tous les autres. | ||||||||||
Les configurations des fichiers /etc/hosts.deny et /etc/hosts.allow se vérifie avec l'utilitaire :
| tcpdchk [-a][-d][-i inet_conf][-v]. | |||||||||||
Il est ainsi possible de simuler un accès sur un démon par une machine et de voir les effets de la configuration. La commande tcpdmatch [-d][-i inetd_conf] démon[@serveur][user@]client affiche le résultat de la tentative en respectant les restrictions des fichiers /etc/hosts.deny et /etc/hosts.allow.
Exemple :
/etc/hosts.deny :
| in.tftpd : ALL | |||||
| in.telnetd : ALL EXCEPT 134.157.55., LOCAL : twist = echo "Telnet de %u@%h - %c le `date` " >> /var/adm/telnet.log | |||||
| in.fingerd : ALL : twist = echo "Finger de %u@%h - %c le `date` " >> /var/adm/finger.log | |||||
| in.rlogind : ALL EXCEPT .artemis.jussieu.fr | |||||
/etc/hosts.allow :
| in.telnetd : .astech.fr, 194.206.124.2, 194.208.175. EXCEPT diable.astech.fr | |||||
| in.fingerd : LOCAL | |||||
TCP/WRAPPER est une bonne alternative si l'on ne posséde pas de firewall tel que TIS (appartenant au domaine public, voir Linux JOURNAL numéro 25) qui s'installe sur une passerelle. La mise en place de tcpd est simple et suffit pour décourager les petits intrus, pour les "professionnels", cela reste une autre histoire.
L'inconvénient de TCP/WRAPPER est qu'il ne gére pas les accès RPC, et qu'il faut l'installer sur toute machine serveur appartenant à un réseau.
Bibliographie :
Wietse Venema : TCP WRAPPER - Network monitoring, access control, and boody traps
Pour toute information erronée ou demande de compléments, n'hésite pas à me contacter à l'adresse suivante :