Administration réseau sous Linux/TCP Wrapper

Le super service inetd permet de contrôler et de restreindre l'accès à certains services réseau. Ceux-ci sont gérés par inetd et ne sont plus en mode dit "standalone".

Inetd utilise le démon tcpd qui intercepte les demandes de connexion à un service et vérifie par le biais des 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.

Inetd est un élément à mettre en œuvre pour sécuriser une machine sous linux, il ne peut toutefois pas remplacer complétement un vrai firewall.

Le principe modifier

Lorsque vous souhaitez vous connecter sur une machine distante avec la commande telnet par exemple, le démon 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 (démon de log) votre demande (cette demande se retrouvera dans les logs, fichier /var/log/securite).

L'installation modifier

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

Configuration : le fichier inetd.conf modifier

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 la commande killall -HUP inetd. Il est possible d'ajouter d'autres services dans ce fichier.

En voici un commenté:

# Version: \@(#)/etc/inetd.conf
# 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     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 gram 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.
# À 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é.
#Évitez de l'utiliser.
#uucp stream     tcp     nowait     uucp
/usr/sbin/tcpd /usr/lib/uucp/uucico -l
#ftp 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.

Voici un descriptif de quelques options. Considérons la ligne suivante:

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.

Hosts.allow et Hosts.deny modifier

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, quel que 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 :

fichier hosts.allow

# hosts.allow
ALL : LOCAL
in.ftpd : 192.168.0.,10.194.168.0/255.255.255.0, 192.168.1.1
in.telnetd : .iut.u-clermont1.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

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.


Les utilitaires de tcp wrappers modifier

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


voir aussi xinetd un équivalent de tcp_wrappers, mais avec plus d'options.