Product SiteDocumentation Site

3.5. Administrer le nombre minimal de services nécessaires

Les services sont des programmes tels que les serveurs FTP et les serveurs web. Puisqu'ils doivent écouter les connexions entrantes qui demandent le service, des ordinateurs externes peuvent se connecter au vôtre. Les services sont parfois vulnérables (entendez par là qu'ils peuvent être compromis par certaines attaques) : ils créent des risques pour la sécurité.
Vous ne devriez pas installer les services dont vous n'avez pas besoin sur la machine. Chaque service installé peut introduire de nouveaux trous de sécurité, peu évidents ou inconnus, sur l'ordinateur.
Comme vous le savez sans doute déjà, lorsque vous installez un service, le comportement par défaut est de l'activer. Dans une installation Debian par défaut, sans service installé, le nombre de services actifs est assez faible et il est même plus faible quand on parle de services réseau. Dans une installation standard de Debian 3.1, les seuls services activés par défaut sont OpenSSH, Exim (selon la façon dont vous l'avez configuré) et le portmapper RPC comme services réseau[4]. Si vous n'avez pas choisi l'installation standard, mais que vous avez sélectionné l'installation en mode expert, vous obtiendrez une installation avec aucun service réseau actif. Le portmapper RPC est installé par défaut car il est nécessaire pour beaucoup de services, par exemple NFS. Cependant, il peut facilement être retiré, consultez Section 5.13, « Sécurisation des services RPC » pour plus d'informations sur la façon de sécuriser ou de désactiver les services RPC.
Lorsque vous installez un nouveau service réseau (démon) sur le système Debian GNU/Linux, il peut être activé de deux façons : avec le superdémon inetd (une ligne sera ajoutée à /etc/inetd.conf) ou par un programme qui s'attache lui-même aux interfaces réseau. Ces programmes sont contrôlés par les fichiers /etc/init.d qui sont appelés lors du démarrage au moyen du mécanisme System V (ou un autre) en utilisant des liens symboliques dans /etc/rc?.d/* (pour plus d'informations sur la manière dont cela est fait, consultez /usr/share/doc/sysvinit/README.runlevels.gz).
Si vous voulez garder certains services tout en les utilisant rarement, utilisez les commandes update-*, par exemple update-inetd et update-rc.d pour les supprimer du processus de démarrage. Pour plus d'informations sur la façon de désactiver des services réseau, veuillez consulter Section 3.5.1, « Désactivation de services démon ». Si vous voulez changer le comportement par défaut de démarrage des services à l'installation de leur paquet associé[5], utilisez policy-rc.d, veuillez consulter /usr/share/doc/sysv-rc/README.policy-rc.d.gz pour obtenir plus de renseignements.
La prise en charge d'invoke-rc.d est obligatoire dans Debian, ce qui veut dire que pour Debian 4.0 Etch et versions suivantes, vous pouvez écrire un fichier policy-rc.d qui interdit le démarrage des nouveaux démons avant de les avoir configurés. Même si aucun de ces scripts n'est encore empaqueté, ils sont plutôt faciles à écrire. Consultez policyrcd-script-zg2.

3.5.1. Désactivation de services démon

La désactivation d'un service démon est relativement simple. Vous pouvez soit supprimer le paquet fournissant le programme pour ce service, soit supprimer ou renommer les liens de démarrage sous /etc/rc${runlevel}.d/. Si vous les renommez, assurez-vous qu'ils ne commencent pas avec un « S » pour qu'ils ne soient pas démarrés par /etc/init.d/rc. Ne supprimez pas tous les liens disponibles ou le système de gestion des paquets les régénérera lors des mises à jour du paquet, assurez-vous de laisser au moins un lien (typiquement, un lien « K », « kill » pour tuer). Pour obtenir plus de renseignements, veuillez consulter la section http://www.debian.org/doc/manuals/reference/ch-system#s-custombootscripts de la référence Debian (chapitre 2 - fondamentaux de Debian).
Vous pouvez supprimer ces liens manuellement ou en utilisant update-rc.d (consultez update-rc.d(8)). Vous pouvez, par exemple, désactiver un service pour les niveaux d'exécution multiutilisateurs en faisant :
  # update-rc.d nom stop XX 2 3 4 5 .
Avec XX un nombre qui détermine quand l'action d'arrêt pour ce service sera exécutée. Veuillez noter que, si vous n'utilisez pas file-rc, update-rc.d -f service remove ne fonctionnera pas correctement car tous les liens sont supprimés, lors d'une réinstallation ou d'une mise à jour du paquet, ces liens seront régénérés (ce qui n'est probablement pas ce que vous voulez). Si vous pensez que cela n'est pas intuitif, vous avez probablement raison (consultez le http://bugs.debian.org/67095). D'après les pages de manuel :
  Si des fichiers /etc/rcrunlevel.d/[SK]??nom existent déjà,
  alors update-rc.d ne fait rien. C'est ainsi fait pour que
  l'administrateur système puisse réarranger les liens — à condition
  qu'il en reste au moins un — sans que sa configuration ne soit
  réécrite.
Si vous utilisez file-rc, toutes les informations concernant le démarrage des services sont gérées par un fichier de configuration commun et sont conservées même si les paquets sont retirés du système.
Vous pouvez utiliser l'interface texte (TUI, Text User Interface) fournie par sysv-rc-conf pour faire tous ces changements facilement (sysv-rc-conf fonctionne pour file-rc ainsi que pour les niveaux d'exécution normaux de type System V). Vous pouvez également trouver des interfaces graphiques similaires pour les systèmes de bureau. Vous pouvez aussi utiliser l'interface en ligne de commande de sysv-rc-conf :
  # sysv-rc-conf bidule off
L'avantage, avec cet utilitaire, est que les liens rc.d sont remis dans l'état qu'ils avaient avant l'appel « off » si vous réactivez le service avec :
  # sysv-rc-conf bidule on
D'autres méthodes (moins recommandées) pour désactiver les services sont :
  • suppression du script /etc/init.d/nom_service et suppression des liens de démarrage avec :
      # update-rc.d nom remove
  • déplacement du fichier script (/etc/init.d/nom_service) vers un autre nom (par exemple /etc/init.d/OFF.nom_service). Cela laissera des liens symboliques non valables sous /etc/rc${runlevel}.d/ et générera des messages d'erreur au démarrage du système ;
  • suppression du droit d'exécution du fichier /etc/init.d/nom_service. Cela générera également des messages d'erreur au démarrage ;
  • édition du script /etc/init.d/nom_service pour qu'il s'arrête immédiatement lorsqu'il est exécuté (en ajoutant une ligne exit 0 au début ou en commentant la partie start-stop-daemon dans celui-ci). Si vous procédez de cette façon, vous ne pourrez plus utiliser le script pour démarrer le service vous-même plus tard.
Cependant, les fichiers sous /etc/init.d sont des fichiers de configuration et ne devraient pas être écrasés lors des mises à jour de paquet si vous y avez fait des modifications locales.
Contrairement à d'autres systèmes d'exploitation (UNIX), les services dans Debian ne peuvent pas être désactivés en modifiant les fichiers dans /etc/default/nom_service.
FIXME : Ajouter des informations sur la gestion des démons par file-rc.

3.5.2. Désactivation d'inetd ou de ses services

Vous devriez vérifier si vous avez vraiment besoin du démon inetd de nos jours. inetd a toujours été un moyen de compenser des déficiences du noyau, mais celles-ci ont été corrigées dans les noyaux Linux modernes. Des possibilités de déni de service existent avec inetd (qui peut augmenter énormément la charge de la machine) et de nombreuses personnes préfèrent utiliser des démons indépendants au lieu d'appeler des services avec inetd. Si vous voulez toujours exécuter un service du genre d'inetd, tournez-vous plutôt vers un démon inetd plus configurable comme xinetd, rlinetd ou openbsd-inetd.
Vous devriez arrêter tous les services inetd non nécessaires sur le système, comme echo, chargen, discard, daytime, time, talk, ntalk et les r-services (services à distance) (rsh, rlogin et rcp) qui sont considérés comme EXTRÊMEMENT dangereux (utilisez ssh à la place).
Vous pouvez désactiver les services en modifiant directement /etc/inetd.conf, mais Debian offre un meilleur moyen : update-inetd (qui commente les services de manière à ce qu'ils puissent être facilement réactivés). Vous pouvez supprimer le démon telnet en exécutant cette commande pour changer le fichier de configuration et redémarrer le démon (dans ce cas le service est désactivé) :
/usr/sbin/update-inetd --disable telnet
Si vous désirez des services en attente, mais qui n'écoutent pas sur toutes les adresses IP de l'hôte, vous voudrez peut-être utiliser des fonctions non documentées de inetd (remplacez des noms de service avec la syntaxe service@ip) ou utilisez un autre démon tel que xinetd.


[4] L'empreinte dans Debian 3.0 et les versions précédentes n'était pas aussi réduite car certains services inetd étaient activés par défaut. Les installations standard de Debian 2.2 installaient également le serveur NFS ainsi que le serveur TELNET.
[5] C'est pratique si vous mettez en place un chroot de développement, par exemple.