28.2. Le “super-serveur” inetd

Contribution de Chern Lee.
Mise à jour pour FreeBSD 6.1-RELEASE par le projet de documentation de FreeBSD.

28.2.1. Généralités

On fait parfois référence à inetd(8) comme étant le “super-serveur Internet” parce qu'il gère les connexions pour plusieurs services. Quand une connexion est reçue par inetd, ce dernier détermine à quel programme la connexion est destinée, invoque le processus en question et lui délègue la “socket” (le programme est invoqué avec la “socket” service comme entrée standard, sortie et descripteurs d'erreur). Exécuter inetd pour les serveurs qui ne sont pas utilisés intensément peut réduire la charge système globale quand on compare avec l'exécution de chaque “daemon” individuellement en mode autonome.

inetd est utilisé pour invoquer d'autres “daemon”s, mais plusieurs protocoles triviaux sont gérés directement, comme chargen, auth, et daytime.

Cette section abordera la configuration de base d'inetd à travers ses options en ligne de commande et son fichier de configuration /etc/inetd.conf.

28.2.2. Configuration

inetd est initialisé par l'intermédiaire du système rc(8). L'option inetd_enable est positionnée à la valeur NO par défaut, mais peut être activée par sysinstall lors de l'installation en fonction de la configuration choisie par l'utilisateur. Placer

inetd_enable="YES"

ou

inetd_enable="NO"

dans /etc/rc.conf activera ou désactivera le lancement d'inetd à la mise en route du système. La commande:

# /etc/rc.d/inetd rcvar

peut être lancée pour afficher le paramétrage en vigueur.

De plus, différentes options de ligne de commande peuvent être passées à inetd par l'intermédiaire de l'option inetd_flags.

28.2.3. Options en ligne de commande

Comme la plupart des « daemons », inetd possède de nombreuses options que l'on peut passer à son lancement afin de modifier son comportement. La liste complète des options se présente sous la forme:

inetd [-d] [-l] [-w] [-W] [-c maximum] [-C taux] [-a adresse | nom de machine] [-p fichier] [-R taux] [fichier de configuration]

Les options peuvent être passées à inetd en utilisant le paramètre inetd_flags dans /etc/rc.conf. Par défaut, inetd_flags contient -wW -C 60, qui active le « TCP wrapping » pour les services inetd, et empêche l'invocation d'un service plus de 60 fois par minute à partir d'une unique adresse IP.

Les novices seront heureux d'apprendre que ce paramétrage n'a en général pas besoin d'être modifié, cependant nous présentons ci-dessous les options de limitation du taux d'invocation étant donné que cela peut être utile si vous recevez une quantité excessive de connexions. Une liste complète d'options peut être trouvée dans la page de manuel de inetd(8).

-c maximum

Spécifie le nombre maximal par défaut d'invocations simultanées pour chaque service; il n'y a pas de limite par défaut. Cette option peut être surchargée pour chaque service à l'aide du paramètre nb-max-enfants.

-C taux

Précise le nombre maximal de fois qu'un service peut être invoqué à partir d'une unique adresse IP et cela sur une minute. Ce paramètre peut être configuré différemment pour chaque service avec le paramètre nb-max-connexions-par-ip-par-minute.

-R taux

Précise le nombre maximal de fois qu'un service peut être invoqué par minute; la valeur par défaut est 256. Un taux de 0 autorise un nombre illimité d'invocations.

-s maximum

Précise le nombre maximal de fois qu'un service peut être invoqué simultanément à partir d'une adresse IP unique; il n'y a pas de limite par défaut. Cette option peut-être surchargée pour chaque service individuellement avec le paramètre max-child-per-ip.

28.2.4. inetd.conf

La configuration d'inetd se fait par l'intermédiaire du fichier /etc/inetd.conf.

Quand le fichier /etc/inetd.conf est modifié, inetd peut être forcé de relire son fichier de configuration en utilisant la commande:

Exemple 28.1. Recharger le fichier de configuration d'inetd
# /etc/rc.d/inetd reload

Chaque ligne du fichier de configuration ne mentionne qu'un seul “daemon”. Les commentaires dans le fichier sont précédés par un “#”. Le format de chaque entrée du fichier /etc/inetd.conf est le suivant:

nom-du-service
type-de-socket
protocole
{wait|nowait}[/nb-max-enfants[/nb-connexions-max-par-minute]]
{wait|nowait}[/nb-max-enfants[/nb-connexions-max-par-minute[/nb-max-enfants-par-ip]]]
utilisateur[:groupe][/classe-session]
programme-serveur
arguments-du-programme-serveur

Un exemple d'entrée pour le “daemon” ftpd(8) utilisant l'IPv4 ressemblerait:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
nom-du-service

C'est le nom de service du “daemon” en question. Il doit correspondre à un des services listés dans le fichier /etc/services. Cela détermine quel port inetd doit écouter. Si un nouveau service est créé, il doit être ajouté en premier lieu dans /etc/services.

type-de-socket

Soit stream, soit dgram, soit raw, ou seqpacket. stream doit être utilisé pour les “daemon”s TCP, alors que dgram est utilisé pour les “daemon”s utilisant le protocole UDP.

protocole

Un des suivants:

ProtocoleExplication
tcp, tcp4TCP IPv4
udp, udp4UDP IPv4
tcp6TCP IPv6
udp6UDP IPv6
tcp46TCP IPv4 et v6
udp46UDP IPv4 et v6
{wait|nowait}[/nb-max-enfants[/nb-max-connexions-par-ip-par-minute[/nb-max-enfants-par-ip]]]

wait|nowait indique si le “daemon” invoqué par inetd est capable ou non de gérer sa propre “socket”. Les “socket”s de type dgram doivent utiliser l'option wait, alors que les “daemons à socket stream”, qui sont généralement multi-threadés, devraient utiliser nowait. L'option wait a généralement pour conséquence de fournir plusieurs “socket”s à un “daemon”, tandis que l'option nowait invoquera un “daemon” enfant pour chaque nouvelle “socket”.

Le nombre maximal de “daemon”s qu'inetd peut invoquer peut être fixé en utilisant l'option nb-max-enfants. Si une limite de dix instances pour un “daemon” est nécessaire, /10 devra être placé après nowait. Spécifier /0 autorise un nombre illimité d'enfant.

En plus de nb-max-enfants, deux autres options limitant le nombre maximal de connexions à partir d'un emplacement vers un “daemon” particulier peuvent être activéees. L'option nb-max-connexions-par-ip-par-minute limite le nombre de connexions par minutes à partir d'une adresse IP donnée, par exemple, une valeur de dix limiterait à dix le nombre de tentatives de connexions par minute pour une adresse IP particulière. L'option max-child-per-ip limite le nombre d'enfants qui peuvent être lancés pour une adresse IP unique à un instant donné. Ces options sont utiles pour empêcher l'abus excessif intentionnel ou par inadvertance des ressources d'une machine et les attaques par déni de service (« Denial of Service—DOS »).

Dans ce champ, wait ou nowait est obligatoire. nb-max-enfants, nb-max-connexions-par-ip-par-minute et max-child-per-ip sont optionnelles.

Un “daemon” utilisant un flux de type multi-threadé sans limites nb-max-enfants, nb-max-connexions-par-ip-par-minute ou max-child-per-ip sera tout simplement affecté de l'option nowait.

Le même “daemon” avec une limite maximale de dix “daemon” serait: nowait/10.

La même configuration avec une limite de vingt connexions par adresse IP par minute et une limite maximale de dix “daemon”s enfant serait: nowait/10/20.

Ces options sont utilisées comme valeurs par défaut par le “daemon” fingerd(8), comme le montre ce qui suit:

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s

Et enfin, un exemple de champ avec un maximum de 100 enfants en tout, avec un maximum de 5 adresses IP distinctes serait: nowait/100/0/5.

utilisateur

C'est l'utilisateur sous lequel le “daemon” en question est exécuté. En général les “daemon”s tournent sous l'utilisateur root. Pour des questions de sécurité, il est courant de rencontrer des serveurs tournant sous l'utilisateur daemon, ou sous l'utilisateur avec le moins de privilèges: nobody.

programme-serveur

Le chemin complet du “daemon” qui doit être exécuté quand une requête est reçue. Si le “daemon” est un service fourni en interne par inetd, alors l'option internal devrait être utilisée.

arguments-programme-serveur

Cette option va de pair avec programme-serveur en précisant les arguments, en commençant avec argv[0], passés au “daemon” lors de son invocation. Si mydaemon -d est la ligne de commande, mydaemon -d sera la valeur de l'option arguments-programme-serveur. Ici également, si le “daemon” est un service interne, utilisez internal.

28.2.5. Sécurité

En fonction des choix effectués à l'installation, plusieurs services peuvent être activés par défaut. S'il n'y a pas de raison particulière à l'utilisation d'un “daemon”, envisagez de le désactiver. Ajoutez un caractère “#” devant le “daemon” en question dans le fichier /etc/inetd.conf, et ensuite rechargez la configuration d'inetd. Certains « daemon »s comme fingerd, devraient être évités parce qu'ils peuvent fournir des informations utiles aux personnes malveillantes.

Certains “daemon”s n'ont aucune conscience des problèmes de sécurité, et ont un long délai limite, ou pas du tout, d'expiration pour les tentatives de connexions. Cela permet à une personne malveillante d'envoyer régulièrement et de manière espacée des demandes de connexions à un “daemon” particulier, avec pour conséquence de saturer les ressources disponibles. Cela peut être une bonne idée de placer des limitations nb-max-connexions-par-ip-par-minute, max-child ou nb-max-enfants sur certains « daemon »s si vous trouvez que vous avez trop de connexions.

Par défaut, le “TCP wrapping” est activé. Consultez la page de manuel hosts_access(5) pour plus d'information sur le placement de restrictions TCP pour divers “daemon”s invoqués par inetd.

28.2.6. Divers

daytime, time, echo, discard, chargen, et auth sont des services fournis en interne par inetd.

Le service auth fournit les services réseau d'identification, et est configurable à un certain degré, alors que les autres services ne peuvent être que stoppés ou en fonctionnement.

Consultez la page de manuel de inetd(8) pour plus d'informations.

Ce document, ainsi que d'autres peut être téléchargé sur ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

Pour toutes questions à propos de FreeBSD, lisez la documentation avant de contacter <questions@FreeBSD.org>.

Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.