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 a 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 même seront ignorées.
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ée.
Toujours 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 commes celles des clients
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 nom de domaine dans ces fichiers. Dans ce cas, tcpd comparera partiellement l'adresse ou le nom reçu lui entièrement lors de la connexion.
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ègles 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 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.
Vous pouvez constater ainsi qu'Apache (situé sous /usr/sbin/apache2 dans les dernières versions) n'est pas pris en charge. Et pour cause, il y aurait doublon, en effet, Apache permet déjà de gérer les accès, connexions.
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