Table des matières

Introduction

Le contrôle de l'accès aux services du réseau est l'une des tâches de sécurité les plus importantes auxquelles est confronté un administrateur de serveur. Linux fournit plusieurs outils à cette fin.

Par exemple, un pare-feu basé sur iptables filtre les paquets réseau indésirables dans la pile réseau du noyau. Pour les services réseau qui l'utilisent, les TCP Wrappers ajoutent une couche de protection supplémentaire en définissant quels hôtes sont ou ne sont pas autorisés à se connecter aux services réseau “enveloppés”.

Un de ces services réseau enveloppés est le super serveur xinetd. Ce service est appelé “super serveur” parce qu'il contrôle les connexions à un sous-ensemble de services réseau et affine encore le contrôle d'accès.

La figure qui suit est une illustration de base de la manière dont ces outils fonctionnent ensemble pour protéger les services de réseau.

Ce chapitre se concentre sur le rôle des TCP Wrappers et de xinetd dans le contrôle de l'accès aux services réseau et examine comment ces outils peuvent être utilisés pour améliorer à la fois la journalisation et la gestion.

TCP Wrappers

Le paquet TCP Wrappers (tcp_wrappers) est installé par défaut et fournit un contrôle d'accès aux services du réseau basé sur l'hôte. Le composant le plus important de ce paquet est la bibliothèque /usr/lib/libwrap.a. En termes généraux, un service TCP-wrapped est un service qui a été compilé avec la bibliothèque libwrap.a.

Lorsqu'une tentative de connexion est faite à un service TCP-wrapped, le service fait d'abord référence aux fichiers d'accès de l'hôte (/etc/hosts.allow et /etc/hosts.deny) pour déterminer si le client est autorisé à se connecter ou non. Dans la plupart des cas, il utilise ensuite le démon syslog (syslogd) pour écrire le nom du client demandeur et le service demandé dans /var/log/secure ou /var/log/messages.

Si un client est autorisé à se connecter, TCP Wrappers libèrent le contrôle de la connexion au service demandé et ne prend plus part à la communication entre le client et le serveur.

En plus du contrôle d'accès et de la journalisation, TCP Wrappers peut exécuter des commandes pour interagir avec le client avant de refuser ou de libérer le contrôle de la connexion au service réseau demandé.

Comme TCP Wrappers est un ajout précieux à l'arsenal d'outils de sécurité de tout administrateur de serveur, la plupart des services réseau de Linux sont liés à la bibliothèque libwrap.a. Parmi ces applications, citons /usr/sbin/sshd, /usr/sbin/sendmail et /usr/sbin/xinetd.

Note:

Pour déterminer si un binaire de service réseau est lié à libwrap.a, tapez la commande suivante en tant qu'utilisateur root :

ldd <binary-name> | grep libwrap

Remplacez <binary-name> par le nom du service binaire du réseau.

Si la commande retourne directement à l'invite sans résultat, alors le service réseau n'est pas lié à libwrap.a.

L'exemple suivant indique que /usr/sbin/sshd est lié à libwrap.a :

[root@myserver ~]# ldd /usr/sbin/sshd | grep libwrap
        libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00655000)

Avantages de TCP Wrappers

TCP Wrappers offrent les avantages suivants par rapport aux autres techniques de contrôle des services de réseau :

Fichiers de configuration TCP Wrappers

Pour déterminer si un client est autorisé à se connecter à un service, TCP Wrappers fait référence aux deux fichiers suivants, communément appelés fichiers d'accès aux hôtes :

Lorsqu'un service enveloppé dans le TCP reçoit une demande d'un client, il effectue les étapes suivantes :

Les points suivants sont importants à prendre en compte lors de l'utilisation de TCP Wrappers pour protéger les services réseau :

Attention:

Si la dernière ligne d'un fichier d'accès à l'hôte n'est pas un caractère de nouvelle ligne (créé en appuyant sur la touche Entrée), la dernière règle du fichier échoue et une erreur est enregistrée dans /var/log/messages ou /var/log/secure.

C'est également le cas d'une règle qui s'étend sur plusieurs lignes sans utiliser le caractère de barre oblique inversée. L'exemple suivant illustre la partie pertinente d'un message de journal pour un échec de règle dû à l'une ou l'autre de ces circonstances :

warning: /etc/hosts.allow, line 20: missing newline or line too long

Règles de formatage des accès

Le format pour /etc/hosts.allow et /etc/hosts.deny est identique. Chaque règle doit être sur sa propre ligne. Les lignes vides ou les lignes qui commencent par un dièse (#) sont ignorées.

Chaque règle utilise le format de base suivant pour contrôler l'accès aux services du réseau :

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

Voici un exemple de règle de base pour l'accès aux hôtes :

vsftpd : .example.com

Cette règle demande à TCP Wrappers de surveiller les connexions au démon FTP (vsftpd) depuis n'importe quel hôte du domaine exemple.com. Si cette règle apparaît dans hosts.allow, la connexion est acceptée. Si cette règle apparaît dans le fichier hosts.deny, la connexion est rejetée.

Le prochain exemple de règle d'accès aux hôtes est plus complexe et utilise deux champs d'option :

sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log \ : deny

Notez que chaque champ d'option est précédé d'une barre oblique inversée (\). L'utilisation de la barre oblique inversée permet d'éviter l'échec de la règle en raison de sa longueur.

Cet exemple de règle indique que si une connexion au démon SSH (sshd) est tentée à partir d'un hôte du domaine example.com, il faut exécuter la commande echo pour ajouter la tentative à un fichier journal spécial, et refuser la connexion. Comme la directive optionnelle deny est utilisée, cette ligne refuse l'accès même si elle apparaît dans le fichier hosts.allow.

Wildcards

Les Wildcards permettent à TCP Wrappers de faire correspondre plus facilement des groupes de démons ou d'hôtes. Ils sont utilisés le plus souvent dans le domaine des règles d'accès aux listes de clients.

Les Wildcards suivants sont disponibles :

Important:

Les Wildcards KNOWN, UKNOWN et PARANOID doivent être utilisés avec précaution, car ils dépendent du bon fonctionnement du serveur DNS. Toute perturbation de la résolution de noms peut empêcher des utilisateurs légitimes d'accéder à un service.

Patterns

Les Patterns peuvent être utilisés dans le domaine des règles d'accès des clients pour spécifier plus précisément les groupes d'hôtes clients.

Voici une liste de modèles courants pour les entrées dans le champ client :

All : .exemple.com
ALL : 192.168.
ALL : 192.168.0.0/255.255.254.0
ALL : *.exemple.com
in.telnetd : /etc/telnet.hosts

Operators

À l'heure actuelle, les règles de contrôle d'accès acceptent un seul opérateur, EXCEPT. Il peut être utilisé à la fois dans la liste des démons et dans la liste des clients d'une règle.

L'opérateur EXCEPT permet des exceptions spécifiques à des correspondances plus larges au sein d'une même règle.

Dans l'exemple suivant, tiré d'un fichier hosts.allow, tous les hôtes du site example.com sont autorisés à se connecter à tous les services, à l'exception de cracker.example.com :

ALL : .example.com EXCEPT cracker.example.com

Dans un autre exemple tiré d'un fichier hosts.allow, les clients du réseau 192.168.0.x peuvent utiliser tous les services sauf le FTP :

ALL EXCEPT vsftpd : 192.168.0.

Option Fields

En plus des règles de base qui autorisent et refusent l'accès, l'implémentation de TCP Wrappers dans Linux prend en charge des extensions du langage de contrôle d'accès par le biais de champs d'options. En utilisant des champs d'option dans les règles d'accès aux hôtes, les administrateurs peuvent accomplir une variété de tâches telles que la modification du comportement des journaux, la consolidation du contrôle d'accès et le lancement de commandes shell.

Logging

Les champs d'option permettent aux administrateurs de modifier facilement le niveau de journalisation et le niveau de priorité d'une règle en utilisant la directive de severity.

Dans l'exemple suivant, les connexions au démon SSH depuis n'importe quel hôte du domaine example.com sont enregistrées dans la fonction syslog authpriv par défaut (car aucune valeur de fonction n'est spécifiée) avec une priorité d'urgence :

sshd : .example.com : severity emerg

Il est également possible de spécifier une facility en utilisant l'option severity. L'exemple suivant consigne toutes les tentatives de connexion SSH des hôtes du domaine example.com à la facility : local0 avec la priorité alert :

sshd : .exemple.com : severity local0.alert

Access Control

Les champs d'option permettent également aux administrateurs d'autoriser ou de refuser explicitement des hôtes dans une règle unique en ajoutant la directive d'autorisation ou de refus comme option finale.

Par exemple, les deux règles suivantes autorisent les connexions SSH à partir du site client-1.exemple.com, mais refusent les connexions à partir du site client-2.exemple.com :

sshd : client-1.exemple.com : allow
sshd : client-2.example.com : deny

En permettant le contrôle d'accès par règle, le champ d'option permet aux administrateurs de consolider toutes les règles d'accès dans un seul fichier : soit hosts.allow, soit hosts.deny. Certains administrateurs considèrent qu'il s'agit là d'une manière plus simple d'organiser les règles d'accès.

Shell Commands

Les champs d'option permettent aux règles d'accès de lancer des commandes shell par le biais des deux directives suivantes :

Dans l'exemple suivant, les clients qui tentent d'accéder aux services Telnet à partir du domaine example.com sont discrètement enregistrés dans un fichier spécial :

in.telnetd : .example.com \
	: spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log \
	: allow

Dans l'exemple suivant, les clients qui tentent d'accéder aux services FTP à partir du domaine example.com reçoivent un message à l'aide de la commande echo :

vsftpd : .example.com \
	: twist /bin/echo "421 Ce domaine a été mis sur liste noire. Accès refusé".

Expansions

Les extensions, lorsqu'elles sont utilisées en conjonction avec les directives spawn et twist, fournissent des informations sur le client, le serveur et les processus impliqués.

Voici une liste des extensions prises en charge :

L'exemple de règle suivant utilise une extension en conjonction avec la commande spawn pour identifier l'hôte du client dans un fichier journal personnalisé.

Lorsque des connexions au démon SSH (sshd) sont tentées à partir d'un hôte du domaine example.com, exécutez la commande echo pour enregistrer la tentative, y compris le nom d'hôte du client (en utilisant l'extension %h), dans un fichier spécial :

sshd : .example.com  \
	: spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log \
	: deny

De même, les extensions peuvent être utilisées pour personnaliser les messages renvoyés au client. Dans l'exemple suivant, les clients qui tentent d'accéder aux services FTP à partir du domaine example.com sont informés qu'ils ont été bannis du serveur :

vsftpd : .example.com \
        : twist /bin/echo "421 %h has been banned from this server!"

xinetd

Le démon xinetd est un super service TCP-Wrapped qui contrôle l'accès à un sous-ensemble de services réseau populaires, y compris FTP, IMAP et Telnet. Il fournit également des options de configuration spécifiques au service pour le contrôle d'accès, la journalisation améliorée, la liaison, la redirection et le contrôle de l'utilisation des ressources.

Lorsqu'un client tente de se connecter à un service réseau contrôlé par xinetd, le super service reçoit la demande et vérifie s'il existe des règles de contrôle d'accès TCP Wrappers.

Si l'accès est autorisé, xinetd vérifie que la connexion est autorisée en vertu de ses propres règles d'accès pour ce service. Il vérifie également que le service peut disposer de plus de ressources et qu'il n'enfreint aucune règle définie.

Si toutes ces conditions sont remplies (c'est-à-dire que l'accès au service est autorisé, que le service n'a pas atteint sa limite de ressources et qu'il ne viole aucune règle définie), xinetd lance alors une instance du service demandé et lui transmet le contrôle de la connexion. Une fois la connexion établie, xinetd ne prend plus part à la communication entre le client et le serveur.

Fichiers de configuration xinetd

Les fichiers de configuration pour xinetd sont les suivants :

Fichier /etc/xinetd.conf

Le fichier /etc/xinetd.conf contient des paramètres de configuration généraux qui affectent chaque service sous le contrôle de xinetd. Il est lu lors du premier démarrage du service xinetd, donc pour que les changements de configuration prennent effet, vous devez redémarrer le service xinetd.

Voici un exemple de fichier /etc/xinetd.conf :

defaults
{
         instances               = 60        
	 log_type                = SYSLOG	authpriv
	 log_on_success          = HOST PID
	 log_on_failure          = HOST
	 cps                     = 25 30
}
includedir /etc/xinetd.d

Ces lignes contrôlent les aspects suivants de xinetd :

Dossier /etc/xinetd.d/

Le répertoire /etc/xinetd.d/ contient les fichiers de configuration de chaque service géré par xinetd et les noms des fichiers sont en corrélation avec le service. Comme pour xinetd.conf, ce répertoire n'est lu que lorsque le service xinetd est lancé. Pour que les changements prennent effet, l'administrateur doit redémarrer le service xinetd.

Le format des fichiers dans le répertoire /etc/xinetd.d/ utilise les mêmes conventions que le répertoire /etc/xinetd.conf. La raison principale pour laquelle la configuration de chaque service est stockée dans un fichier séparé est de rendre la personnalisation plus facile et moins susceptible d'affecter les autres services.

Pour comprendre comment ces fichiers sont structurés, considérez le fichier /etc/xinetd.d/krb5-telnet :

service telnet
{
         flags           = REUSE
	 socket_type     = stream
	 wait            = no
	 user            = root
	 server          = /usr/kerberos/sbin/telnetd
	 log_on_failure  += USERID
	 disable         = yes
}

Ces lignes contrôlent divers aspects du service telnet :

Modification des fichiers de configuration xinetd

Une série de directives est disponible pour les services protégés par xinetd. Cette section met en évidence certaines des options les plus couramment utilisées.

Options de journalisation

Les options de journalisation suivantes sont disponibles à la fois pour le fichier /etc/xinetd.conf et les fichiers de configuration spécifiques au service dans le répertoire /etc/xinetd.d/.

Voici une liste de quelques-unes des options de journalisation les plus couramment utilisées :

Options de contrôle d'accès

Les utilisateurs des services xinetd peuvent choisir d'utiliser les règles d'accès aux hôtes TCP Wrappers, de fournir un contrôle d'accès via les fichiers de configuration xinetd, ou un mélange des deux.

Note:

Contrairement aux TCP Wrappers, les modifications du contrôle d'accès ne prennent effet que si l'administrateur xinetd redémarre le service xinetd.

De plus, contrairement aux TCP Wrappers, le contrôle d'accès via xinetd n'affecte que les services contrôlés par xinetd.

Le contrôle d'accès aux hôtes xinetd diffère de la méthode utilisée par les TCP Wrappers. Alors que le TCP Wrappers place toute la configuration d'accès dans deux fichiers, /etc/hosts.allow et /etc/hosts.deny, le contrôle d'accès de xinetd se trouve dans le fichier de configuration de chaque service dans le répertoire /etc/xinetd.d/.

Les options d'accès aux hôtes suivantes sont prises en charge par xinetd :

Les options only_from et no_access peuvent utiliser une liste d'adresses IP ou de noms d'hôtes, ou peuvent spécifier un réseau entier. Comme TCP Wrappers, la combinaison du contrôle d'accès xinetd avec la configuration de journalisation améliorée peut accroître la sécurité en bloquant les demandes provenant d'hôtes bannis tout en enregistrant verbalement chaque tentative de connexion.

Par exemple, le fichier /etc/xinetd.d/telnet suivant peut être utilisé pour bloquer l'accès Telnet d'un groupe de réseau particulier et restreindre la plage de temps globale pendant laquelle même les utilisateurs autorisés peuvent se connecter :

service telnet
{
         disable         = no
	 flags           = REUSE
	 socket_type     = stream
	 wait            = no
	 user            = root
	 server          = /usr/kerberos/sbin/telnetd
	 log_on_failure  += USERID
	 no_access       = 172.16.45.0/24
	 log_on_success  += PID HOST EXIT
	 access_times    = 09:45-16:15
}

Dans cet exemple, lorsqu'un système client du réseau 10.0.1.0/24, tel que 10.0.1.2, essaie d'accéder au service Telnet, il reçoit le message suivant :

Connection closed by foreign host.

En outre, leurs tentatives de connexion sont enregistrées dans /var/log/messages comme suit :

Sep  7 14:58:33 localhost xinetd[5285]: FAIL: telnet address from=172.16.45.107
Sep  7 14:58:33 localhost xinetd[5283]: START: telnet pid=5285 from=172.16.45.107
Sep  7 14:58:33 localhost xinetd[5283]: EXIT: telnet status=0 pid=5285 duration=0(sec)

Lorsque l'on utilise TCP Wrappers avec les contrôles d'accès xinetd, il est important de comprendre la relation entre les deux mécanismes de contrôle d'accès.

Voici la séquence d'événements suivie par xinetd lorsqu'un client demande une connexion :

  1. Le démon xinetd accède aux règles d'accès des hôtes TCP Wrappers en utilisant un appel de bibliothèque libwrap.a. Si une règle de refus correspond au client, la connexion est interrompue. Si une règle d'autorisation correspond au client, la connexion est passée à xinetd.
  2. Le démon xinetd vérifie ses propres règles de contrôle d'accès à la fois pour le service xinetd et le service demandé. Si une règle de refus correspond au client, la connexion est interrompue. Sinon, xinetd lance une instance du service demandé et passe le contrôle de la connexion à ce service.

Options de Binding et Redirection

Les fichiers de configuration du service pour le support xinetd lient le service à une adresse IP et redirigent les demandes entrantes pour ce service vers une autre adresse IP, un autre nom d'hôte ou un autre port.

La liaison est contrôlée par l'option de liaison dans les fichiers de configuration spécifiques au service et relie le service à une adresse IP du système. Lorsque cette option est configurée, elle permet uniquement aux demandes adressées à la bonne adresse IP d'accéder au service. Vous pouvez utiliser cette méthode pour lier différents services à différentes interfaces réseau en fonction des besoins.

Cette méthode est particulièrement utile pour les systèmes comportant plusieurs adaptateurs réseau ou plusieurs adresses IP. Sur un tel système, les services non sécurisés (par exemple, Telnet), peuvent être configurés pour écouter uniquement sur l'interface connectée à un réseau privé et non sur l'interface connectée à Internet.

L'option de redirection accepte une adresse IP ou un nom d'hôte suivi d'un numéro de port. Elle configure le service pour rediriger toute demande de ce service vers l'hôte et le numéro de port spécifiés. Cette fonction peut être utilisée pour pointer vers un autre numéro de port sur le même système, rediriger la demande vers une adresse IP différente sur la même machine, déplacer la demande vers un système et un numéro de port totalement différents, ou toute combinaison de ces options. Un utilisateur se connectant à un certain service sur un système peut donc être redirigé vers un autre système sans interruption.

Le démon xinetd est capable d'accomplir cette redirection en créant un processus qui reste en vie pendant toute la durée de la connexion entre la machine cliente demandeuse et l'hôte qui fournit effectivement le service, en transférant les données entre les deux systèmes.

Les avantages des options de liaison et de redirection sont les plus évidents lorsqu'elles sont utilisées ensemble. En liant un service à une adresse IP particulière sur un système et en redirigeant ensuite les demandes de ce service vers une deuxième machine que seule la première peut voir, un système interne peut être utilisé pour fournir des services à un réseau totalement différent.

Prenons par exemple un système qui est utilisé comme pare-feu avec ce paramètre pour son service Telnet :

service telnet
{
         socket_type		= stream
	 wait			= no
	 server			= /usr/kerberos/sbin/telnetd
	 log_on_success		+= DURATION USERID
	 log_on_failure		+= USERID
	 bind                    = 123.123.123.123
	 redirect                = 10.0.1.13 23
}

Les options de liaison et de redirection de ce fichier garantissent que le service Telnet sur la machine est lié à l'adresse IP externe (123.123.123.123), celle qui est tournée vers l'Internet. En outre, toute demande de service Telnet envoyée à 123.123.123.123 est redirigée via un deuxième adaptateur réseau vers une adresse IP interne (10.0.1.13) à laquelle seuls le pare-feu et les systèmes internes peuvent accéder. Le pare-feu envoie alors la communication entre les deux systèmes, et le système de connexion pense être connecté à 123.123.123.123 alors qu'il est en fait connecté à une autre machine.

Cette fonction est particulièrement utile pour les utilisateurs disposant d'une connexion à large bande et d'une seule adresse IP fixe. Lorsque l'on utilise la traduction d'adresse réseau (NAT), les systèmes situés derrière la machine passerelle, qui utilisent des adresses IP internes uniquement, ne sont pas disponibles depuis l'extérieur du système passerelle.

Cependant, lorsque certains services contrôlés par xinetd sont configurés avec les options de liaison et de redirection, la machine passerelle peut servir de proxy entre les systèmes externes et une machine interne particulière configurée pour fournir le service. En outre, les diverses options de contrôle d'accès et de journalisation de xinetd sont également disponibles pour une protection supplémentaire.

Options de gestion des ressources

Le démon xinetd peut ajouter un niveau de protection de base contre les attaques par déni de service (DoS). Voici une liste de directives qui peuvent contribuer à limiter l'efficacité de ces attaques :

La moyenne de charge est une mesure approximative du nombre de processus actifs à un moment donné. Voir les commandes uptime, who et procinfo pour plus d'informations sur la moyenne de charge.