inetd et xinetd

 

inetd

inetd (Internet Super Server) est un service qui, lorsqu'il est installé, se charge d'écouter tous les ports réseau configurés. Lorsque qu'une demande TCP ou datagramme UDP est reçue sur un port, inetd lance l'application correspondante pour ce port (cf. /etc/services).

Le principe étant de n'avoir qu'un seul programme à l'écoute contrairement à une autre solution qui consiste à lancer chacun des serveurs en écoute consommant ainsi plus de ressource. En contrepartie, le serveur risque de répondre moins vite puisque c'est inet qui repondra en premier lieu.

Le fichier de configuration d’inetd est /etc/inetd.conf

NoteEn réalité, il est fort probable qu'inetd donne la main ensuite à TCP Wrapper (tpcd), démon qui va contrôler que la connexion de l'adresse IP cliente est autorisée vers l'application.

NoteIl est toujours possible de lancer un démon à l'écoute de son port. Dans ce cas, on dit que le démon est lancé en stand-alone. Cette option n'est pas conseillée, préférez l'utilisation de TCP Wrapper pour des raisons de sécurité.

 

Le fichier /etc/inetd.conf

Le fichier /etc/inetd.conf permet d'indiquer à inetd le programme à appeler.

Une ligne sera composée de la façon suivante:

# commentaire

ou

nom_service type_socket protocole libérer_socket propriétaire programme options_programme

Avec:

  • nom_service correspondant à l'un des services trouvé dans /etc/services
  • type_socket généralement à stream pour du tcp, dgram pour du udp
  • protocole à tcp ou udp (suivant ce qui est indiqué dans /etc/services
  • libérer_socket Faut-il libérer le socket (Généralement nowait pour tcp et wait pour udp - nowait pour du multithread ou plusieurs connexions simultanées, yes pour monothread)
  • propriétaire pour indiquer le propriétaire du programme au lancement (ex. root)
  • programme: le programme à lancer (chemin et fichier)
  • options_programme, les options à passer au programme

Noteprogramme pourra être TCP Wrapper si installé. Vous trouverez dans ce cas /usr/sbin/tcpd et le propriétaire sera alors root. L'option sera le nom du service à lancer si tcpd en donne l'autorisation (ex. in.telnetd ou in.ftpd)

NoteSi vous voulez supprimer la gestion d'un service par inet, il suffit de mettre un # devant la ligne ou de supprimer cette ligne. Puis relancer inetd

 

Forcer le contrôle par tcpd

Il est possible de forcer l'utilisation du démon tcpd pour contrôler l'adresse ip du host avec une liste des ip valides

Il suffit dans ce cas d'indiquer dans le champ "programme" le démon tcpd et en paramètre, l'application qui sera à lancer si tout est ok.

Exemple avec telnet:

telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd

 

xinetd

Il s'agit de inetd étendu.

  • Les applications ont leur propre fichier de configuration situé dans /etc/xinetd.d
  • Affiner les logs des services
  • Paramétrage des plages horaires de disponibilité des services
  • Il est possible de chrooter les services
  • Limiter les effets des attaques DOS (Priorité d'exécution d'un serveur, contrôle de la charge CPU, limité le nombre de connexions par service)
  • Redirection de ports

Paramétrage de xinetd

xinetd peut avoir son propre fichier sous /etc/xinetd.conf

Dans /etc/xinetd.d, vous trouverez un fichier de configuration xinetd par application (ou service)

Le contenu de fichier est du type:


Avec

  • nom_service correspondant à l'un des services trouvé dans /etc/services. Peut être positionné à defaults pour que la configuration porte sur l'ensemble des services
  • socket-type=type_socket généralement à stream pour du tcp, dgram pour du udp (cf. /etc/services)
  • wait = attendre_ou_pas à yes ou no
  • server=programme: le programme à lancer (chemin et fichier)
  • disable = yes_no à yes pour désactiver le service, no sinon

Vous pouvez aussi trouver

  • protocole qui, si n'est pas renseigné, sera récupéré depuis le fichier /etc/services
  • port, pour le port, là aussi récupéré depuis /etc/services si non renseigné.
  • rpc_version et rpc_number pour les services basés sur RPC
  • log_type avec
    • SYSLOG syslog_facility [syslog level]. Les logs seront gérés par syslogd avec level à emerg, alert, crit, err, warning, notice, info, debug
    • FILE file [soft limit [hard limit]] ou limit soft pour alerter et hard pour arrêter d'alimenter la log. limit étant de la forme 9999u pour u pour unité= b pour octets, k pour kilo et m pour méga-octets.
  • log_on_success += PID USERID HOST DURATION
    log_on_failure += HOST USERID
  • only_from = valeur [valeurs...] pour filtrer les accès avec valeur positionnée à une adresse IP, adresses réseau (192.168.0.0 par exemple pour autoriser les ip de ce réseau), hostnames (via les noms déclarés dans /etc/hosts) ou nom de domaine.
  • access_times = interval [interval...] ou interval est de type hh:mm-hh:mm par exemple 8:00-12:00
  • redirect = adresseIP port pour rediriger des ip/port
  • bind=adresse IP pour attribuer une adresse IP à un service
  • server_args = arguments pour le serveur (il ne faut pas y retrouver le nom du serveur)
  • flags=une combinaison des flags suivant: INTERCEPT NORETRY IDONLY NAMEINARGS NODELAY KEEPALIVE NOLIBWRAP SENSOR

NoteDésactivez le lancement du service correspondant dans le fichier /etc/services sinon, xinet ne pourra pas surveiller le port puisque déjà utilisé par le dit service.

chrooter un service

chroot permet de virtualiser les accès disques en indiquant à une application que la racine d'un disque est en fait un répertoire. cela limite ainsi l'accès au disque aux applications.

Dans ce cas, il suffit d'indiquer dans server chroot, puis en paramètre l'application à lancer.

server = /usr/sbin/chroot
server_args = /opt/proftpd/proftpd

 

Limiter les attaques DOS (Deny of Service)

  • nice pour indiquer une priorité d'exécution (-20 pour le plus prioritaire à 19 pour le moins prioritaire)
  • rlimit_cpu = seconds pour limiter le temps CPU utilisé par un ou plusieurs services
  • instances = value nombre d'instance du serveur autorisées
  • per_source = value pour limiter le nombre de connexions depuis la même adresse (uniquement attaques DOS)
  • flags = SENSOR
    deny_time = minutes pour blacklister de tous les services des adresses IP qui tentent des connexions sur des services désactivés. deny_time à FOREVEER bloque l'adresse IP jusqu'au redémarrage de xinetd

Annexes

Après configuration, vérifiez le bon fonctionnement en consultant le syslog !

 

Pour les vieux xinetd ou si le flag NOLIBWRAP est positionné, comme pour inetd, il reste possible d'utiliser tcpd.

Mais il faudra positionner le flag NAMEINARGS pour indiquer que le serveur à lancer est indiqué dans les paramètres.

Dans ce cas, pour telnet par exemple:

service telnet
{

flags = NAMEINARGS
server = /usr/sbin/tcpd
server_args = /usr/sbin/in.telnetd

}