tcpd

 

tcpd est un démon permettant de mettre en place des techniques de sécurité sur ce qui touche au tcp (TCP Wrappers).

Il s'agit globalement de vérifier qu'une adresse ip d'un client à le droit d'accéder à un service de la machine. Si oui, le service est lancé et la connexion entre le client et le serveur est établie.

Sinon, un message "Connection refused" est envoyé. De plus, des logs seront générés pour signaler "l'incident".

Ce démon est installé par défaut dans les versions récentes de Linux. Les serveurs (ssh, telnet, ...) devraient être compilés avec les librairies de ce démon pour permettre cet "emballage".

 

Fichiers hosts.allow et hosts.deny

Pour effectuer ce contrôle, le service tcpd utilisera deux fichiers dans lequels seront déclarés des règles:

  • hosts.allow
  • hosts.deny

 

Le premier indique le/les services autorisés pour une ip ou une plage d'ip voire nom de domaine.

Le second indique le/les services non autorisés pour une ip ou une plage d'ip voire nom de domaine.

 

Pour une règle, Seule la première ligne trouvée sera mémorisée les autres redéfinissant cette règle seront ignorées.

Note Le principe de fonctionnement est le suivant:

Lecture du contenu du fichier hosts.allow

La lecture commence au début du fichier et séquentiellement, chaque ligne sera traitée.

puis lecture du fichier hosts.deny sur le même principe. Le fichier et ses lignes étant traités après hosts.allow, une règle réapparaissant dans ce fichier sera donc ignorée.

Le fichiers hosts.allow est prioritaire sur hosts.deny. Il ne sera donc pas possible d'interdire un accès dans hosts.deny si celui-ci a été autorisé dans hosts.allow, l'interdiction sera tout simplement ignoré.

AttentionToujours terminer la dernière ligne d'un fichier comportant une règle par un retour chariot. Sinon, elle ne sera pas traitée et un incident sera envoyé dans la log /var/log/messages ou /var/log/secure.

 

Structure d'une ligne des deux fichiers

Les lignes seront structurées de la façon suivante:

<daemon list>: <client list> [: <option>: <option>: ...]

 

Wildcards ou joker

Les wildcards permettent de définir plus rapidement un ensemble de démons ou de hosts

ALL pour tous,utilisable dans la liste des démons comme celle des client

LOCAL Host ne contenant pas de . comme localhost.

KNOWN Pour les hosts où le hostname ou l'adresse du host sont connus ou l'utilisateur est connu.

UNKNOWN L'inverse de KNOW

PARANOID Pour les hostnames dont l'adresse host ne correspond pas.

 

Les patterns

De même, il ne sera pas nécessaire d'indiquer l'intégralité d'une adresse ip ou d'un domaine. Dans ce cas, tcpd comparera l'adresse ou le nom avec celui reçu en entièrement.

Exemple:

ALL: .exemple.com regroupera toutes les machines contenant .exemple.com

ALL: 192.168. indique toutes les ip commençant par 192.168.

 

Les masques de sous réseau

Il est possible d'indiquer un masque de sous réseau pour regrouper un ensemble d'ip:

ALL : 192.168.0.0/255.255.254.0

ALL : 192.168.0.0/24

de même en IPV6

ALL : fe80::20d:61ff:fe22:3476/64

 

Fichiers d'ip

Si la liste des ip est trop importante, vous pouvez inclure un fichier dans la partie cliente via /

Exemple: in.telnetd : /etc/telnet.hosts

 

EXCEPT

Permet d'introduire une exception dans une liste de règle soit sur la liste des démons, soit la liste des clients

ALL: .exemple.com EXCEPT monsite.example.com

ALL EXCEPT HTTP: 192.168.0.

 

Les options

Il est possible d'ajouter des options aux règles:

allow ou deny pour autoriser ou refuser l'accès

sshd : 192.168.0. : allow
sshd : 192.168.1. : deny

spawn permet de lancer un processus enfant. Vous pouvez par exemple générer une log "silencieusement" tout en lançant le service

in.telnetd : 192.168.0. \

: spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log \

: allow

Avec des options de paramètres qui peuvent être passées:

\ permet de passer le restant des paramètres à la ligne suivante

%a retourne l'adresse IP du client

%A Retourne l'adresse IP du serveur

%c Retourne des informations sur le client

%d pour affiche le nom du démon

%h retourne le hostname du client ou son ip si hostname non connu

%H retourne le hostname du serveur ou son ip si hostname non connu

%n retourne le hostname du client ou unknown. si non correspondance entre le hostname et l'ip, retourne paranoid

%N retourne le hostname du serveur ou unknown. si non correspondance entre le hostname et l'ip, retourne paranoid

%p Retourne l'id du processus du démon

%s Retourne divers informations du serveur comme l'id du démon, host, ...

%u Retourne le nom de l'utilisateur, unknown si inconnu.

 

twist remplace carrément l'appel du service par la commande spécifiée

vsftpd : 192.168.0. \
: twist /bin/echo "421 Accès refusé ! "

 

Comment configurer les fichiers hosts

 

Tout dependra de ce que vous voulez faire, mais le mieux selon moi est d'interdire à tout le monde dans hosts.deny

#hosts.deny
ALL:ALL

Puis d'autoriser des ip, domaines au compte-gouttes dans hosts.allow

Vérifier qu'un serveur est pris en charge par le démon

Tapez:

ldd $(which sshd) | grep wrap

Et vous devriez trouver au moins la librairie

libwrap.so.0 => /lib/arm-linux-gnueabihf/libwrap.so.0

Si c'est le cas, le serveur est pris en charge automatiquement par tcpd.

Image non trouvée !Vous pouvez constatez ainsi qu'apache (situé sous /usr/sbin/apache2 dans les dernières versions) n'est pas pris en charge. En effet, il permet de gérer les connexions à sa manière. Dommage cependant, car il y a doublon en terme de paramétrage selon moi.

 

Lancer tcpd pour chaque serveur dans inetd.conf

Il est possible de lancer un contrôle d'ip avant le lancement d'un serveur dans le fichier inetd.conf du démon inetd ou xinetd

 

Annexes

Il existe deux utilitaires:


tcpdchk -av : pour consulter la configuration de tcp wrappers
tcpdmatch: pour simuler une connexion par exemple tcpdmatch in.ftpd localhost