Sécuriser un système Linux fraîchement installé

Gazette Linux n°105 — Août 2004

Clément Le Guyadec

Adaptation française  

Article paru dans le n°105 de la Gazette Linux d'août 2004.

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Introduction
Installer et configurer un pare-feu efficace
Mettre à jour les paquets installés
Arrêter et inactiver tous les services inutiles
Localiser et supprimer/modifier tous les SUID/SGID inutiles
Logwatch et Tripwire
Remarques finales
Liens
Note sur l'article du mois dernier
À propos de l'auteur

Introduction

Du point de vue d'un professionnel de la sécurité informatique, un grand nombre de distributions classiques de Linux sont — dans leur configuration initiale — mal sécurisées et la plupart des paquets fournis sont dépassés au moment de l'installation. La sécurité de l'ordinateur et des données de chaque utilisateur étant une priorité, il existe un certain nombre d'étapes à réaliser lors de l'installation afin de s'assurer de l'intégrité de son système et d'identifier les risques potentiels.

Ces étapes sont listées ci-dessous et chacune d'elle est développée plus en détail par la suite :

  1. Installation et configuration d'un pare-feu efficace

  2. Mise à jour (automatique) des paquets installés

  3. Arrêt et inactivation de tous les services inutiles

  4. Localisation et suppression/modification des SUID/SGID inutiles

  5. Logwatch et Tripwire

Installer et configurer un pare-feu efficace

Un pare-feu efficace et correctement configuré est non-seulement la première ligne de défense d'un ordinateur mais aussi, la plus importante. Un pirate informatique incapable de franchir votre pare-feu ne sera pas en mesure d'exploiter les failles potentielles des logiciels fonctionnant sur votre système.

Le pare-feu devrait être activé avant la première connection de votre nouveau système Linux à internet. Il doit être configuré de manière à bloquer toutes les connections entrantes à l'exception de celles CHOISIES ou en RELATION avec celles choisies. Cela va permettre d'assurer une protection maximale pendant que vous mènerez à bien les autres étapes de sécurisation. Une fois ces dernières effectuées, vous pourrez de nouveau configurer votre pare-feu mais cette fois-ci, comme vous le souhaitez.

Je présente les concepts de bases d'iptables, le pare-feu inclus par défaut dans le noyaux Linux, et je donne quelques exemples de configurations pour divers scénarios dans « Firewalling with netfilter/iptables » disponible dans le n°103 de la Gazette. Je vous conseille donc fortement la lecture de cet article afin de mener à bien cette étape.

Mettre à jour les paquets installés

Une distribution Linux standard peut contenir plus de 1000 paquets. Au moment ou vous installerez votre système la plupart de ces paquets seront disponibles dans une version supérieure. La majorité de ces mises à jour correspondent à des améliorations ou des corrections de bugs mais, certaines corrigent des défauts de sécurité pouvant se révéler sérieux. S'assurer que tous les paquets installés le sont dans leur dernière version est un travail qui ne doit pas être fait uniquement lors de l'installation mais de manière régulière tout au long de l'utilisation du nouveau système. Cette tâche peut prendre un certain temps, heureusement il existe bon nombre d'utilitaires capables de la réaliser automatiquement. Les plus utilisés sont APT (Advanced Package Tool) et YUM (Yellowdog Updater, Modified).

Certaines distributions fournissent leur propre utilitaire et dans, ce cas, il peut sembler plus pratique de simplement l'installer et de l'utiliser tel quel. Par exemple, les distributions RedHat et Fedora contiennent up2date et Debian utilise APT par défaut. Si vous désirez en installer un par vous-même, je vous recommande APT qui peut être utilisé avec n'importe quelle distribution basée sur des paquets de type RPM. Vous aurez alors besoin d'un dépôt source d'où APT pourra télécharger les nouveaux paquets ainsi que les mises à jour de votre distribution afin de les installer. Une recherche rapide sur internet avec le nom de votre distribution et « apt » ou « apt-get » devrait vous permettre de localiser les dépôts nécessaires. Des liens pratiques ainsi que des adresses de dépôts sont disponibles à la fin de cet article.

Une fois qu'APT est installé et que les dépôts sources sont paramétrés (habituellement dans /etc/apt/sources.list ou approchant), son utilisation est triviale et n'implique que deux commandes (à exécuter en tant qu'administrateur) :

$ apt-get update
$ apt-get upgrade

La première permet de télécharger les dernières informations sur la version des paquets disponibles dans le dépôt et la seconde est utilisée pour télécharger et installer, si nécessaire, les nouvelles versions des paquets présents sur le système. Ces deux commandes doivent être exécutées de manière régulière afin de maintenir le système à jour.

Pour assurer une sécurité maximale, utilisez si possibles les dépôts officiels de votre distribution, c'est-à-dire, ceux contenant des paquets signés numériquement. Pour ce faire, l'utilitaire de mise à jour fourni par votre distribution est un bon moyen. Lorsque vous téléchargez vous-même des paquets depuis internet, essayez toujours d'utiliser md5sum (c.f. man md5sum). Un MD5SUM est un « résumé » du paquet, la plupart des sites de téléchargement publient les MD5SUMs des fichiers disponibles. La comparaison entre le MD5SUM téléchargé et celui généré depuis le paquet téléchargé permet de s'assurer que le fichier n'est pas contaminé (par un trojan par exemple). Pour finir, je ne peux que vous conseiller de vous inscrire à la mailing liste de sécurité de votre distribution. Il s'agit généralement de liste de diffusion à faible volume et vous serez informé par e-mail lorsqu'un nouveau paquet réparant une faille de sécurité est disponible.

Arrêter et inactiver tous les services inutiles

Dans la majorité des distributions de Linux fraîchement installées, un certain nombre de services/démons sont configurés par défaut pour se lancer à chaque démarrage du système. On peut par exemple citer l'HTTP (serveur internet), POP3/IMAP (e-mail), un serveur de base de données, etc. Une bonne partie de ces services ne seront d'aucune utilité à l'utilisateur lambda et représentent autant de failles potentielles pour des pirates malveillants souhaitant infiltrer votre ordinateur. Vous devrez donc dresser la liste de ces services afin de désactiver ceux qui ne vous sont pas utiles.

Les distributions grand publique de Linux disposent souvent d'une applications graphique permettant de configurer ces services. Essayez de regarder dans le menu configuration ou système de votre bureau pour vérifier si une telle application est disponible. Sur les systèmes RedHat, l'utilitaire en ligne de commande utilisé pour configurer ces services est appelé chkconfig. Pour lister le statut courant de tous les services installés, il faut exécuter (en tant qu'administrateur) :

$ chkconfig --list

Cette commande devrait générer quelque chose comme :

iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
sendmail        0:off   1:off   2:on    3:on    4:on    5:on    6:off
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
 ...             ...     ...     ...     ...     ...     ...     ...
 ...             ...     ...     ...     ...     ...     ...     ...
smb             0:off   1:off   2:off   3:off   4:off   5:off   6:off
squid           0:off   1:off   2:off   3:off   4:off   5:off   6:off
xinetd based services:
        chargen-udp:    off
        rsync:          off
        chargen:        off
          ...           ...
          ...           ...
        sgi_fam:        on

Les nombres (de 0 à 6) qui précédent les colonnes représentent le « niveau d'exécution », 3 ou 5 généralement. Si votre système démarre en mode console (pas d'interface graphique) le niveau d'exécution est 3 tandis que s'il démarre de manière graphique, le niveau est 5. Pour activer un service (squid) à un niveau d'exécution de 2,3,4 et 5 on exécutera (en mode administrateur) la commande suivante :

$ chkconfig --level 2345 squid on

et pour l'inactiver (sshd) au niveau 3 et 5 on exécutera (en mode administrateur) :

$ chkconfig --level 35 sshd off

Si vous ne savez pas quelle tâche effectue un service particulier qui est activé, essayez de faire une recherche internet ou d'utiliser la commande man avec le nom du service comme mot clé (man -k). Certain utilitaires graphiques donnent une brève explication des services actifs. La commande chkconfig va activer/inactiver le service lors du prochain démarrage de l'ordinateur. Cependant, elle n'aura aucun effet sur l'activité courante de ce dernier (il ne sera pas activé ou inactivé sur le moment). Dans le cas d'un système RedHat, on utilise la commande service de la manière suivante pour lancer ou arrêter des services :

$ service service_name start
$ service service_name stop
$ service service_name restart
$ service service_name status

service_name est le nom du service tel que rapporté par chkconfig --list. Vous pouvez lancer la commande netstat -l après avoir désactivé tous les services inutiles pour vous assurer que vous les avez bien tous vus (cette commande vérifie quels sockets sont à l'écoute pour des connections). Dans le cas des services que vous avez maintenus, vérifiez qu'ils sont correctement configurés dans le pare-feu.

Localiser et supprimer/modifier tous les SUID/SGID inutiles

Un programme SUID (set user ID) ou SGID (set group ID) est un programme permettant à l'utilisateur de l'utiliser avec des droits élevés. L'exécutable passwd est un exemple typique. Il permet, entre autre, à un utilisateur ordinaire de changer sont identifiant ou son mot de passe. Cependant, les mots de passes sont enregistrés dans un fichier qui ne peut être modifié (et quelque fois lu) que par l'administrateur système et, de ce fait, les utilisateurs ne devraient pas être en mesure de changer leur mot de passe. Les droits sur cet exécutable sont les suivants :

-r-s--x--x  1 root root 18992 Jun  6  2003 /usr/bin/passwd

Comme vous pouvez le constater, le droit d'exécution de l'utilisateur est fixé à « S » en lieu et place de l'habituel « X »', ce qui transforme l'exécutable en SUID; c'est-à-dire, que lorsqu'un simple utilisateur exécute la commande passwd, l'utilitaire se lancera avec les droits d'exécution du propriétaire de l'exécutable soit dans ce cas, l'administrateur système.

Un grand nombre d'exécutables SUID/SGID sont nécessaires, comme passwd cité ci-dessus. Cependant beaucoup d'autres ne le sont pas. Les programmes SUID/SGID peuvent être exploités à des fins malveillantes par un utilisateur local pour obtenir des droits élevés sur le système. Lancer la commande suivante en tant qu'administrateur pour trouver tous ces programmes :

find / \( -perm -4000 -o -perm -2000 \)

ou, pour obtenir une liste plus détaillée :

find / \( -perm -4000 -o -perm -2000 \) -exec ls -ldb {} \;

Il faut alors analyser cette liste d'exécutables appartenant à l'administrateur ou à son groupe et essayer de la réduire au stricte minimum. Pour ce faire, il faut supprimer les SUID/SGID inutiles ou modifier les droits sur ces fichiers.

Les paquets contenant des SUID/SGID exécutables qu'il y a peut de chance que vous utilisiez peuvent être supprimés. Il faut tous d'abord rechercher ces paquets à l'aide de la commande rpm -q --whatprovides /usr/sbin/kppp puis, les supprimer avec rpm -e package-name.

Les droits SUID/SGID peuvent être supprimés en utilisant par exemple la commande chmod -s /usr/sbin/kppp. Seul l'administrateur peut alors exécuter le programme.

Logwatch et Tripwire

Bien que l'on fasse tous notre possible, la réalité est telle que peut importe nos efforts, notre système ne sera jamais sécurisé à 100%. Plutôt que de se voiler la face en priant pour éviter le pire, il y a quelques petites choses supplémentaires que l'on peut mettre en place pour s'assurer que l'on saura si et quand la sécurité de notre ordinateur a été compromise.

L'un des logiciels de détection d'intrusion souvent sous-estimé et sous-utilisé est Tripwire (http://www.tripwire.org/). Ce logiciel analyse de manière périodique les fichiers système afin de vérifier s'ils n'ont pas été modifiés. Si des modifications anormales sont relevées par Tripwire ce dernier génère un rapport pour vous permettre d'agir. Installer et configurer correctement Tripwire prend un peu de temps mais le jeu en vaut la chandelle. Tripwire m'a permis d'identifier une intrusion sur l'un des serveur dont j'avais la charge il y a quelques années de ça. Son installation et sa configuration seront l'objet de mon article le mois prochain.

Une source d'information inestimable sur ce qu'il se passe dans les tréfonds de votre ordinateur sont les fichiers de log (généralement situés dans /var/log). Toutes les connections sur un système Linux son gérées par le démon syslogd et son fichier de configuration /etc/syslog.conf.

Ce fichier de configuration spécifie les sources d'enregistrement des messages système (les démons cron ou mail par exemple), quel niveau de message surveiller (debuggage, information, avertissement, etc) et quoi faire de ces messages (les ajouter au fichier de log, les imprimer, etc). Si vous souhaitez changer la configuration par défaut, de nombreuses informations sont disponibles dans divers pages du man (syslogd(8), syslog.conf(5), syslog(2), syslog(3) et plus encore).

Syslog permet aussi les connexions à distance ; vous pouvez donc placer votre fichier de log sur un réseau différent. L'avantage est que si votre système est compromis par quelqu'un, il ne sera par en mesure d'effacer ses traces ce qui rendra l'attaque plus facile à identifier et à retracer. Malheureusement, il y a beaucoup trop d'information dans les différents fichiers de log pour permettre à un utilisateur moyen d'assimiler et d'analyser chaque jours toutes ces données. C'est pour cette raison que l'on se penche sur Logwatch. Logwatch (http://www.logwatch.org/), d'après la description de ses auteurs, analyse sur une période définie par l'utilisateur les fichiers de log et fourni un rapport aussi détaillé que souhaité sur les domaines voulus.

Logwatch est inclus dans la plupart des distributions standards et il génère par défaut un rapport journalier qui est ensuite envoyé par mail à l'administrateur système. Généralement brefs, ces rapports peuvent être lus chaque jours. Ils mettent en avant — en fonction de la configuration — des informations telles que les tentatives de connexion échouées, les connexions réseaux de certains démons comme SSHD ou encore les scans de ports dont la machine a été victime. Le fichier de configuration est classiquement situé dans /etc/log.d/conf/logwatch.con. Il est parfaitement documenté et contient de nombreux commentaires destinés à vous aidez.

Il existe bon nombre d'autre système de détection d'intrusion que vous souhaiteriez peut-être découvrir comme par exemple, Snorthttp://www.snort.org/, vous les trouverez facilement à l'aide d'une simple recherche sur internet.

Remarques finales

La sécurité n'est pas quelque chose que l'on prend en compte à l'installation pour ensuite la ranger dans un coin ; la sécurité doit être présente à chaque instant dans votre esprit, maintenir votre système à jour, s'assurer que les mots de passe sont en suretés, gérer les accès à la machines, analyser les fichiers de log et les rapports de Tripwire, etc. Un vieux dictons bien connu s'applique parfaitement à la sécurité informatique : « une chaîne est aussi forte que son maillon le plus faible ». Il suffit d'un instant d'inattention de votre part pour gâcher tous vos efforts et ouvrir une faille dans votre système.

Cette article couvre les bases — les procédures importantes que tout un chacun doit connaître et appliquer. Evidement, il est toujours possible de faire plus cependant, chacun doit peser le pour et le contre en terme de temps et d'effort investi.

Quelques conseils supplémentaires pour la fin :

  • N'utilisez jamais le telnet, ftp, ou tout autre moyen de connexion à distance impliquant de taper en texte clair un mot de passe et un identifiant utilisateur. Utilisez toujours des protocoles de type ssh ou sftp.

  • Utilisez des mots de passes/identifiants différents pour les connexions en clair (http) et en crypté (https) sur internet. Par dessus tous, n'utilisez jamais le même mot de passe sur internet et sur votre système.

  • Employez toujours une politique de pare-feu restrictive; bloquez toutes les connections par défaut et n'autorisez que celles dont vous avez besoin. Par exemple, si vous devez utiliser ssh sur votre ordinateur depuis votre travail, n'autorisez que l'adresse IP de votre ordinateur de bureau et aucune autre.

Liens

APT

Autres utilitaires de sécurité

  • http://www.bastille-linux.org/ — Bastille tente de « fortifier » et « renforcer » les O/S Linux. Il réalise la plus-parts des tâches citées ci-dessus et plus encore.

  • http://www.lids.org/ — The Linux Intrusion Defense System est un patch pour le noyau et un outils d'administration qui améliore la sécurité du noyau en implémentant le Mandatory Access Control.

  • http://www.chkrootkit.orgchkrootkit est un outil pour chercher en local la présence de rootkit (outils utilisé par les hackers pour obtenir des droits sur le système).

  • http://www.nessus.org/ — Un puissant et gratuit scanner de faille en ligne; un scanner de faille est un logiciel qui va scanner une machine distante et indiquer les failles potentielles de sécurité.

Note sur l'article du mois dernier

Thomas Adam a révéler un conflit potentiel dans mon article du mois dernier (Automatic Backups with rsync and Anacron, Linux Gazette n°104). Dans cet article le fichier crontabs contenait les informations suivantes :

00 02 * * * rsync -r -e ssh --delete /home/username/mail
username@mycomputer.mycompany.com:/backups/mail
...

Thomas m'a informé à juste titre que « cela pourrait causer quelques problèmes si une instance de type vérification ntp était en cours, puisque la tâche se lance à précisément 02 :00 et pourrait interférer avec l'horloge. Rsync étant planifier dans cron, cela pourrait provoquer son lancement multiple ou encore, son non lancement. De fait, il serait plus interessant de décaler l'heure d'execution de quelques minutes. »

Merci d'avoir permis de déceler ce problème. Et, comme d'habitude, j'apprécie tous les retours, compliments ou critiques. Vous trouverez mon e-mail en cliquant sur mon nom en début d'article.

À propos de l'auteur

Barry O'Donovan

Barry O'Donovan est diplômé de la National University of Ireland (Galway), avec un B.Sc. (Hons) en informatique et en mathématiques. Il prépare actuellement une thèse d'informatique avec le Information Hiding Laboratory, au University College Dublin (Irlande) dans le secteur du marquage numérique audio.

Barry utilise Linux depuis 1997 et son choix actuel va à Fedora Core. Il est membre du Irish Linux Users Group. Lorsqu'il ne travaille pas à sa thèse, on peut le voir faire un peu de Open Hosting, au pub avec ses amis ou faire de la course dans le parc de sa ville.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.