TCP Wrappers




1 Pour quoi faire

Le mécanisme de TCP_wrappers permet de contrôler et de restreindre l'accès à certain service réseau. En fait il utilise le daemon tcpd qui intercepte les demandes de connexion à un service et vérifie dans les fichiers hosts.allow et hosts.deny si le client est autorisé à utiliser ce service. Sur les versions de linux actuelles, il est installé par défaut. par contre il n'est pas actif dans sa partie contrôle d'accès.
TCP Wrappers est un élément à mettre en oeuvre pour sécuriser une machine sous linux, il ne peut toutefois pas remplacer complètement un vrai FireWall.   

2 Le principe.

Lorsque vous souhaitez vous connecter sur une machine distante en telnet, par exemple, le daemon inetd intercepte votre demande de connexion et vérifie dans le fichier inetd.conf si le service telnet est utilisable. si la réponse est positive, votre demande est passée à tcpd qui vérifie dans les fichiers hosts.allow et hosts.deny si vous avez le droit de vous connecter en telnet, si cela est le cas votre demande de connexion sera autorisée, sinon vous serez rejeté. Dans tous les cas de figure et cela est l'autre fonction de TCP_wrappers tcpd transmettra à syslogd (deamon de log) votre demande (cette demande se retrouvera loguer dans le fichier /var/log/securite).

3 L'installation

Par défaut il est installé avec la plupart des distributions, mais au cas,  le paquet à installer est :.   tcp_wrappers-x.....rpm.
TCP_wrappers utilise les fichiers suivants : tcpd, inetd, inetd.conf, hosts.allow, hosts.deny, tcpdchk, tcpdmatch. 

4 Le fichier inetd.conf

        Ce fichier se trouve dans le répertoire /etc. Vous pouvez activer ou désactiver ici des services, en plaçant un # devant la ligne ou en  l'enlevant, puis en obligeant la relecture du fichier avec un killall -HUP inetd. Il est possible d'ajouter d'autres services dans ce fichier. Enfin certains l'utilisent sans être dedans par exemple SSH s'il a été compilé avec les bonnes options.

En voici un commenté. On le trouve dans /etc
# Version: @(#)/etc/inetd.conf 3.10 05/27/93
# Les premières lignes sont utilisées par  inetd 
#
#echo     stream     tcp     nowait     root     internal
#echo     dgram     udp     wait     root     internal
#discard     stream     tcp     nowait     root     internal
#discard     dgram     udp     wait     root     internal
#daytime     stream     tcp     nowait     root     internal
#daytime     dgram     udp     wait     root     internal
#chargen     stream     tcp     nowait     root     internal
#chargen     dgram     udp     wait     root     internal
#time     stream     tcp     nowait     root     internal
#time     dgram     udp     wait     root     internal
#
# ftp et telnet sont deux services très utilisés. Ils ne sont pas spécialement sécurisés.
# telnet peut être remplacé  par ssh qui est beaucoup plus sécurisé.
# ftp est une faille de sécurité importante remplacez le par sftp.
#
ftp     stream     tcp     nowait     root     /usr/sbin/tcpd     in.ftpd
telnet     stream     tcp     nowait     root     /usr/sbin/tcpd     in.telnetd
#
# Shell, login, exec, comsat et talk sont des protocoles BSD. Essayez de ne pas les utiliser. Ils présentent des failles au niveau de la sécurité.
#
shell     stream     tcp     nowait     root     /usr/sbin/tcpd     in.rshd
login     stream     tcp     nowait     root     /usr/sbin/tcpd     in.rlogind
#exec     stream     tcp     nowait     root     /usr/sbin/tcpd     in.rexecd
#comsat     dgram     udp     wait     root     /usr/sbin/tcpd     in.comsat
talk     dgram     udp     wait     nobody.tty     /usr/sbin/tcpd     in.talkd
ntalk     dgram     udp     wait     nobody.tty     /usr/sbin/tcpd     in.ntalkd
#dtalk     stream     tcp     wait     nobody.tty     /usr/sbin/tcpd     in.dtalkd
#
# Pop3 et imap sont les serveurs de messagerie. A n'activer que si vous les utilisez. Oubliez pop2
#
#pop-2     stream     tcp     nowait     root     /usr/sbin/tcpd     ipop2d
#pop-3     stream     tcp     nowait     root     /usr/sbin/tcpd     ipop3d
#imap     stream     tcp     nowait     root     /usr/sbin/tcpd     imapd
#
# Le service UUCP est un moyen d'envoyer des fichiers entre machines. Ce service n'est pratiquement plus utilisé.
# Evitez de l'utiliser. 
#
#uucp     stream     tcp     nowait     uucp     /usr/sbin/tcpd     /usr/lib/uucp/uucico
-l
#
# Tftp et bootp  sont utilisés pour permettre aux machines clientes qui ne disposent pas de disque de booter, de recevoir une adresse IP, de charger le système. 
# TFTP ne disposant pas de système d'authentification il est un énorme trou de sécurité.

# Vous devez absolument éviter de l'utiliser
#
# tftp     dgram     udp     wait     root     /usr/sbin/tcpd     in.tftpd
# bootps     dgram     udp     wait     root     /usr/sbin/tcpd     bootpd
#
# Finger, cfinger, systat and netstat ne sont pas dangereux en eux même, mais ils fournissent des informations sur les comptes 
# utilisateurs et votre système. Il ne faut donc pas les utiliser.
#
# finger     stream     tcp     nowait     nobody     /usr/sbin/tcpd     in.fingerd
#cfinger     stream     tcp     nowait     root     /usr/sbin/tcpd     in.cfingerd
#systat     stream     tcp     nowait     guest     /usr/sbin/tcpd     /bin/ps -auwwx
#netstat     stream     tcp     nowait     guest     /usr/sbin/tcpd     /bin/netstat -f inet

# Service d'authentification auth fournit des information sur l'utilisateur
auth stream tcp wait root /usr/sbin/in.identd in.identd -e -o
#
# End of inetd.conf
linuxconf stream tcp wait root /bin/linuxconf linuxconf --http

Le # devant une ligne rend la ligne inactive, donc le service non disponible.
Si vous ne devez pas utiliser un service, rendez le inactif. Certains services utilisent TCP-Wrappers, mais ne se trouvent pas dans ce fichier. Je pense entre autre à SSH (qui doit alors être compilé avec l'option --with-libwrap), et certaine version de portmap.

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

ftp : nom du service, tel qu'il est déclaré dans /etc/services
stream : type de service de transport de données (il existe stream pour tcp, dgram pour udp, raw pour IP)
tcp : nom du protocole tel qu'il existe dans /etc/protocols
wait : état d'attente, si l'état est wait inetd doit attendre que le serveur ait restitué la socket avant de se remettre à l'écoute. On utilise wait plutôt avec les types dgram et raw. l'autre possibilité est nowait qui permet d'allouer dynamiquement des sockets à utiliser avec le type stream.
root : Nom de l'utilisateur sous lequel le daemon tourne
/usr/sbin/tcpd in.ftpd Chemin d'accès au programme in.ftpd lancé par inetd (il est possible ici d'ajouter les options de démarrage du programme.

5 Les fichiers Hosts.allow et Hosts.deny :

Vous trouverez ces deux fichiers dans le répertoire /etc. 

Le premier fichier lu est hosts.allow, puis hosts.deny.
Si une requête est autorisée dans le fichier hosts.allow alors elle est acceptée, quelque soit le contenu du fichier hosts.deny.   
Si une requête ne satisfait aucune règle, que ce soit dans hosts.allow ou hosts.deny alors elle est autorisée.   En un mot si vous ne mettez rien dans hosts.deny, alors vous n'avez rien fait.

Voici un petit exemple qui dans des cas simples est suffisant :
# hosts.allow
ALL : LOCAL
in.ftpd : 192.168.0.,10.194.168.0/255.255.255.0, 192.168.1.1
in.telnetd : .ac-creteil.fr

On autorise tout les ports depuis un accès local, et on autorise ftp pour les machines venant du réseau 192.168.0.0, ainsi que les machines du réseau 10.194.168.0 avec une autre notation et enfin la seule machine qui a pour adresse 192.168.1.1   

et le fichier hosts.deny
#hosts.deny
ALL:ALL

Le fichier hosts.deny est simple à comprendre, il interdit tout par défaut.
Le fichier hosts.allow indique les services que je veux autoriser (Le nom du service doit être identique au nom qui se trouve dans inetd.conf).
la syntaxe est la suivante :
deamon [,deamon, ..... ] : client [,client , ..... ] [: option : option ......]
Cette  syntaxe est identique dans les deux fichiers, hosts.allow et hosts.deny.

6  Pour aller plus loin

On peut contrôler plus finement les accès à sa machine en contrôlant le fichier de log, en envoyant un message à la personne qui cherche à se connecter, on peut aussi se faire envoyer des messages en utilisant la commande mail. Voici un exemple un peu plus complet et complexe que le précédent :

# Fichier hosts.allow
ALL: LOCAL .intranet.moi EXCEPT sousdomaine.intranet.moi : ALLOW
in.ftpd : ALL : banners /root/messages.txt : spawn (echo " Accès au serveur ftp par l'adresse" %a "le " 'date') >> var/log/ftp.log &
sshd : 192.168.0.
in.telnetd : 10.94.243.1 EXCEPT PARANOID : spawn (/bin/mail -s "Alert le nom d hote et l adresse IP ne correspondent pas" root@%H)& 

La ligne 1 indique que tous les ports sont ouverts pour la machine LOCAL et pour le domaine .intranet.moi sauf pour sousdomaine.intranet.moi
La ligne 2 autorise toutes les connexions sur le service ftp, mais envoi un message sur la machine qui se connecte, reste à placer le texte dans le fichier message.txt. spawn vous permet de faire appel à la commande echo qui envoie un message dans le fichier de log ftp.log avec l'adresse de la machine qui se connecte %a et la date.
La ligne 3 indique que seul le réseau 192.168.0.0 peut se connecter via ssh à la machine.
La ligne 4 autorise la connexion en telnet depuis la machine 10.94.243.1 uniquement si l'adresse IP de la machine et le nom d'hôte correspondent. On envoie alors un message en utilisant la commande mail.
Le fichier hosts.deny restant avec ALL : ALL 
Les variables que vous pouvez utiliser sont :

%a L'adresse IP du client
%A L'adresse IP du serveur
%c Informations disponibles sur l'utilisateur
%d Le nom du daemon
%h  Le nom du client ou son adresse IP si on ne peut avoir le nom
%H Le nom du serveur ou son adresse IP si on ne peut avoir le nom
%n Idem mais en vérifiant le reverse DNS
%N Idem pour le serveur
%p Le pid du daemen
%s Informations disponibles sur le serveur
%u Nom de l'utilisateur
%% Caractère %

 

7  Les utilitaires de tcp wrappers

tcpdchk -av : permet de voir la configuration de tcp wrappers
tcpdmatch in.ftpd localhost pour simuler une connexion sur in.ftpd


8 voir aussi

 xinetd un équivalent de tcp_wrappers, mais en mieux.


TP 1 :  Objectif : Protéger votre machine afin d'interdire les accès telnet et ftp depuis les autres machines de la salle de formation sauf la machine de votre voisin. Bloquer pour tout le monde les services inutiles. Utiliser les utilitaires que vous connaissez afin de vérifier cela.
Faire ajouter l'adresse IP des clients non autorisés dans un fichier de log. 


© Philippe Chadefaux - 10/10/2000 -