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
En 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.
Il 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
programme
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)
Si 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
Dé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
}