Copyright © 2003 Cezary M. Kruk
Cet article a été traduit du polonais vers l'anglais par l'auteur. L'original sera publié dans le numéro d'été de CHIP Special Linux.
Chaque fois qu'une nouvelle version de votre distribution préférée sort, vous êtes toujours confronté au même dilemme : faut-il tout installer ex nihilo, tenter de mettre à jour le système ou continuer à utiliser ce à quoi vous êtes habitué ?
Prenons en considération deux possibilités extrêmes : d'une part, installer et configurer le système en partant de zéro vous permet de découvrir et d'utiliser toutes ses nouvelles propriétés ; d'autre part, rester avec votre installation vous donne la certitude de pouvoir poursuivre vos occupations sans problème. Ce à quoi vous êtes confronté est une opposition classique entre innovation et stabilisation.
La configuration de base du système ne présente aucune difficulté. Toutefois, plus vos besoins augmentent, plus vous devez fournir d'efforts. Est-il possible de simplifier l'installation et la configuration d'un système pour le faire plus aisément ? Une base complète et bien conçue contenant les informations sur les changements que vous avez apportés, fonctionnant avec les versions précédentes du système facilite grandement le réglage de la nouvelle. Cette méthode n'est pas beaucoup plus compliquée lorsque vous collectez des données, mais exige plus de travail lorsque vous restaurez la configuration. Comment l'automatiser et la simplifier ?
Heureusement, Linux enregistre les informations sur la configuration de chaque service individuellement dans les fichiers texte. De plus, il vous offre quantité d'excellents outils pour traiter de tels fichiers. Ceci devrait donc être suffisant pour préparer les scripts appropriés et les utiliser lorsque vous devez réinstaller le système.
Cet article décrit deux groupes de scripts : le premier sert à installer et à supprimer des paquetages individuels, et le second à le sécuriser pour prévenir une attaque potentielle. Ces deux outils sont conçus pour Linux Slackware. Les outils destinés à installer et à supprimer des paquetages ne sont pas aussi sophistiqués que les programmes provenant des paquetages SlackPkg ou Packware, mais ils vous offrent en revanche le contrôle total sur le système. La même remarque s'applique aux scripts prévus pour sécuriser le système : ils n'effectuent que des opérations élémentaires. Nous avons rassemblé ces deux catégories d'outils dans le groupe slack*more.
En l'utilisant comme modèle, vous pouvez préparer d'autres outils pour automatiser le processus de configuration de n'importe quel service ou programme. Si vous décidez de ne régler le système manuellement en aucune façon, mais au contraire de compléter le script approprié par la procédure consécutive, vous obtiendrez rapidement votre propre jeu de programmes pour configurer le système. De surcroît, comme vous préparez vous-même ces scripts, ils correspondront parfaitement à vos besoins.
Nous l'avons étudié en l'utilisant comme un exemple de Linux Slackware car cette distribution, par nature, fait intervenir l'utilisateur avec les fichiers de configuration directement. D'autres variantes de Linux, offrant des programmes complexes dans ce but, séparent l'utilisateur des fichiers contenant les informations sur la configuration. Par conséquent, les programmes les rendent paresseux ou les obligent à mener des investigations sophistiquées pour établir ce qui a été réellement changé dans leur système et où, par ces programmes soit-disant conviviaux.
Slack*more est divisé en deux parties. L'archive INSTALL.tgz contient les outils d'installation, de suppression ou de mise à jour des programmes l'archive SECURE.tgz - regroupe les outils de sécurisation préliminaire du système.
Figure 1. Le script SCRIPT.sh du répertoire ./Slackware-9.0 permet de générer un groupe de listes de paquetages claires à partir des groupes individuels. La figure montre la liste des paquetages provenant du groupe « d » (développement).
Les composants les plus importants du paquetage INSTALL.tgz sont le script INSTALL.sh et le répertoire ./Slackware-9.0 contenant le script SCRIPT.sh et le fichier Slackware.
Pour initialiser ces outils, vous devez monter la version d'installation de Slackware dans le répertoire /mnt/cdrom, puis exécuter SCRIPT.sh depuis le répertoire ./Slackware-9.0. Le script explorera les répertoires présents sur le CD-ROM et, guidé par les fichiers de description présents, créera les fichiers contenant des informations sur les paquetages (voir figure 1). Chaque fichier portera le nom correspondant à celui du groupe donné. Par exemple, dans le fichier « e » qui répertorie les paquetages associés à Emacs, vous trouverez entre autres les lignes suivantes :
emacs: ADD emacs-misc: REC emacs-nox: OPT |
Les utilisateurs qui connaissent Linux Slackware savent que la catégorie ADD désigne les paquetages essentiels pour utiliser le programme donné, la catégorie REC regroupe les paquetages recommandés et la catégorie OPT les paquetages optionnels.
Avec ces informations fondamentales sur les paquetages, vous êtes en mesure de décider quels composants vous souhaitez installer et lesquels vous sont inutiles. Donc, si vous modifiez le contenu du fichier « e » mentionné ci-dessus de la manière suivante :
emacs: ADD #emacs-misc: REC !emacs-nox: OPT |
le paquetage emacs sera censé être installé, le paquetage emacs-misc sera ignoré et le paquetage emacs-nox sera non seulement ignoré, mais également - s'il était prélablement installé - supprimé.
Le fichier Slackware provenant du répertoire ./Slackware-9.0 contient des informations sur les groupes individuels des paquetages :
a ap d e f ... |
En se basant sur ce fichier, le script décidera quels groupes de paquetages doivent être pris en compte. Si vous personnalisez ce fichier de la manière suivante :
a ap #d !e f ... |
le groupe « d » sera ignoré et chaque paquetage provenant du groupe « e » installé précédemment sur le système sera supprimé.
Par conséquent : si vous faites précéder le nom du paquetage ou le nom du groupe d'un signe « # », ils seront ignorés ; si vous faites précéder ces noms d'un signe « ! », les composants correspondants seront supprimés du système. Si un paquetage ou un groupe de paquetages n'a pas encore été installé, la signification des signes « # » et « ! » est équivalente. Les lignes issues des fichiers qui décrivent les noms des groupes ont priorité sur celles des fichiers contenant les noms des paquetages. Donc, si vous décidez d'ignorer le groupe complet ou de supprimer les paquetages qui lui appartiennent, le script le fera sans tenir compte des informations contenues dans les fichiers regroupant les noms des paquetages individuels.
Lorsque vous avez préparé le fichier Slackware et les fichiers contenant les informations sur les paquetages individuels, vous pouvez exécuter le script INSTALL.sh. Ce dernier ajoutera ou supprimera les composants correspondants du système. Lorsqu'il s'agit d'une installation préliminaire de Slackware et que le système n'a pas encore été affiné de façon appropriée, il est judicieux d'optimiser le fonctionnement du disque dur utilisé comme plate-forme pour la nouvelle distribution. Pour ce faire, vous pouvez utiliser un des scripts INSTALL.hda ou INSTALL.hdb. Ainsi, le processus d'installation ou de suppression des paquetages sera plus rapide.
INSTALL.sh a été conçu pour de multiples utilisations. S'il n'y a rien à faire, il ne fera rien. Ce script permet aussi d'effectuer l'installation de base de Slackware. Il suffit d'installer les paquetages du groupe « a » d'abord, à l'aide du programme de configuration de Slackware, puis d'ajouter le script au système, de commenter les noms des paquetages ou des groupes dont vous n'avez pas besoin et d'installer le reste en appelant INSTALL.sh.
Le répertoire ./Packages comporte un autre script, SCRIPT.sh. Si vous montez le CD-ROM Slackware et exécutez ledit script, il créera la structure des répertoires contenant les fichiers, ainsi que des informations sur les paquetages individuels du système. Une telle base de données de référence sur les paquetages est pratique car vous n'avez pas besoin de monter le disque d'installation chaque fois que vous souhaitez vérifier à quoi sert le paquetage sélectionné. La construction d'une telle base n'est envisageable que si vous n'avez pas décidé d'installer la Linux Slackware complète. Sinon, vous trouverez les informations sur tous ses paquetages dans le répertoire /var/log/packages.
Le répertoire ./Patches contient deux scripts. Pour les exécuter, exécutez 0.check en premier lieu. Il ira contrôler sur le serveur de sunsite.lcm.edu.pl s'il y a une mise à jour disponible pour Slackware 9.0 ; il créera le fichier Packages.html qui contient les informations sur les mises à jour et le fichier Packages.txt répertoriant les noms des paquetages :
mutt-1.4.1i-i386-1 sendmail-8.12.9-i386-1 sendmail-cf-8.12.9-noarch-1 |
Le script 1.get utilisera le dernier fichier pour obtenir les paquetages, les fichiers .txt appropriés et les fichiers .tgz.asc. Comme ce script utilise pour ce faire la commande wget -c -t0, il n'y a aucun risque de télécharger les mêmes fichiers plusieurs fois. Par ailleurs, la vérification qu'un fichier donné est déjà téléchargé prend du temps : il peut alors s'avérer plus avantageux d'examiner le fichier Packages.txt avant de démarrer 1.get et d'en supprimer les noms des paquetages que vous avez déjà ou qui ne vous intéressent pas. Mais ce n'est pas nécessaire.
Vous pouvez changer la commande pour récupérer les fichiers avec wget -c -t0 -b. Tous les fichiers seront alors téléchargés sur le serveur en même temps - en tâche de fond. Cependant, tous les serveurs ne vous autorisent pas à établir un tel nombre de connexions simultanées. Si le serveur de sunsite.lcm.edu.pl ne convient pas à vos besoins, enregistrez un autre hôte dans les scripts 0.check et 1.get. Il vous faudra alors personnaliser le contenu de la commande de manière appropriée en générant le fichier Packages.txt depuis le fichier Packages.html. Au départ, il s'agit de la commande :
cat Packages.html | grep ".tgz.asc" | sed 's/.tgz.asc//g' | sed \ 's/.*A HREF="//' | sed 's/">.*//' > Packages.txt
Le script 1.get n'enregistre les informations que pour les paquetages standard. Les énormes blocs des mises à jour de Slackware sont placés dans des répertoires séparés (kde, kdei, etc.). Pour les récupérer, vous devrez le faire manuellement ou modifier le script original à votre convenance.
Dans le répertoire ./usr/local/bin vous trouverez le script catpkg qui facilite l'inventaire des fichiers disponibles dans le répertoire /var/log/packages pour obtenir les informations sur tous les paquetages installés sur le système. INSTALL.sh copie le contenu intégral de ./usr/local/bin dans son équivalent à l'échelle du système. Vous pouvez donc, au cours de l'installation initiale du système, y insérer différents scripts que vous aimeriez utiliser.
Figure 2. Le script SECURE.sh élimine les bits SUID et SGID des fichiers sélectionnés et affiche les informations à ce propos.
Le script principal de l'archive SECURE.tgz est SECURE.sh. Il effectue les tâches suivantes :
Initialise la variable PASS_MAX_DAYS dans le fichier /etc/logins.defs à 182. Ainsi, la période de validité des mots de passe des nouveaux utilisateurs sera limitée à 6 mois.
Initialise la variable HISTFILESIZE dans le fichier /etc/profile à 100. Ainsi, le fichier d'historique des commandes sera limité à 100 lignes.
Initialise la variable TMOUT du fichier /root/.bashrc à 900. Ainsi, toute session non active de root sera tuée au bout de 15 minutes.
Commente tous les services réseau non commentés, mais potentiellement dangereux dans le fichier /etc/inetd.conf.
Place la ligne ALL: ALL@ALL dans /etc/hosts.deny, pour bloquer tous les accès extérieurs à la machine.
Place la ligne ALL: ALL@127.0.0.1 : ALLOW dans /etc/hosts.allow donnant accès aux ressources de la machine locale.
Change la séquence order hosts, bind dans le fichier /etc/host.conf en la séquence plus sécurisée order bind, hosts et ajoute la séquence nospoof on.
Bloque l'accès root dans le fichier /etc/securetty à toutes les consoles, sauf à /dev/tty1.
Supprime du fichier /etc/group les groupes news et uucp, superflus dans la plupart des cas. Cela équivaut à indiquer des commandes groupdel news et groupdel uucp.
Supprime du fichier /etc/passwd les utilisateurs news, uucp, operator, sync et shutdown. Cela équivaut à la séquence de commandes consécutives userdel, en admettant les paramètres appropriés.
Effectue les actions parallèles en référence au fichier /etc/shadow.
Commente la ligne commençant par ca::ctrlaltdel:/sbin/shutdown dans le fichier /etc/inittab. Ainsi, le raccourci Ctrl+Alt+Suppr cesse de provoquer le réamorçage de la machine.
Supprime les droits d'exécution et de lecture des scripts provenant de /etc/rc.d pour le groupe ou d'autres utilisateurs.
Ajoute quelques commandes au fichier /etc/rc.d/rc.local pour démarrer ou arrêter différents services. Pour que ces commandes fonctionnent, ajoutez le module IP: TCP syncookie support à votre noyau.
Teste une douzaine de programmes potentiellement dangereux et en élimine le bit SUID. Ces informations de modification sont enregistrées dans le fichier journal (voir figure 2).
Effectue le même genre d'action sur une douzaine de programmes environ, en en éliminant les bits SUID et SGID.
Place dans le fichier de configuration /etc/mail/sendmail.cf les lignes O PrivacyOptions=noexpn et OPrivacyOptions=novrfy. Cela empêche le système de contrôler les comptes depuis une machine distante.
Copie le script remove dans /etc/cron.daily. Ce dernier sert à supprimer automatiquement différents répertoires et fichiers temporaires du système.
Copie quelques scripts utiles dans /root/bin.
Ces actions augmentent significativement la sécurité du système, même s'il ne s'agit que d'un début de protection contre un piratage éventuel. Le script SECURE.sh a été écrit de manière à pouvoir être exécuté maintes fois. Vous pouvez donc y ajouter n'importe quelle procédure et l'appliquer sans aucun problème.
Le script modifie différents services, mais ne les surcharge pas. Pour relire /etc/inetd.conf, utilisez la commande killall -HIP inetd. Pour exécuter le nouveau /etc/inittab, exécutez la commande init q. Pour redémarrer sendmail, il s'agit de la commande /etc/rc.d/rc.sendmail restart ou kill-HUP `head -1 /var/run/sendmail.pid`.
Vous pouvez inclure ces commandes dans le script, mais cela induit un risque potentiel qu'il faut prendre en considération. Si vous faites une petite erreur dans l'appel du programme sed, vous pouvez vous retrouver avec un fichier vide au lieu du fichier /etc/inittab modifié. En conséquence, après le réamorçage de l'init, vous perdrez tout accès au système et serez obligé de restaurer /etc/inittab depuis la copie, en utilisant un autre système Linux installé sur une autre partition ou un autre disque. Ce n'est pas toujours agréable, en particulier si vous n'avez pas d'autre partition dotée de Linux.
Figure 3. La liste des fichiers de taille volumineuse. Comme vous le voyez, les fichiers de la suite OpenOffice.org installée dans le répertoire /opt et les fichiers de RealPlayer et Pingus prennent ici beaucoup de place.
Le script TEST-SECURE.sh cherche dans le système certains types de fichiers :
Les fichiers ayant les bits SUID et SGID définis.
Les fichiers volumineux et anciens (les fichiers de plus de 1 Mo, modifiés ou utilisés pour la dernière fois depuis trois mois, voire plus).
Exclusivement les fichiers volumineux.
Les fichiers sans aucune association avec un utilisateur ou un groupe existant dans le système.
Les informations concernant chaque catégorie des fichiers sont enregistrées dans le fichier journal séparé. De plus, TEST-SECURE.sh utilise les résultats du travail du script SECURE.sh en montrant le contenu du fichier journal des données, avec les informations sur les programmes sans les bits SUID ou SGID.
Comme vous n'êtes pas censé toujours effectuer tous ces tests à la fois, vous trouverez les scripts 1.suid, 2.huge+old, 3.huge et 4.nobody dans le répertoire /root/bin - chacun d'eux n'exécute qu'un test particulier.
Il est utile d'étendre le script SECURE.sh à d'autres procédures qui seront responsables de la configuration et de l'installation des protections supplémentaires. En suivant les procédures utilisées dans le script, vous serez capable de mettre au point les prochains scripts pour peaufiner d'autres services : la configuration des comptes des utilisateurs, l'initialisation des services et clients de réseau, de courrier électronique et WWW, l'environnement X Window, etc. La seule limitation est celle de votre imagination, car Linux vous permet de gérer presque tout de cette manière. Donc, lorsque vous en aurez fini avec la création de ces scripts, vous pourrez configurer votre système entier exactement selon vos besoins, en appuyant juste quelques fois la touche Entrée.
Slack*more : freshmeat.net/projects/slackmore
SlackPkg : freshmeat.net/projects/slackpkg
Paquetages (site polonais) : hacking.pl/packware.php
Cezary vit à Wroclaw (Pologne). Il est rédacteur pour le trimestriel polonais CHIP Special Linux.
Copyright © 2003, Cezary M. Kruk.
Copying license http://www.linuxgazette.com/copying.html
Paru dans le n°91 de la Linux Gazette de juin 2003.
Traduction française par Isabelle Hurbain <isabelle POINT hurbain CHEZ free POINT fr>.
Relecture de la traduction française par Joëlle Cornavin <jcornavi CHEZ club-internet POINT fr>.