2.2. Suppression des services et paquetages inutiles

2.2.1. Objectifs

Une machine ayant vocation à offrir un service donné ne devrait contenir que les éléments logiciels nécessaires à la fourniture de ce service. Quel est l'intérêt d'avoir le compilateur gcc sur un serveur Web ? Pourquoi démarrer portmap si aucun service n'a besoin du portmapper ?

Effectuer un nettoyage en règle du système ne permet pas seulement un gain de place. Les réèls interêts sont ailleurs. Supprimer les services inutiles c'est d'abord suprimer le risque que la machine soit compromise grâce à ce service. Même si le service exécuté est exempt de bugs et de failles de sécurité le jour J, il ne le sera peut être pas le jour J+1. Grâce au « banner fingerprinting » (détermination de logiciel et de version grâce aux bannières), les délinquants informatiques scannent massivement des blocs d'adresses à la découverte des services situés sur les machines. Ces services sont ensuite identifiés si possible grâce à leur bannière d'accueil. Ils peuvent ainsi se constituer une base de données des logiciels/versions en fonctionnement sur une des machines données. Si, le jour J+1, une vulnérabilité exploitable est découverte dans version X du logiciel L, il ne reste qu'a rechercher dans la base de données la liste des machines immédiatement vulnérables. Ces machines n'ont alors aucune chance de mettre en place un correctif avant d'être attaqués.

Enfin, supprimer les services inutiles permet une économie de stockage, de RAM et de CPU.

Même si sur les distributions Ubuntu serveur sont très propres à l'installation, il convient de savoir effectuer ce nettoyage. Ce pourra être utile sur d'autres distributions, ou sur des version d'Ubuntu serveur peut être moins abouties.

2.2.2. Dénicher les services

Lorsque l'on cherche des services inutiles sur un système, il est souvent plus simple de regarder quelles sont les socket ouvertes en écoute. Cela ne garantit pas de trouver tous les services (dæmons) qui tournent sur la machine (tous n'ont pas vocation à écouter sur des ports) mais permet d'éliminer les plus importants en premier lieu. On pourra s'attacher à éliminer le reste ensuite.

netstat permet d'afficher la liste des sockets ouvertes sur le système. Nous ne sommes intéressés que par les socket TCP en écoute (LISTEN) et par les sockets UDP. La sortie de netstat sera donc filtrée par un egrep "LISTEN|udp" :

oper@ubuntu:~$ sudo netstat -tunap | egrep "LISTEN|udp"
udp     0      0 0.0.0.0:69      0.0.0.0:*  	 3745/dhclient3                   
oper@ubuntu:~$ 

Le seul démon (réseau) en cours de fonctionnement semble être le client dhcp. Lorsque l'adressage IP sera correctement configuré (Section 2.4.1, « Adressage »), ce démon ne sera plus démarré au boot.

2.2.3. Dénicher les paquetages

Sous Ubuntu serveur, seule une poignée de packages peut être supprimée. Ces packages sont installés grâce au « méta-package » ubuntu-standard. Un méta-package est une package « virtuel » vide, qui, grâce à ses dépendances, implique l'installation (ou la désinstallation) d'autres packages.

Tous les paquetages dont dépend ubuntu-standard sont optionnels. en désinstallant l'un d'entre eux, on forcera aussi la désinstallation du package ubuntu-standard. Réinstaller ce dernier forcera la réinstallation de toutes ses dépendances.

Pour connaître les paquets installés comme dépendance d' ubuntu-standard, on peut faire appel à la commande apt-cache show ubuntu-standard :

oper@ubuntu:~$ apt-cache show ubuntu-standard
Package: ubuntu-standard
Priority: standard
Section: metapackages
Installed-Size: 44
Maintainer: Matt Zimmerman <mdz@ubuntu.com>
Architecture: i386
Source: ubuntu-meta
Version: 1.43
Depends: at, cpio, cron, dmidecode, dnsutils, dosfstools, dselect, ed, fdutils, file, ftp, hdparm, info, inputattach, iptables, iputils-arping, iputils-tracepath,logrotate, lshw, lsof, ltrace, man-db, manpages, memtest86+, mime-support, nano, parted, popularity-contest, ppp, pppconfig, pppoeconf, psmisc, reiserfsprogs, rsync, strace, tcpdump, telnet, time, w3m, wget
Recommends: command-not-found, mtr-tiny, openssh-client, update-manager-core
Filename: pool/main/u/ubuntu-meta/ubuntu-standard_1.43_i386.deb
Size: 17158
MD5Sum: 4b9cfdce3972c9d6e4752d1fc4bd42ff
Description: The Ubuntu standard system
 This package depends on all of the packages in the Ubuntu standard system.
 This set of packages provides a comfortable command-line Unix-like
 environment.
 .
 It is also used to help ensure proper upgrades, so it is recommended that
 it not be removed.
Bugs: mailto:ubuntu-users@lists.ubuntu.com
Origin: Ubuntu
Task: ubuntu-standard

oper@ubuntu:~$

Cette commande renvoie, à la suite du paramètre Depends:, une liste des paquetages dont dépend ubuntu-standard et qui sont supprimables.

Par exemple, si le serveur n'a pas vocation à utiliser ppp ou pppoe, il est possible de supprimer les packages ppp, pppconfig et pppoeconf.

oper@ubuntu:~$ sudo apt-get remove --purge ppp pppconfig pppoeconf
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Reading state information... Fait       
Les paquets suivants seront ENLEVÉS :
  ppp* pppconfig* pppoeconf* ubuntu-standard*
0 mis à jour, 0 nouvellement installés, 4 à enlever et 4 non mis à jour.
Il est nécessaire de prendre 0o dans les archives.
Après dépaquetage, 2339ko d'espace disque seront libérés.
Souhaitez-vous continuer [O/n] ? O
(Lecture de la base de données... 14372 fichiers et répertoires déjà installés.)
Suppression de ubuntu-standard ...
Suppression de pppoeconf ...
Purge des fichiers de configuration de pppoeconf ...
Suppression de pppconfig ...
Purge des fichiers de configuration de pppconfig ...
rmdir: /var/cache/pppconfig: No such file or directory
Suppression de ppp ...
Stopping all PPP connections...done.
Purge des fichiers de configuration de ppp ...
oper@ubuntu:~$ 

On remarquera, au passage, que le package ubuntu-standard est désinstallé comme prévu.