FUNIX

Mettez un manchot dans votre PC


Encourager FUNIX

La consultation du site est totalement libre et gratuite, sans publicités. Les dons sont néanmoins appréciés pour payer l'hébergement et encourager son auteur


[ Présentation| Installation | Configuration ( Principes , les options généralistes , les options par service ) | Quelques exemples(le fichier xinetd.conf , configurer un service ) ]

Dernière modification 2 décembre 2002

Le super daemon xinetd

Présentation

xinetd est l'abréviation de extented internet services daemon, il remplace avantageusement inetd. Rappelons la fonction du super daemon, admettons que vous vouliez installer un serveur ftp et telnet sur la même machine, sans l'usage du super daemon, les daemons telnet et ftp doivent donc tourner en permanence sur le serveur, dans le cas du super daemon, seul celui-ci tourne en permanence, il va lancer le serveur telnet  ou ftp qu'en cas de connexion, le serveurftp et/ou telnet est stoppé en fin de connexion, le super daemon gère ainsi le lancement et l'arrêt d'un certain nombre de serveurs qu'on appelle service, on obtient la liste des services standards dans le  fichier /etc/services. Le super daemon permet ainsi d'optimiser les ressources de la machine. inetd avec les TCP_WRAPPERSpermet de contrôler les connexions sur une machine au travers des fichiers hosts.allowet hosts.deny.xinetd possèdent des fonctions supplémentaires, citons par exemple :

- limitation d'accès aux services suivant une plage horaire
- limite les risques de Deny of Services (DoS), le DoS consiste à faire de multiples requêtes sur un serveur ce qui va accaparer toutes ses ressources jusqu'à le bloquer. xinetd permet de limiter le nombre de serveurs d'un même type tournant simultanément, cette limitation porte sur le nombre de server et/ou sur la taille du fichier de log
- un service peut être attaché à une interface particulière, ainsi si vous avez un serveur connecté à internet et que seules les machines du réseau local peuvent accèder en telnet sur ce serveur, vous pouvez spécifier que les requêtestelnet ne pourront venir que de la carte réseau interne.
- redirection d'une requête vers une autre machine de votre réseau local

Installation

Sur une Mandrake 8.X et supérieur le package est xinetd. Pour avoir la dernière version  le site officiel est  www.xinetd.org, je n'ai pas cherché à compiler la dernière version, pour info, il faudra le compiler avec l'option --with-libwrap ce qui permet de pouvoir utiliser les TCP_WRAPPERS et donc les fichiers hosts.allow et hosts.deny, sachant qu'à terme ces fichiers ne devraient plus servir. Il faudra aussi le compiler avec l'option  --with-loadavg, c'est encore une protection aux DoS, elle permet d'arrêter certains services avant que le système soit bloqué.
Pour savoir si xinetd est installé et fonctionne sur votre machine

/etc/rc.d/init.d/xinetd status

Devrait vous renvoyer un truc du style

xinetd (pid 462) is running...
 
 

Configuration

Principes

Le fichier de configuration de xinetd est /etc/xinetd.conf, il est découpé en plusieurs sections, un section defaults avec des paramètres concernant tous les services, et une section par service avec des paramètres particuliers :

defaults
{
    paramètres par défaut pour tous les services
}

service nom-du-service1
{
    paramètres pour le service1
}

service nom-du-service2
{
    paramètres pour le service2
}

...

On peut très bien faire comme sous la Mandrake avoir un fichier xinetd.confcontenant :

defaults
{
       paramètres par défaut pour tous les services
}

includedir /etc/xinetd.d

On créera un répertoire /etc/xinetd.d contenant autant de fichier qu'il y a de service, chaque fichier portant le nom du service et contenant :

service nom-du-service1
{
    paramètres pour le service1
}

On aura donc le fichier telnet, ftp, finger...


Les options généralistes

Voilà les options qui peuvent s'appliquer à tous les services et qu'on peut mettre dans la section defaults du fichier xinetd.conf

log_type vous pouvez spécifier un archivage des logs en utilisant le daemon syslogd ou alors archiver dans un fichier. Exemple :

log_type = FILE /var/log/xinetd.log 20M 25M

Quand vous atteindrez un fichier de log de 20M, un message d'alerte va s'inscrire dans le fichier /var/log/messages mais le log continue, quand on va atteindre 25M, xinetd n'écrit plus dans le fichier de log.

log_on_success qui va spécifier les informations à archiver en cas de lancement réussi d'un service, vous avez le choix des paramètres suivant :

PID le PID du serveur
HOST adresse IP du client
USERID identité de l'utilisateur
EXIT le status de sortie du processus
DURATION le temps de la connexion

Exemple :

 log_on_success      = PID HOST USERID EXIT DURATION

Va donner les lignes suivantes pour un telnet

00/12/15@20:15:46: START: telnet pid=1889 from=192.168.13.10
00/12/15@20:18:39: EXIT: telnet status=0 pid=1889 duration=173(sec)

log_on_failure    qui va spécifier les informations à archiver en cas d'erreur de lancement d'un service (erreur d'authentification, manque de ressource), vous avez le choix des paramètres suivant :
HOST et USERID comme précédemment
RECORD pour enregistrer toutes les info disponibles sur le client

Exemple :

log_on_failure      = HOST RECORD

no_access pour définir les clients non autorisés à se connecter

only_from pour définir les clients autorisés à se connecter. Exemple avec le sous réseau 192.168.13.X

only_from = 192.168.13.0/32

instances pour fixer le nombre maximum d'instances de serveur à lancer, ce qui permet d'éviter le DoS

per_source pour restreindre le nombre de connexion à un service venant d'une même machine

cps pour limiter le taux de connexion, il prend deux arguments, le premier fixe le nombre max de connexion à gérer par seconde, si le nombre de connexion dépasse ce chiffre, le service sera temporairement désactivé. Le deuxième argument fixe le nombre de secondes pendant lesquelles le service restera inactivé.

 Sur une Mandrake, vous aurez ainsi les arguments communs à tous les services suivants:

defaults
{
        instances               = 60
        log_type                = SYSLOG authpriv
        log_on_success          = HOST PID
        log_on_failure          = HOST
        cps                     = 25 30
}

Les options par service

id pour identifier un service, si on utilise pas ce paramètre, dans le fichier de log on aura le nom du service, avec id vous pouvez redéfinir le nom du service qui sera archivé dans le fichier de log (ftp-public au lieu simplement de ftp par exemple)

nice pour définir la priorité d'un service (-20 plus prioritaire 19 plus prioritaire)

port numéro du port associé au service défini dans /etc/services

protocol nom du protocole défini dans /etc/protocols

server    le chemin du service

server_args arguments à passer au service

socket_type type de socket (stream pour TCP et dgram pour UDP), pour savoir si c'est l'un ou l'autre voir le fichier /etc/services

wait si wait=yes une seule instance du service peut être lancé à la fois, si wait=no, on lance un serveur à chaque nouvelle connexion (dans la limite du nombre d'instance max)

access_times pour définir une plage horaire la syntaxe est la suivante heure:minute-heure:minute, exemple pour une plage horaire entre 7h-12h et 14h-19h

access_times        = 7:00-12:00 14:00-19:00

env pour passer une variable d'environnement avant de lancer le service

bind (ou interface) pour attacher une interface à un service, pour limiter les requêtes à une interface réseau par exemple

redirect permet de rediriger une requête sur le port particulier d'une de vos machines de votre réseau local.

On peut réutiliser les paramètres déjà définis dans les paramètres par défaut et modifier les options :

exemple avec log_on_success, si celui-ci est définit dans les paramètres par défaut avec les options suivantes PID HOST USERID EXIT DURATION, on veut avoir pour un service particulier uniquement PID et HOST on écrira donc

 log_on_success      -= USERID EXIT DURATION

De même si on a log_on_success défini à PID HOST et qu'on veut rajouter DURATION on écrira

log_on_success    += DURATION

Quelques exemples

Le fichier xinetd.conf

Voilà un fichier xinetd.conf type. Pour les autorisations d'accès on autorise seules les machines du réseau local à accéder aux services, les autres machines se font jeter. Cela donne

defaults
{
        instances               = 20
        per_source            = 5
        log_type                = FILE /var/log/xinetd.log 20M 25M
        log_on_success       = HOST USERID DURATION
        log_on_failure          = HOST RECORD
        only_from = 192.168.13.0/32
}

includedir /etc/xinetd.d

Les autres définitions de service se trouve sous le répertoire /etc/xinetd.d

Configurer un service

Le fichier se trouve sous /etc/xinetd.d et porte le nom du service. La syntaxe du fichier est la suivante :

service nom-du-service
{
        socket_type = type de socket
        wait      = pour lancer un ou plusieurs instances du service
        user    = à qui appartiendra le service
        server=    chemin du serveur
        server_args= argument du serveur (facultatif)
        access_times=plage horaire (facultatif)
        nice      = priorité (facultatif)
}

Vous pouvez éventuellement rajouter d'autres options vues précédemments (access_times, ...) et redéfinir certains paramètres définis dans la section defaults

Exemple avec pop3

service pop3
{
        socket_type       = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/ipop3d
        log_on_success          += USERID
        log_on_failure             += USERID
}

Avec le serveur NNTP leafnode

service nntp
{
    socket_type     = stream
    wait            = no
    protocol        = tcp
    user            = news
    server          = /usr/local/sbin/leafnode
}

Avec ftp avec une plage horaire et une limitation à 4 personnes connectées simultanément

service ftp
{
    socket_type     = stream
    wait            = no
    protocol        = tcp
    user            = root
    server          = /usr/sbin/in.ftpd
    instances    = 4
    access_times = 7:00-12:00 14:00-17:00
    nice=15
}

Exemple avec xtelw le serveur minitel pour windows qui permet de voir comment passer un argument au service

service xtelw
{
    socket_type     = stream
    wait            = no
    protocol        = tcp
    user            = root
    server          = /usr/X11R6/bin/xtelw
    server_args     = -H
}

Exemple avec un serveur ftp privé, seules les requêtes venant de l'interface réseau internet sont acceptées, id va redéfinir le nom du service, dans le fichier log on verra la mention ftp-private au lieu de ftp tout simplement.

service ftp
{
    id    = ftp-private
    socket_type = stream
    wait    =no
    user    =root
    server=/usr/sbin/in.ftpd
    instances=    4
    only_from= 192.168.13.0/24
    bind= 192.168.13.11
}

Autre exemple avec la redirection, ici on rediriger vers le port 23 (telnet) de la machine 192.168.13.10

service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        redirect = 192.168.13.10    23
}
 
 

[Retour page d'accueil FUNIX]