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
modifierLorsque 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
modifierPar 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
modifierCe 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
modifierVous 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 tous 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.