Chapitre 4. Sécurité sous Linux

Table des matières

4.1. Masquage et pare-feux
4.2. SSH : sécurisation des opérations réseau
4.3. Codage des partitions et des fichiers
4.4. Confinement des privilèges avec AppArmor
4.5. Sécurité et confidentialité

Résumé

Le masquage et un pare-feu garantissent le contrôle du flux et de l'échange de données. La fonctionnalité SSH (Secure SHell) permet de se loguer à des hôtes distants via une connexion codée. Le chiffrement de fichiers spécifiques ou de la totalité des partitions protège vos données si un tiers parvient à accéder à votre système. Aussi, ce chapitre propose des informations sur les aspects de la sécurité sur les réseaux Linux, en plus d'instructions d'ordre technique.


4.1. Masquage et pare-feux

Lorsque Linux est utilisé dans un environnement réseau, vous pouvez utiliser des fonctions de kernel qui permettent de manipuler les paquets réseau afin de maintenir une séparation entre les secteurs interne et externe du réseau. L'infrastructure Linux Netfilter permet d'établir un pare-feu efficace qui isole les différents réseaux. Vous pouvez contrôler avec précision les paquets autorisés à franchir une interface réseau à l'aide d'iptables, structure de table générique qui permet de définir des ensembles de règles. Vous pouvez définir assez facilement ce type de filtre de paquets à l'aide de SUSEfirewall2 et du module YaST correspondant.

4.1.1. Filtrage des paquets avec iptables

Les composants netfilter et iptables sont chargés de filtrer et de manipuler les paquets réseau et sont également chargés de la traduction des adresses réseau (NAT - Network Address Translation). Les critères de filtrage et toute action associée sont stockés dans des chaînes, qui doivent être mises en correspondance les unes après les autres par chaque paquet réseau entrant. Les chaînes à mettre en correspondance sont stockées dans des tables. La commande iptables permet de modifier ces tables et ces ensembles de règles.

Le kernel Linux gère trois tables, chacune correspondant à une catégorie spécifique de fonctions du filtre de paquets :

filtre

Cette table comprend la plupart des règles de filtrage puisqu'elle implémente le mécanisme de filtrage des paquets au sens le plus strict, qui détermine par exemple si les paquets sont admis (ACCEPT) ou rejetés (DROP).

nat

Cette table définit toutes les modifications apportées aux adresses source et cible des paquets. Ces fonctions permettent également d'implémenter le masquage, qui correspond à un cas particulier de NAT utilisé pour relier un réseau privé à Internet.

troncation

Les règles contenues dans cette table permettent de manipuler les valeurs stockées dans les en-têtes IP (telles que le type de service).

Figure 4.1. iptables : les chemins possibles d'un paquet

iptables : les chemins possibles d'un paquet

Ces tables contiennent plusieurs chaînes prédéfinies à mettre en correspondance avec les paquets :

PRÉ-ROUTAGE

Cette chaîne concerne les paquets entrants.

ENTRÉE

Cette chaîne concerne les paquets destinés aux processus internes du système.

SUIVANT

Cette chaîne concerne les paquets qui sont uniquement routés via le système.

SORTIE

Cette chaîne concerne les paquets provenant du système lui-même.

POST-ROUTAGE

Cette chaîne concerne tous les paquets sortants.

La Figure 4.1, « iptables : les chemins possibles d'un paquet » illustre les chemins que peut emprunter un paquet réseau sur un système donné. Pour plus de clarté, cette figure regroupe les tables en chaînes, mais en réalité, ces chaînes sont conservées dans les tables mêmes.

Dans le cas le plus simple, un paquet entrant destiné au système arrive sur l'interface eth0. Le paquet est d'abord transmis à la chaîne PREROUTING de la table mangle, puis à la chaîne PREROUTING de la table nat. L'étape suivante, concernant le routage du paquet, indique que la cible réelle du paquet est un processus du système. Après être passé par les chaînes INPUT des tables mangle et filter, le paquet atteint finalement sa cible, à condition que les règles de la table filter coïncident réellement.

4.1.2. Principes de base du masquage

Le masquage est la forme de traduction d'adresses réseau (NAT) propre à Linux. Il permet de relier un petit réseau local, où les hôtes utilisent des adresses IP de la plage privée (reportez-vous à la Section 18.1.2, « Masques réseau et routage »), à Internet (où des adresses IP officielles sont utilisées). Pour que les hôtes du réseau local soient en mesure de se connecter à Internet, leurs adresses privées sont converties en adresses officielles. Cette opération s'effectue sur le routeur, qui tient le rôle de passerelle entre le réseau local et Internet. Le principe sous-jacent est simple : le routeur possède plusieurs interfaces réseau, généralement une carte réseau et une interface distincte d'accès à Internet. Tandis que cette dernière relie le routeur au monde extérieur, une ou plusieurs autres interfaces le relient aux hôtes du réseau local. Ces hôtes du réseau local étant connectés à la carte réseau (eth0 par exemple) du routeur, ils peuvent envoyer tous les paquets non destinés au réseau local à leur routeur ou leur passerelle par défaut.

[Important]utilisation du masque réseau approprié

Lorsque vous configurez votre réseau, vérifiez que l'adresse de diffusion et le masque réseau sont bien les mêmes pour tous les hôtes locaux. Si ce n'est pas le cas, les paquets ne peuvent pas être routés correctement.

Comme indiqué précédemment, lorsque l'un des hôtes du réseau local envoie un paquet destiné à une adresse Internet, il est orienté vers le routeur par défaut. Toutefois, le routeur doit être configuré pour pouvoir transmettre ces paquets. Pour des raisons de sécurité, SUSE Linux n'active pas cette fonction dans une installation par défaut. Pour l'activer, définissez la variable IP_FORWARD du fichier /etc/sysconfig/sysctl sur IP_FORWARD=yes.

L'hôte cible de la connexion voit votre routeur mais ne sait rien sur l'hôte de votre réseau interne d'où proviennent les paquets. Cette technique porte le nom de masquage. En raison de la traduction d'adresses, le routeur est la première destination de tout paquet de réponses. Il doit identifier ces paquets entrants et traduire leurs adresses cible, pour que les paquets puissent être transmis à l'hôte approprié dans le réseau local.

Le routage du trafic entrant dépend de la table de masquage. Il n'est donc pas possible d'ouvrir une connexion depuis l'extérieur vers un hôte interne. Il n'y aurait pas d'entrée dans la table pour ce type de connexion. Une connexion établie possède ainsi un état particulier dans cette table, de manière à ce que cet élément ne puisse pas être utilisé par une autre connexion.

Par conséquent, vous risquez de rencontrer des problèmes avec certains protocoles d'application, tels que ICQ, cucme, IRC (DCC, CTCP) et FTP (en mode PORT). Net­scape, le programme FTP standard et bien d'autres utilisent le mode PASV. Ce mode passif pose bien moins de problèmes en matière de filtrage de paquets et de masquage.

4.1.3. Principes de base du pare-feu

Le terme pare-feu est probablement le plus utilisé pour décrire un mécanisme qui fournit et gère une liaison entre deux réseaux tout en contrôlant les flux de données circulant entre eux. En réalité, le mécanisme décrit à la présente section est un filtre de paquets. Il régule le flux de données en fonction de certains critères, tels que les protocoles, les ports et les adresses IP. Vous pouvez ainsi bloquer les paquets qui, selon leur adresse, ne sont pas censés atteindre votre réseau. Pour autoriser l'accès public à votre serveur Web, par exemple, vous devez ouvrir explicitement le port correspondant. Toutefois, un filtre de paquets n'analyse pas le contenu des paquets dont l'adresse est légitime (comme ceux qui sont destinés à votre serveur Web). Par exemple, si des paquets entrants ont pour objectif de mettre en péril un programme CGI sur votre serveur Web, le filtre de paquets les laisse tout de même passer.

Il existe un mécanisme plus efficace, mais également plus complexe, qui associe plusieurs types de systèmes, comme l'interaction d'un filtre de paquets avec le proxy ou la passerelle applicative. Dans ce cas, le filtre de paquets rejette tous les paquets destinés aux ports désactivés. Seuls les paquets destinés à la passerelle applicative sont acceptés. Cette passerelle ou ce proxy prétend être le client réel du serveur. D'une certaine manière, ce type de proxy peut être considéré comme un hôte de masquage au niveau du protocole utilisé par l'application. Squid, qui est un serveur proxy HTTP, correspond à ce type de proxy. Pour utiliser Squid, le navigateur doit être configuré pour communiquer via le proxy. Les pages HTTP demandées sont remises depuis le cache du proxy et les pages introuvables dans le cache sont extraites d'Internet par le proxy. Autre exemple, la suite proxy de SUSE (proxy-suite) fournit un proxy pour le protocole FTP.

La section suivante est consacrée au filtre de paquets fourni avec SUSE Linux. Pour plus d'informations sur le filtrage de paquets et l'utilisation d'un pare-feu, reportez-vous au Firewall HOWTO (Guide pratique) inclus dans le paquetage howto. Lisez-le à l'aide de la commande less /usr/share/doc/howto/en/txt/Firewall-HOWTO.gz si ce paquetage est installé.

4.1.4. SUSEfirewall2

SUSEfirewall2 est un script qui lit l'ensemble de variables dans /etc/sysconfig/SuSEfirewall2 pour générer un ensemble de règles iptables. Il détermine trois zones de sécurité, même si seules les deux premières sont prises en compte dans l'exemple de configuration suivant :

Zone externe

L'hôte doit se protéger du réseau externe puisqu'il n'a aucun moyen de savoir ce qui s'y passe. Généralement, ce réseau externe est Internet mais il peut s'agir d'un réseau non protégé, comme un réseau WLAN.

Zone interne

Il s'agit du réseau privé, généralement le réseau local. Si les hôtes de ce réseau utilisent des adresses IP de la plage privée (reportez-vous à la Section 18.1.2, « Masques réseau et routage »), activez la traduction d'adresses réseau (NAT) pour que les hôtes du réseau interne puissent accéder au réseau externe.

Zone démilitarisée (DMZ)

Les hôtes situés dans cette zone peuvent être joints depuis le réseau externe et le réseau interne mais ne peuvent pas accéder au réseau interne. Vous pouvez utiliser ce paramètre pour installer une ligne de défense supplémentaire devant le réseau interne, puisque les systèmes DMZ sont isolés de ce réseau.

iptables supprime tout type de trafic réseau non explicitement autorisé par l'ensemble de règles de filtrage. Par conséquent, chaque interface associée à un trafic entrant doit être placée dans l'une de ces trois zones. Définissez les services ou protocoles autorisés pour chacune des zones. L'ensemble de règles s'applique uniquement aux paquets provenant d'hôtes distants. Le pare-feu ne filtre pas les paquets générés localement.

Vous pouvez effectuer la configuration via YaST (reportez-vous à Section 4.1.4.1, « Configuration avec YaST »). Vous pouvez également l'effectuer manuellement dans le fichier /etc/sysconfig/SuSEfirewall2, qui contient des commentaires détaillés. En outre, vous trouverez quelques exemples de scénario dans /usr/share/doc/packages/SuSEfirewall2/EXAMPLES.

4.1.4.1. Configuration avec YaST

[Important]configuration automatique du pare-feu

Une fois l'installation terminée, YaST démarre automatiquement un pare-feu sur toutes les interfaces configurées. Si un serveur est configuré et activé sur le système, YaST peut modifier la configuration de pare-feu générée automatiquement à l'aide des options Ouvrir le pare-feu pour l'interface sélectionnée ou Ouvrir port dans pare-feu dans les modules de configuration du serveur. Certaines boîtes de dialogue du module du serveur comportent un bouton Détails du pare-feu qui permet d'activer des ports et des services supplémentaires. Vous pouvez utiliser le module de configuration du pare-feu YaST pour activer, désactiver ou reconfigurer le pare-feu.

Pour la configuration graphique, vous pouvez accéder aux boîtes de dialogue YaST à partir du centre de contrôle YaST. Sélectionnez Sécurité et Utilisateurs+Pare-feu. La configuration est divisée en sept sections auxquelles vous accédez directement à partir de la structure de l'arborescence située à gauche.

Démarrage

Cette boîte de dialogue permet de définir le comportement au démarrage. Dans une installation par défaut, SUSEfirewall2 démarre automatiquement. Vous pouvez également démarrer et arrêter le pare-feu ici. Pour implémenter les nouveaux paramètres dans un pare-feu en cours d'exécution, utilisez Enregistrer les paramètres et redémarrer le pare-feu maintenant.

Figure 4.2. Configuration YaST du pare-feu

Configuration YaST du pare-feu
Interfaces

Toutes les interfaces réseau connues sont listées ici. Pour supprimer une interface d'une zone, sélectionnez-la, cliquez sur Changer, puis choisissez Aucune zone assignée. Pour ajouter une interface à une zone, sélectionnez-la, cliquez sur Changer, puis choisissez l'une des zones disponibles. Pour créer une interface spéciale avec vos propres paramètres, utilisez Personnaliser.

Services autorisés

Cette option permet d'offrir des services à partir de votre système à une zone vis-à-vis de laquelle il est protégé. Par défaut, le système est uniquement protégé des zones externes. Autorisez explicitement les services auxquels les hôtes externes doivent pouvoir accéder. Activez ces services après avoir sélectionné la zone souhaitée dans Services autorisés pour la zone sélectionnée.

Masquage

Le masquage permet de cacher votre réseau interne des réseaux externes, comme Internet. Il permet aussi aux hôtes du réseau interne d'accéder au réseau externe en toute transparence. Les requêtes du réseau externe vers le réseau interne sont bloquées alors que les requêtes du réseau interne semblent être émises par le serveur de masquage lorsqu'elles sont vues à l'extérieur. Si des services spéciaux d'une machine interne doivent être disponibles pour le réseau externe, ajoutez des règles spéciales de réacheminement pour le service correspondant.

Diffusion générale (Broadcast)

Cette boîte de dialogue permet de configurer les ports UDP qui permettent les diffusions. Ajoutez les numéros ou services de port nécessaires à la zone correspondante en les séparant par un espace. Reportez-vous également au fichier /etc/services.

Cette boîte de dialogue permet également d'activer la journalisation des diffusions générales non autorisées. Cela risque d'être problématique car les hôtes Windows utilisent les diffusions générales pour obtenir des informations les uns sur les autres et génèrent donc de nombreux paquets non autorisés.

Support IPsec

Cette boîte de dialogue permet de déterminer si le service IPsec doit être disponible depuis le réseau externe. Déterminez les paquets de confiance sous Détails.

Niveau de journalisation

Il existe deux règles de journalisation : les paquets autorisés et les paquets non autorisés. Les paquets non autorisés sont ABANDONNÉS ou REJETÉS. Pour ces deux règles, sélectionnez Tout journaliser, Ne journaliser que ce qui est critique ou Ne rien journaliser.

Une fois la configuration du pare-feu terminée, cliquez sur Suivant pour quitter cette boîte de dialogue. Vous obtenez alors un résumé par zone de la configuration du pare-feu. Il permet de vérifier tous les paramètres. Ce résumé dresse la liste de tous les services, ports et protocoles qui ont été autorisés. Pour modifier la configuration, cliquez sur Retour. Pour l'enregistrer, cliquez sur Accepter.

4.1.4.2. Configuration manuelle

Les paragraphes suivants fournissent des instructions détaillées pour une configuration réussie. Pour chaque élément de configuration, nous indiquons s'il concerne le pare-feu ou le masquage. Les aspects relatifs à la zone démilitarisée (DMZ) mentionnés dans le fichier de configuration ne sont pas abordés ici. En effet, ils s'appliquent uniquement à des infrastructures réseau plus complexes que l'on trouve dans les grandes sociétés (réseaux d'entreprise), qui nécessitent une configuration de grande envergure et des connaissances approfondies sur le sujet.

Activez d'abord SUSEfirewall2 pour votre niveau d'exécution (probablement 3 ou 5) à l'aide du module de YaST Services système (niveau d'exécution). Il crée les liens symboliques pour les scripts SUSEfirewall2_* dans les répertoires /etc/init.d/rc?.d/.

FW_DEV_EXT (pare-feu, masquage)

Il s'agit du périphérique connecté à Internet. Pour une connexion par modem, saisissez ppp0. Pour une connexion RNIS, utilisez ippp0. Les connexions DSL utilisent dsl0. Indiquez auto pour utiliser l'interface qui correspond à la route par défaut.

FW_DEV_INT (pare-feu, masquage)

Il s'agit du périphérique connecté au réseau interne privé (par exemple, eth0). Laissez ce champ vide s'il n'existe aucun réseau interne et si le pare-feu protège uniquement l'hôte sur lequel il est exécuté.

FW_ROUTE (pare-feu, masquage)

Si vous avez besoin du masquage, vous devez indiquer yes ici. Vos hôtes internes ne sont pas visibles de l'extérieur puisque leurs adresses réseau privées (192.168.x.x, par exemple) sont ignorées par les routeurs Internet.

Pour un pare-feu sans masquage, indiquez yes uniquement si vous souhaitez autoriser l'accès au réseau interne. Dans ce cas, vos hôtes internes doivent utiliser des adresses IP officiellement enregistrées. Mais normalement, vous ne devez pas autoriser l'accès à votre réseau interne depuis l'extérieur.

FW_MASQUERADE (masquage)

Si vous avez besoin du masquage, vous devez indiquer yes ici. Les hôtes internes disposent ainsi d'une connexion quasiment directe à Internet. Pour plus de sécurité, il est préférable d'installer un serveur proxy entre les hôtes du réseau interne et Internet. Le masquage n'est pas nécessaire pour les services fournis par un serveur proxy.

FW_MASQ_NETS (masquage)

Indiquez les hôtes ou les réseaux à masquer, en les séparant par un espace. Par exemple :

FW_MASQ_NETS="192.168.0.0/24 192.168.10.1"
FW_PROTECT_FROM_INT (pare-feu)

Indiquez yes si vous souhaitez protéger l'hôte utilisé comme pare-feu contre les tentatives d'attaque en provenance du réseau interne. Pour que les services soient accessibles depuis le réseau interne, vous devez les autoriser explicitement. Reportez-vous également à FW_SERVICES_INT_TCP et à FW_SERVICES_INT_UDP.

FW_SERVICES_EXT_TCP (pare-feu)

Indiquez les ports TCP que vous souhaitez rendre disponibles. Laissez ce champ vide s'il s'agit d'un ordinateur personnel qui n'offre aucun service.

FW_SERVICES_EXT_UDP (pare-feu)

Laissez ce champ vide sauf si vous exécutez un service UDP que vous souhaitez rendre accessible de l'extérieur. Parmi les services qui utilisent UDP figurent les serveurs DNS, IPSec, TFTP, DHCP, etc. Dans ce cas, saisissez les ports UDP à utiliser.

FW_SERVICES_INT_TCP (pare-feu)

Cette variable permet de définir les services disponibles depuis le réseau interne. La notation est identique à celle employée pour FW_SERVICES_EXT_TCP, mais les paramètres s'appliquent au réseau interne. Vous ne devez paramétrer cette variable que si FW_PROTECT_FROM_INT a pour valeur yes.

FW_SERVICES_INT_UDP (pare-feu)

Reportez-vous à FW_SERVICES_INT_TCP.

Une fois le pare-feu configuré, testez votre configuration. Pour créer les ensembles de règles du pare-feu, entrez SUSEfirewall2 start en tant qu'utilisateur root. Ensuite, vous pouvez utiliser telnet, par exemple, à partir d'un hôte externe, pour vérifier si la connexion est effectivement refusée. Vous pouvez alors consulter le fichier /var/log/messages, qui doit comporter un message semblable à celui-ci :


Mar 15 13:21:38 linux kernel: SFW2-INext-DROP-DEFLT IN=eth0 
OUT= MAC=00:80:c8:94:c3:e7:00:a0:c9:4d:27:56:08:00 SRC=192.168.10.0 
DST=192.168.10.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=15330 DF PROTO=TCP 
SPT=48091 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0 
OPT (020405B40402080A061AFEBC0000000001030300)

Parmi les autres paquetages disponibles pour tester la configuration de votre pare-feu, citons nmap ou nessus. Vous trouverez la documentation relative à nmap dans /usr/share/doc/packages/nmap et la documentation relative à nessus dans le répertoire /usr/share/doc/packages/nessus-core, après avoir installé le paquetage correspondant.

4.1.5. Pour plus d'informations

Vous trouverez les informations les plus récentes et la documentation sur le paquetage SUSEfirewall2 dans /usr/share/doc/packages/SuSEfirewall2. La page d'accueil des projets netfilter et iptables (http://www.netfilter.org) comporte de nombreux documents, traduits dans plusieurs langues.