« Tenir compte de la sécurité au quotidien » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
Ligne 99 : Ligne 99 :
# '''Préférez les protocoles cryptés''' (préférez ssh à telnet, scp à ftp, pop+ssl à pop, ...)
# '''Préférez les protocoles cryptés''' (préférez ssh à telnet, scp à ftp, pop+ssl à pop, ...)
# '''N'executez et/ou installez pas n'importe quoi''' (attention aux chevaux de Troie)
# '''N'executez et/ou installez pas n'importe quoi''' (attention aux chevaux de Troie)
# '''Passez root le moins souvent possible''' (root a beaucoup de droits et cela peut se retourner contre vous)
# '''Appliquez le principe du privilège minimum''' (Ne donnez un droit que s'il est nécessaire)
# '''Appliquez le principe du privilège minimum''' (Ne donnez un droit que s'il est nécessaire)
# '''Passez root le moins souvent possible''' (root a beaucoup de droits et cela peut se retourner contre vous)
# '''Minimisez vos services''' (Si c'est inutile alors c'est dangereux)
# '''Mettez votre distribution à jour''' (Appliquez les correctifs de sécurité aussi souvent que possible)
# '''Mettez votre distribution à jour''' (Appliquez les correctifs de sécurité aussi souvent que possible)
# '''Minimisez vos services''' (Si c'est inutile alors c'est dangereux)
# '''Filtrez et surveillez votre traffic réseau''' (Activez le firewall et éventuellement un IDS)
# '''Filtrez et surveillez votre traffic réseau''' (Activez le firewall et éventuellement un IDS)
# '''Gardez un oeil sur vos données''' (Sauvegardez les et utilisez des logiciels comme tripwire)
# '''Gardez un oeil sur vos données''' (Sauvegardez les et utilisez des logiciels comme tripwire)

Version du 24 juillet 2006 à 19:55

Introduction

Un ordinateur n'est jamais en sécurité, quand bien même on croit qu'il l'est. Un dicton informatique dit d'ailleurs que l'ordinateur le plus sûr est celui qui est éteint. Cet article est là pour vous faire découvrir les différents risques que l'on court en ayant un ordinateur connecté à un réseau, ainsi que les bonnes habitudes à prendre afin de sécuriser sa machine personnelle (nous ne parlerons pas de la sécurisation de serveur en production). Enfin nous aborderons les différents moyens d'analyse post-mortem d'une machine après une attaque et comment la nettoyer avant de la remettre en ligne.

Pour tout le document (et de manière générale), il est évidemment conseillé de lire les pages de manuel des commandes avant de poser des questions. Lisez aussi les articles connexes en cliquant sur les hyperliens dans le texte car dans ce document je ne m'étale justement pas sur les sujets pour lesquels il existe déjà un article.

Avant tout, connaître son système

D'abord et avant tout il faut être à l'aise avec les concepts essentiels de Linux. Cela permettra d'une part de mieux connaître et comprendre ce que nous faisons et d'autre part de mieux réagir en cas d'attaque. Donc, documentez vous sur ce système et son langage de commande (shell).Lisez aussi la documentation expliquant ce que sont les daemons et comment ils fonctionnent. Voyez comment fonctionne un réseau, ce que sont les ports réseau, les permissions des fichiers, ce que sont les failles de sécurité des logiciels, etc.

Connaître les risques

La sécurité informatique est un domaine que l'on pourrait séparer en trois parties. La première s'occupe de la sécurité des données, c'est la cryptologie, la plus connue et la plus théorique des trois. La seconde s'occupe de la sécurité des protocoles, elle comprend notamment la sécurité réseau. Enfin, la dernière et la moins connue des trois est la sécurité logicielle, elle s'occupe notamment des failles du genre débordement de tampon (buffer-overflow) et autres (format string, integer overflow, etc).

Dans ce petit survol des risques potentiels en matière de sécurité informatique nous aborderons la sécurité réseau et la sécurité logicielle. La cryptologie ne sera pas abordée car c'est une science très complexe et de toute façon inaccessible au simple utilisateur. Pour finir nous aborderons l'ingénierie sociale qui reste inclassable mais qui est un risque non négligeable.

La sécurité réseau

Le but de la sécurité réseau est de connaître les forces et les faiblesses des protocoles. Du point de vue de l'attaquant, on se posera des questions comme: Comment abuser un firewall ? Comment tirer un maximum d'informations d'un serveur ? Comment aveugler un système de détection d'intrusion ? Du point de vue du défenseur, les questions qui se posent sont surtout comment détecter les comportements réseaux anormaux et empêcher (ou au moins réagir face à) une attaque.

Un certain nombre de mots clefs sont associés à la sécurité réseau. Ainsi on parle de firewalls, d'IDS, d'IPS, de scanneurs réseaux, de sniffeurs et autres. Nous allons ici définir quelques-uns de ces mots.

Firewalls

Pour le définir de manière concise, un firewall (pare-feu) est un filtre réseau qui va pouvoir stopper certains paquets réseau. Suivant le type de trafic qu'ils analysent et à quel niveau ils se placent sur la couche OSI on va parler de plusieurs types de firewalls:

  • Stateless firewall: Ce firewall est le plus basique, il ne fait que regarder les paquets réseau un par un et les accepte ou les rejette uniquement sur la base de son fichier de configuration.
  • Stateful firewall: Aussi appelé connection tracking firewall, ce firewall permet de tirer parti d'une connaissance du protocole (TCP par exemple). Il garde en mémoire les connections qui sont en cours et l'état dans lequel elles sont (en cours d'établissement, établie, en train d'être achevées, etc). L'avantage de ce firewall est qu'il permet une configuration plus fine avec moins de lignes mais son inconvénient est qu'il utilise un peu de mémoire pour chaque connexion et qu'il est susceptible de se faire saturer (Déni de service).
  • Firewall applicatif: Il en existe plusieurs sortes : les proxy, les filtres de contenu (clamav), etc. sont tous des firewalls applicatifs. Contrairement aux firewalls précédents qui résident habituellement dans le noyau, les firewalls applicatifs sont habituellement basés dans l'espace utilisateur. Ces firewalls servent le plus souvent de relais avec éventuellement un contrôle sur le contenu de ce qui transite (quoique le plus souvent les proxy web ne contrôlent pas le contenu des requêtes même s'ils le pourraient).

Sous Linux, le firewall par défaut est Netfilter, il possède la capacité de faire du Stateless et du Stateful pour divers protocoles. Les firewalls applicatifs existent aussi mais ne sont pas gérés par Netfilter. Nous verrons plus loin comment piloter Netfilter à l'aide de iptables.

Scanneur réseau

Un scanneur réseau est simplement un petit logiciel qui tente d'explorer un réseau ou une machine de façon distante (c'est à dire via le réseau). Pour cette exploration le scanneur va tenter de se connecter à une ou plusieurs machines de façon directe ou indirecte. Il faut bien comprendre que le but premier du scanneur de réseau est de collecter de l'information (présence/abscence de services) sur un réseau ou une machine et uniquement cela. L'usage d'un scanneur est par conséquent légal (sauf si vous avez signé une charte qui dit le contraire) mais collecter beaucoup d'informations sur un réseau peut vous rendre suspect aux yeux de ceux qui le gèrent.

Le plus connu des scanneur est sans conteste nmap. Il possède un grand nombre d'options et permet d'extraire beaucoup d'informations sur votre environnement réseau. Pour peu que vous soyez root sur la machine que vous utilisez, vous pouvez tenter le jeu d'options suivant (regardez le manuel pour savoir ce qu'elles font): nmap -F -O -sV <ip_cible>

nmap est bien sûr un scanneur réseau basique, il en existe des bien plus avancés qui utilisent nmap comme brique de base mais qui scannent non plus les services réseau mais les vulnérabilités. On peut ainsi citer nessus qui permet de tester son réseau contre un grand nombre d'attaques.

Lorsqu'un pirate veut s'en prendre à vous, la première chose qu'il fera sera de vous scanner et extraire un maximum d'informations sur votre réseau. Mieux vaut savoir quelles informations vous laissez filtrer à l'extérieur pour connaître vos faiblesses.

Sniffeurs

Un sniffeur est un petit logiciel qui va se mettre à l'écoute de tous les paquets réseau qui passent à la portée de votre ordinateur. Habituellement votre machine ne va considérer que les paquets qui vous sont addressés mais l'on peut pervertir l'usage habituel et faire en sorte que votre machine vous permette d'accéder aussi aux paquets qui ne vous sont pas adressés. On appelle cela le mode promiscuous pour les cartes ethernet et le mode monitor pour les cartes wifi.

Les sniffeurs sont largement utilisés à la fois par les pirates et par les ingénieurs systèmes. Les pirates les utilisent essentiellement pour récupérer des informations sur un réseau ou même plus. En effet, lorsqu'ils ont compromis une machine de votre réseau, il peuvent laisser tourner de façon cachée un de ces sniffeurs qui va collecter des informations qui transitent par la carte réseau de la machine piratée. Par exemple, tous les mots de passe en clair peuvent être récupérés à moindre frais. D'un autre coté, les administrateurs réseaux ont aussi un grand usage des sniffeurs, ils servent le plus souvent de débogueur réseau mais aussi d'espion pour essayer d'identifier des comportements sur le réseau qui ne seraient pas normal ou qui laisseraient supposer à une attaque (voir les IDS plus loin).

Il existe un très grand nombre de sniffeurs réseau, les deux plus connus sont sans doute wireshark (ex-ethereal) et tcpdump. D'autres sont plus spécialisés comme par exemple p0f (sniffeur passif de détection d'OS), dsniff (sniffeur de mots de passe) ou encore kismet (sniffeur wifi).

IDS, IPS et honeypots

Pour finir ce petit tour de la sécurité réseau nous allons faire un tour du coté des armes auxquelles vous avez accès pour vous défendre.

Pour faire court, les IDS (Intrusion Detection Systems) sont des sondes qui espionnent votre réseau et enregistrent les phénomènes bizarres ou qui pourraient ressembler à des attaques potentielles. Le rôle d'un IDS n'est pas de prévenir des attaques mais vraiment de jouer un rôle similaire à celui de la boîte noire d'un avion après une catastrophe afin de savoir ce qui s'est passé et éventuellement collecter des preuves contre les attaquants.

Il y a trois types d'IDS :

  • les IDS réseaux du genre snort qui s'assurent de l'intégrité d'un réseau par une analyse du trafic qu'il y a dessus,
  • les IDS systèmes du genre tripwire qui s'assurent de l'intégrité d'un système en stockant un CRC des principaux fichiers de configuration et des binaires pour s'assurer qu'ils n'ont pas été corrompu,
  • les IDS hybrides qui tentent de rassembler les deux précédents, du genre prelude-IDS.

Les IPS (Intrusion Prevention Systems) sont à peine différents des IDS puisqu'en cas de détection d'une attaque probable, alors que l'IDS se contente d'enregistrer les logs, l'IPS tente de contrer l'attaque en réagissant.

Enfin, les honeypots (pots de miel) sont des simulations de machines faibles. La constatation est simple, les pirates s'attaquent logiquement toujours au point le plus faible de votre réseau. Avoir des points faibles factices et bardés d'alarmes discrètes vous permet non seulement de détourner momentanément les pirates des vraies machines et de les freiner mais aussi de détecter plus facilement les intrus qui se laissent prendre au piège.

Voila, nous avons fait un (très) rapide tour des mots clefs importants en matière de sécurité réseau. Nous allons à présent quitter le réseau et nous intéresser de plus près à ce qui se passe sur vos serveurs et vos machines.

La sécurité logicielle

Lorsque les pirates n'en ont pas après ce qui circule sur votre réseau, c'est qu'ils tentent de pénétrer une (ou plusieurs) machine(s) et c'est là que commence la sécurité logicielle...

Contrairement à ce que vous pourriez croire, la plupart du temps, les attaques que subi votre ordinateur ne sont pas dûes à des humains mais plutôt à des logiciels automatiques. Les failles listées dans la catégorie sécurité logicielle sont donc exploitées le plus souvent par des logiciels malveillants (malware en anglais). Ces logiciels peuvent être des virus, des vers, des chevaux de Troie ou encore des rootkits mais ils ont tous en commun d'exploiter des failles classiques ou de rendre les systèmes sur lesquels ils résident plus faibles face à des attaquants extérieurs. Nous allons ici lister ces malware et tenter d'en donner une définition succinte.

Virii et Vers

Un virus est un petit programme qui a la particularité de se reproduire et de se propager d'un système à l'autre suivant certains vecteurs. Cela peut être les mails ou même l'utilisateur lui-même qui va copier le logiciel sur d'autres systèmes. Les vers sont une sorte particulière de virus qui se propagent uniquement via le réseau Internet (l'un des plus célèbre fut Blaster en 2003 qui visait essentiellement des systèmes Microsoft Windows). Certains virus fonctionnent et infectent les systèmes linux, mais leur nombre est plus réduit que ceux qui attaquent les systèmes Windows. Grâce à la rareté de ces virus et à la réactivité de la communauté libre face aux nouvelles failles découvertes, ce genre de malware ne se propage que très difficilement sur les systèmes Linux, et par conséquent Unix.

Il est à signaler que le terme de virus n'est pas anodin, l'application des patchs de sécurité (l'équivalent d'un vaccin pour reprendre l'analogie biologique) pendant une attaque virale revient réellement à enrayer une épidémie. Ne pas vacciner votre PC pendant une épidémie virale revient presque exactement au même que refuser de vous vacciner contre la grippe en pleine épidémie (avec la différence que la propagation des virii informatiques est environs cent à mille fois plus rapide qu'avec les virii biologiques). Non seulement vous vous exposez au virus mais en plus vous créez un nouveau foyer d'infection qui va permettre au virus de se propager encore un peu plus. Il faut donc être vigilant et appliquer régulièrement les correctifs de sécurité de votre système pour ne pas s'exposer à des virii, qui pourraient alors s'infiltrer facilement via les failles que vous auriez laissé béantes.

Chevaux de Troie

Les chevaux de Troie sont des logiciels qui tentent d'abuser l'utilisateur en se faisant passer pour autre chose que ce qu'ils sont réellement (un jeu, un petit utilitaire, ou encore une commande classique comme ssh, etc). Ces logiciels semblent fonctionner exactement comme ils devraient mais peuvent accomplir des actions malveillantes contre votre système. Par exemple, si la commande login a été remplacée, on pourrait imaginer qu'un login particulier permette de se connecter en root de façon distante en plus de remplir sa tâche normalement. S'il s'agissait de la commande ssh, on pourrait effectuer une sauvegarde de toutes machines, les logins et les machines, les clefs privées, etc qui passent à travers cette commande (et même les envoyer vers un dépot quelque part sur l'Internet). Enfin, on peut imaginer un logiciel de jeu qui tous les vendredi 13 se mette à effacer le contenu de votre compte.

Les chevaux de Troie peuvent être aussi un vecteur de propagation pour les virus comme le célèbre ver "I love you" qui se propageait par mail ou aussi être contenu dans un virus qui va l'installer sur le système qu'il a infecté avant de tenter de se propager vers d'autres systèmes.

Rootkits

Enfin, les rootkits sont des logiciels qui facilitent l'accès réseau discret des pirates sur le système. Leur nom vient du fait qu'ils permettent aux pirates d'accéder au système infecté avec des droits équivalents (ou même supérieurs) au root. À l'origine ces rootkits étaient un ensemble de chevaux de Troie mimant les commandes classiques du système (ps, login, ls, etc). De nos jours, les rootkits sont quasi-essentiellement des kernel-rootkits, c'est à dire qu'ils se branchent directement sur le noyau pour modifier les informations que pourraient lire les utilisateurs du système. Ce dernier type de rootkit permet aux pirates une réelle invisibilité du point de vue des autres utilisateurs (y compris du root). Vous l'aurez compris, ces rootkits sont très difficiles à repérer avec des moyens standards et compromettent très profondément votre système. C'est pour cela qu'il n'est jamais mauvais d'installer et de lancer régulièrement des logiciels du type chkrootkit, qui vérifient la présence de rootkits.

Attention aux mélanges !!!

Évidemment, tout ces malwares peuvent se combiner entre eux pour former des combinaisons souvent difficiles à contrer. On peut citer l'exemple du vers 1i0n (rapport CERT, Mars 2001) qui ciblait essentiellement des failles sur les systèmes Unix faisant tourner un serveur BIND et qui installait le rootkit erkms avant de continuer à se propager. Ce malware combinait à la fois un ver et un rootkit lui-même composé d'un certain nombre de chevaux de Troie.

Ingénierie sociale

Une dernière technique de piratage existe. Et bien qu'elle soit inclassable du point de vue technique, c'est probablement la plus efficace.

Souvent, si le pirate est humain, c'est un insider (quelqu'un de l'intérieur), ou quelqu'un qui peut avoir un accès physique aux machines (stagiaire, agent d'entretient, ou simplement qui connaît votre numéro de téléphone ou votre adresse e-mail). Dans ces conditions, ill aura simplement recours à de l'ingénierie sociale. Cette méthode consiste à profiter de la crédulité des gens qui souvent écrivent leurs mots de passe sur un bout de papier et le laissent à proximité de l'ordinateur. D'autres victimes sont par exemple appelées par téléphone ou contactées via e-mail par l'attaquant, se faisant alors passer pour un service technique quelconque, il prétend avoir besoin de votre mot de passe pour faire des tests.

Cela peut paraître trivial mais c'est la technique qui donne le plus de résultats avec le moins d'investissement en temps et en connaissance. Kevin Mitnick, un des rois du piratage était passé maître dans ce type d'attaques. Il avait un applomb et un génie de l'improvisation allié avec des connaissances techniques hors du commun qui lui ont permis de réaliser des miracles (du mauvais côté de la loi, hélas).

Se prémunir contre ce genre d'attaques est simple.., Ne confiez vos mots de passe à personne et méfiez-vous lorsqu'on vous les demandes.

Les 10 règles d'or en sécurité

Il existe certaines règles qui permettent de se prémunir contre la plupart des attaques. Certaines sont simples et faciles à mettre en oeuvre d'autres sont plus complexes. Voici une liste (non exhaustive) de dix règles à suivre pour sécuriser votre ordinateur. Ces règles sont classées dans un ordre de difficulté croissant. Suivre les règles les plus simples est indispensable alors que les plus complexes permettent de sécuriser un peu plus votre machine mais ne sont pas forcément aussi importantes. Le mieux est de s'arrêter à l'endroit de la liste qui vous semble trop obscur. Une mesure de protection mal configurée étant souvent pire qu'une absence de protection.

  1. Attention à vos mots de passe (choisissez les bien et ne les confiez pas à des inconnu(e)s)
  2. Préférez les protocoles cryptés (préférez ssh à telnet, scp à ftp, pop+ssl à pop, ...)
  3. N'executez et/ou installez pas n'importe quoi (attention aux chevaux de Troie)
  4. Passez root le moins souvent possible (root a beaucoup de droits et cela peut se retourner contre vous)
  5. Appliquez le principe du privilège minimum (Ne donnez un droit que s'il est nécessaire)
  6. Minimisez vos services (Si c'est inutile alors c'est dangereux)
  7. Mettez votre distribution à jour (Appliquez les correctifs de sécurité aussi souvent que possible)
  8. Filtrez et surveillez votre traffic réseau (Activez le firewall et éventuellement un IDS)
  9. Gardez un oeil sur vos données (Sauvegardez les et utilisez des logiciels comme tripwire)
  10. Renforcez votre noyau (Ajoutez des modules de sécurité optionnels: SELinux, ASLR, ...)

Une fois ces dix règles édictées, nous allons creuser celles qui valent la peine de l'être

Un bon mot de passe, c'est quoi ?

Politique de restriction des privilèges

Principe du privilège minimum

Bit setuid, avantages et inconvénients

Utilisation de sudo

Restreindre les failles de votre système

Mise à jour de votre distribution

Fermer les services inutiles

Firewalls et IDS réseaux

Configuration minimale de Netfilter

Configuration minimale de Snort

Sauvegardes et IDS systèmes

Mettre en place un système de sauvegarde

Configuration minimale de Tripwire

Mise en place d'un noyau sécurisé

Juste les grandes lignes et quelques liens vers d'autres pages...

Récupération d'une machine corrompue

Les symptômes

  1. Votre système a un comportement étrange ou inhabituel.
  2. Un des comptes a été utilisé ou des fichiers ont été modifiés à l'insu de son propriétaire légitime.
  3. L'un de vos IDS vous signale une trace très probablement dûe à une attaque (attention aux faux positifs) ou une corruption anormale de votre système de fichiers.
  4. Des outils d'audit révèlent des anomalies sur votre système.

Règles d'urgence

Que faut-il faire avant toute choses ? Comment réagir ? Comment se prémunir d'autres attaques ?

  1. Mettre la machine hors-ligne (débranchez simplement la prise réseaux)
  2. Faites une sauvegarde complète du système sur des supports qui seront mis en lieu sûr (cette image du système servira à l'analyse post-mortem).
  3. Redémarrez à partir d'une image sûre de votre système, restaurez les données. Dans l'idéal, réinstallez complètement votre système (si possible).
  4. Changez tous les mots de passe.
  5. Faire une mise à jour complète de la distribution (installez éventuellement quelques contre-mesure supplémentaires).
  6. Remettez la en ligne

Une fois ceci fait, rien ne vous dis que la ou les failles utilisées par les pirates ont disparues. Il vous faut donc procéder à l'analyse post-mortem de l'image de votre système pour déterminer quelle méthode ont utilisé les pirates pour compromettre votre ordinateur et vérifier que la ou les failles ont bien disparues sur votre système actuel.

Analyse Post-mortem

À qui signaler les intrusions et comment réagir face à la loi ?

Protéger son ordinateur

Sécuriser son boot

Si l'accès physique à la machine est une faille, il faut configurer son bios. Celui-ci ne doit autoriser que le boot sur disque dur, et doit être protégé par mot de passe. Grub permettant d'éditer manuellement le boot (périphérique de démarrage, noyau, options pour l'init...), il est nécessaire de le protéger par mot de passe afin qu'on ne puisse pas modifier les configurations prédéfinies. En fait il est même parfois conseillé de supprimer tout périphérique susceptible d'être source d'insécurité à ce niveau, comme le lecteur de disquettes par exemple. Cela dit, si c'est une station de bureau il vaut mieux garder ce dont on a besoin, cela va sans dire. C'est à vous d'en juger.

De toute manière, un système n'est jamais sûr puisque pour l'exemple présent, il est possible de supprimer le mot de passe du BIOS en réinitialisant celui-ci. Ainsi pour quelqu'un ayant un accès physique à la machine il est facile d'ouvrir le boîtier et de retirer quelques secondes la batterie alimentant le BIOS. La parade consisterait à verrouiller l'accès à l'intérieur de la machine (cadenas).

Pire encore : le BIOS étant de nos jour stocké dans une mémoire accessible en écriture -- généralement de la mémoire flash. Sur les carte-mères plus anciennes le BIOS est stocké dans une ROM. -- ce qui permet potentiellement à quelqu'un de le flasher (le mettre à jour) pour le remplacer par une version vérolée.

Avant de continuer sur le BIOS, voyons un peu comment celui-ci fonctionne et pourquoi il existe :

Immédiatement à la mise sous tension, le BIOS déroule la procédure de POST (Power-On Self Test ou vérification de mise sous tension). Durant cette phase, le BIOS effectue divers contrôles : CPU, autovérification par chiffre de contrôle, contrôle des paramètres BIOS enregistrés (mémoire de "setup"), initialisation de divers composants (horloge, DMA, etc), vérification de la mémoire, des périphériques (claviers, lecteur(s) de disquette, disque(s) dur(s), etc.).

En cas d'erreur, le BIOS tente de continuer ou, en cas d'erreur grave il arrête le système et affiche, si possible, un message d'erreur. Autrement il fait une série de beep pour aider au diagnostic de la panne. Il envoie également un code sur le port série, code qui peut être récupéré par divers moyens.

Immédiatement après le POST, le BIOS va charger le premier secteur du disque amorçable. Ce secteur contient un petit programme de chargement (boot loader) du chargeur du (des) système(s) d'exploitation (grub, lilo ou, pour Windows, NTLDR). Le POST se termine en transférant l'exécution au boot loader.

C'est en fait, à l'origine, la fonctionnalité principale (c'est elle qui a donné son nom au BIOS) du BIOS : fournir une couche logicielle d'abstaction (permettant d'ignorer lors de la programmation les aspects purement matériels) pour les périphériques les plus courants : clavier, écran, lecteur de disquettes, disques durs, souris, etc. On accède à ces fonctions par l'envoi d'interruptions logicielles ou, plus rarement, par accès direct à la mémoire BIOS.

Fort heureusement, linux étant un bon système d'exploitation il n'utilise pas le BIOS, qui sert comme on l'a vu de couche d'abstraction entre le logiciel et le matériel. Le risque d'attaque via le BIOS est donc considéré comme nul. Cependant, il reste techniquement possible -- mais les pirates n'y auraient aucun intérêt -- de flasher le BIOS de telle sorte qu'il ne puisse plus booter l'ordinateur, bloqué dans une boucle infinie.

Partitionnement conséquent

À l'installation du système, il faut bien réfléchir au partitionnement des disques. Les données statiques (binaires, fichiers de configuration, etc.) seront sur une partition montée en lecture seule pour éviter toute modification :

  • /bin
  • /boot
  • /lib
  • /sbin
  • /usr

Eventuellement d'autres dossiers, selon la distribution.

Lorsque l'accès physique à la machine est une faille potentielle de sécurité, il n'est pas une mauvaise idée que de créer une partition dédiée à /etc , qui serait formatée en un système de fichiers chiffré (voir Encrypted root filesystem howto). Dans ce cas-là, même si on démarre l'ordinateur avec un LiveCD il devient impossible à moins d'avoir les identifiants idoïnes d'accéder aux données de la partition.

N'installer que le strict nécessaire

Chaque bout de code est potentiellement une faille. C'est pour cela que moins il y a de logiciels installés, plus le risque d'avoir une faille est réduit. Un exemple courant pour faire comprendre le principe est que sur un serveur il n'est généralement nul besoin de serveur X. Un autre exemple, dans un environnement unix il n'est nul besoin de serveur Samba. Une fois le ménage fait dans votre installation, il faut bien configurer ses logiciels. D'ailleurs pour être certain d'avoir une machine propre, faites l'installation hors-ligne et ne mettez la machine en réseau qu'une fois bien sécurisée, surtout au niveau de Netfilter/iptables.

Utilisateurs

Vérifier que root n'est pas autorisé à se connecter. Utiliser sudo plutôt que le compte root directement pour les tâches d'administration. Evitez par ailleurs d'avoir des comptes inutiles sur votre machine car même s'ils n'ont que des droits restreints, l'utilisation d'une faille par un intrus pour obtenir plus de permissions n'est pas impossible.

Permissions

De manière générale, éviter autant que possible de positionner les droits setuid et setgid d'un éxécutable, qui permettent, en particulier, d'exécuter un programme avec les droits de root alors qu'on est connecté en simple utilisateur.

<cadre>setuid bit droit donné à un fichier exécutable d'utiliser les droits du propriétaire du fichier éxécutable (en général le root).

setgid bit droit donné à un fichier exécutable d'utiliser les droits du groupe propriétaires du fichier éxécutable.</cadre>

Utiliser chroot pour les services et les utilisateurs distants qui doivent avoir un accès restreint à la machine.

Pour plus d'information sur les droits, consulter la documentation de Léa sur les permissions

Bien configurer ses démons

Sécuriser Apache en limitant les accès aux répertoires. On peut pour cela utiliser les fichiers .htaccess ou modifier directement la configuration du serveur, généralement /etc/apache/httpd.conf ou /etc/apache2/apache2.conf .

Utilisez ssh/sshd plutôt que telnet. En effet, ce dernier ne chiffre pas ses flux de données, contrairement à ssh, ce qui permet grâce à un simple sniffeur réseau de voler identifiants et mots de passe via le réseau.

Les serveurs de fichiers (ou apparents) tels Samba, NFS ou encore FTP ne doivent accepter de connexion que des utilisateurs enregistrés : une section est prévue à cet effet dans le fichier de configuration de chaque serveur. Il est préférable de faire ceci, même si les services n'autorisent que les connexions locales et même si l'authentification des utilisateurs est déjà limitée : mieux vaut trop de sécurité que pas assez. Si vous cherchez à faire du transfert de fichiers de manière sécurisée, préférez scp (qui est en fait une manière d'utiliser le protocole ssh).

Si vous utilisez vnc, préférez le faire de manière sécurisée : vnc au-dessus de ssh.

Barrer la route aux connexions non souhaitées

Une fois limité les ports réseau attendant des connexions, il faut mettre en place un firewall filtrant grâce à iptables (ou autre). Netfilter est le nom de la couche du noyau qui permet de filtrer tout ce qui passe par les interfaces réseau, tandis que iptables est une interface permettant de piloter Netfilter. Ne pas confondre, donc. Des articles ont déjà été écrits à ce propos :

De manière très succincte, il faut fermer tous les ports puis ouvrir ceux dont on a besoin : le port 80 (et le 443 pour du https) doit être ouvert si l'on a un serveur web, le port 110 si l'on a un serveur pop dont on veut qu'il soit accessible d'internet, etc.

Voici un bon script de base qu'on peut adapter : #!/bin/sh

  1. firewall v1.0.1 Oct 13 09:48:57 PDT 2003 written by : Kernel <kernel@trustonme.net>
  2. Modifié par merlin8282 (je ne sais plus où j'ai pioché l'original mais il y ressemble encore vraiment beaucoup).
  3. this script is free software according to the GNU General Public License (see [www.gnu.org])
  4. Start/stop/restart/status firewall:

firewall_start() {

echo "[Démarrage du firewall]"

                                                              1. REGLES PAR DEFAUT ###########################

echo "[Initialisation de la table filter]" iptables -F iptables -X

echo "[Politique par défaut de la table filter]"

  1. On ignore tout ce qui entre ou transite par la passerelle

iptables -P INPUT DROP iptables -P FORWARD DROP

  1. On accepte, ce qui sort

iptables -P OUTPUT ACCEPT

  1. Pour éviter les mauvaises suprises, on va autoriser l'accès à la loopback :

iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT

                                                              1. LOCAL-INTERNET ###########################

echo "[On autorise les clients à accéder à internet]"

  1. On créé une nouvelle chaîne, le nom est indifférent
  2. appelons-la "local-internet"

iptables -N local-internet

  1. On définit le profil de ceux qui appartiendront à "local-internet"
  2. "local-internet" concerne toutes les connections sauf celles venant d'internet ( ! = non)
  3. En gros avec ça, vous rendez, vos serveurs inaccessibles depuis internet.
  4. Pas de panique, certains serveurs seront autorisés explicitement dans la suite.
  5. (Remplacer ppp0 en fonction de votre configuration)

iptables -A local-internet -m state --state NEW -i ! ppp0 -j ACCEPT

  1. Evidemment, une fois acceptées comme "local-internet", les connections peuvent continuer
  2. et faire des petits :

iptables -A local-internet -m state --state ESTABLISHED,RELATED -j ACCEPT

  1. On termine en indiquant que les connections appartenant à "local-internet"
  2. accèdent à internet de manière transparente.

iptables -A INPUT -j local-internet iptables -A FORWARD -j local-internet

                                                              1. LES TABLES NAT ET MANGLE #############################

echo "[Initialisation des tables nat et mangle]"

iptables -t nat -F iptables -t nat -X iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT

iptables -t mangle -F iptables -t mangle -X iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P OUTPUT ACCEPT

                                                              1. LE MASQUERADING #########################
  1. Commentez ces 2 lignes, si vous ne faîtes pas du masquerading (nat)
  2. echo "[Mise en place du masquerading]"
  3. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE
                                                      1. ACTIVATION DE LA PASSERELLE ##################
  1. echo "[Activation de la passerelle]"
  2. echo 1 > /proc/sys/net/ipv4/ip_forward
                                                            1. PAS DE SPOOFING ##########################

echo "[Pas de spoofing]" if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then for filtre in /proc/sys/net/ipv4/conf/*/rp_filter do echo 1 > $filtre done fi

                                                    1. PAS DE SYNFLOOD ####################

echo "[Pas de synflood]" if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then echo 1 > /proc/sys/net/ipv4/tcp_syncookies fi

                                                              1. PAS DE PING ############################
  1. commentez ces 6 lignes, si vous autorisez les pings sur votre passerelle

echo "[Pas ping]" echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts if [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] ; then echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses fi

                          1. Priorisation de la bande passante et des connections - QoS ############

echo "[priorisation des connections ssh ...]"; iptables -A PREROUTING -t mangle -p tcp --sport 443 -j TOS --set-tos Minimize-Delay

echo "[priorisation des connections http ...]"; iptables -A PREROUTING -t mangle -p tcp --sport http -j TOS --set-tos Maximize-throughput iptables -A PREROUTING -t mangle -p tcp --sport 3129 -j TOS --set-tos Maximize-throughput

                                                        1. Fonctionnalités serveurs #####################################

echo "[Etude des fonctionalités serveurs, visibles depuis internet]"

  1. A ce stade, tous vos clients du réseau local et de la passerelle ont accès à internet. Mieux,
  2. vos clients du réseau local, ont accès à vos serveurs apache, proftp ... localement. Mais personne
  3. depuis internet ne peux accéder à l'un des serveurs que vous hébergez.
  1. Il est bien-sûr possible de dévérrouiller pontuellement l'accès à un serveur depuis internet,
  2. en décommentant les 2 ou 3 lignes correspondantes.
  1. echo "[autorisation du serveur ssh(22) ...]"
  2. iptables -A INPUT -p tcp --dport ssh -j ACCEPT
  1. echo "[autorisation du serveur smtp(25) ...]"
  2. iptables -A INPUT -p tcp --dport smtp -j ACCEPT
  1. echo "[autorisation du serveur http(80) ...]"
  2. iptables -A INPUT -p tcp --dport www -j ACCEPT
  1. echo "[autorisation du serveur https(443) ...]"
  2. iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  1. echo "[autorisation du serveur DNS(53) ...]"
  2. iptables -A INPUT -p udp --dport domain -j ACCEPT
  3. iptables -A INPUT -p tcp --dport domain -j ACCEPT
  1. echo "[autorisation du serveur irc(6667) ...]"
  2. iptables -A INPUT -p tcp --dport ircd -j ACCEPT
  1. echo "[autorisation du serveur cvs (2401) ...]"
  2. iptables -A INPUT -p tcp --dport cvspserver -j ACCEPT
  1. echo "[autorisation du serveur FTP(21 et 20) ...]"
  2. iptables -A INPUT -p tcp --dport ftp -j ACCEPT
  3. iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT
  1. Ne pas décommenter les 3 lignes qui suivent.
  2. Plus généralement :
  3. echo "[autorisation du serveur Mon_truc(10584) ...]"
  4. iptables -A INPUT -p tcp --dport 10584 -j ACCEPT
  1. echo "[autorisation du serveur aMule (4662/tcp) ...]"
  2. iptables -A INPUT -p tcp --dport 4662 -j ACCEPT
  1. echo "[autorisation du serveur BitTorrent (6881-6889/tcp) ...]"
  2. iptables -A INPUT -p tcp --dport 6881:6889 -j ACCEPT

echo "[firewall activé !]" }

firewall_stop() {


iptables -F iptables -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT

iptables -t nat -F iptables -t nat -X iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT

iptables -t mangle -F iptables -t mangle -X iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P OUTPUT ACCEPT

echo " [firewall descativé!]" }

firewall_restart() { firewall_stop sleep 2 firewall_start }

case "$1" in 'start') firewall_start

'stop') firewall_stop

'restart') firewall_restart

'status') iptables -L iptables -t nat -L iptables -t mangle -L

  • )

echo "Usage: firewall {start|stop|restart|status}" esac Ce script est à mettre généralement dans un fichier du dossier /etc/init.d/ .

Détecter les intrusions, connaître les outils

who

La commande who ou w permet de voir les utilisateurs actuellement connectés (loggés) au système. Attention cependant car un agresseur peut être -- et l'est certainement si c'est le cas -- connecté sous votre nom, s'il est parvenu à s'immiscer dans votre système.

ps

La commande ps liste tous les processus actuellement en cours d'exécution sur le système. S'il en est un que vous ne connaissez pas, identifiez-le. Si vous ne savez toujours pas ce que c'est, pas d'affollement : utilisez la commande lsof et voyez si vous trouvez des fichiers en rapport avec ce processus. Vous pouvez alors identifier le processus et déterminer si c'est un processus "inoffensif". Si ce n'est pas le cas, vous pouvez supprimer les fichiers qu'il faut. Attention toutefois à bien être certain que ce soit un logiciel malveillant que vous supprimez ! En revanche, si c'est un logiciel qui s'est fait infecter (par exemple apache) il suffit de réinstaller celui-ci, après avoir vidé le cache des paquets de votre gestionnaire de packages. Vérifiez aussi la configuration après réinstallation. Nul besoin de redémarrer, sauf si évidemment c'est le noyau qui est corrompu, chose qui est à mon avis très rare.

netstat

La commande netstat est une commande qui liste toutes les connexions réseau actives sur votre machine ainsi que l'état dans lequel elles sont (listening, connected, established, etc.) : Proto Recv-Q Send-Q Adresse locale Adresse distante Etat tcp 0 0 0.0.0.0:3129 0.0.0.0:* LISTEN tcp6 0 0  :::443  :::* LISTEN On voit ici par exemple que le port 3129 écoute (LISTEN) sur la machine locale (0.0.0.0) et que le port 443 en fait de même. Vérifiez les connexions actives, les ports ouverts, et faites le lien avec vos démons et autres programmes qui tournent. Si un port ne vous dit rien, informez-vous.

lsof

La commande lsof liste tous les fichiers ouverts actuellement. Elle indique aussi quel utilisateur utilise quel fichier. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root mem REG 3,65 31432 1720343 /sbin/init apache2 597 root mem REG 3,65 385484 25423 /usr/sbin/apache2 Les informations parlent d'elle-mêmes. Ce sont deux cas précis parce-que le processus init a le fichier /sbin/init d'ouvert (de même pour apache).

fcheck

C'est un utilitaire qui notifie l'administrateur en cas de modification de fichiers. On précise dans le fichier de configuration quels fichiers ou dossiers on veut surveiller et un mail est envoyé en cas de changement.

logcheck

logcheck est un outil qui scrute les logs, en fait un résumé et envoie un courriel à l'administrateur (généralement root en local) régulièrement. Evidemment, il est possible de configurer le niveau de ce qui est rapporté.

chkrootkit

C'est un logiciel important, puisqu'il détecte la présence de rootkits. Son principe de fonctionnement est l'écoute des ports réseau. Relativement souvent, cependant, des logiciels tels les clients peer2peer sont détectés comme une menace, bien qu'ils soient innofensifs. En effet, ils utilisent des ports qui ne sont pas "officiellement" connus (contrairement au port 80, par exemple, qui est celui de tout serveur web). Donc pas d'affollement.

Localiser le problème et nettoyer

Grâce aux outils précédents il est plus ou moins facile de localiser d'où vient le problème. On peut alors agir en conséquence, à savoir tuer les processus incriminés et supprimer les logiciels correspondants. Au préalable on peut aussi, si l'on est curieux, regarder ce qu'a fait l'attaquant : il a certainement laissé des traces que l'on peut examiner pour mieux comprendre.

L'intrus ayant pu avoir les droits root il serait de bon augure de réinstaller proprement -- en ayant pris soin de vider le cache de son gestionnaire de paquets -- les outils permettant la découverte de logiciels non souhaités, comme chkrootkit. Ceci fait un scan complet de tous les disques doit être fait. Prenez soin de monter toutes les partitions avant de lancer le scan. Veillez aussi à vérifier le partitionnement de vos disques, au cas où l'attaquant aurait créé une partition dans le but d'avoir un endroit de stockage de ses outils malveillants que l'administrateur de la machine -- vous-même -- ne verrait pas. Eh oui, il faut penser à toutes les éventualités ! Je pense qu'il vaut mieux être trop paranoïaque que pas assez, lorsqu'on administre un serveur.

Lors de la possible compromission de la machine, il faut considérer les commandes sensibles (ps, top, who...) comme compromises. Un LiveCD peut dans le cadre d'une machine personnelle vous fournir une base de commandes saines. Dans le cadre d'une machine en production (serveur) qui ne doit souffrir de l'arrêt des services, un jeu de commandes compilées (avec librairie statique) sur un support extérieur (CD, clef USB...) peut être nécessaire.

Voir aussi

Conclusion

Même si l'on connaît les risques, il est toujours impératif de rester sur ses gardes. De nouvelles menaces apparaissent régulièrement, de nouvelles failles sont découvertes chaque jour, de nouveaux virus aussi, etc. L'avenir nous dira si un jour on aura des ordinateurs sûrs à 100%, chose qui n'est pas impossible mais cependant improbable.

Remerciements

Un grand merci à abgech pour sa contribution à la partie concernant le BIOS,
Merci à oudoubah, pour ses idées et son expérience,
Merci à Morgan pour l'aide qu'il m'a apporté pour restructurer l'article, ainsi que pour ses idées et ses critiques également.
Merci à Fleury pour avoir contribué grandement à l'article (sécurité réseau et sécurité logicielle, ainsi qu'une certaine restructuration de l'article)
Merci enfin à Léa d'être là pour le logiciel libre !

Copyright

© 2006 Merlin8282, Fleury

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike iconCreative Commons Noncommercial
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique, Contexte non commercial 2.0 :
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/