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 -