La sécurité réseau externe

Introduction

En se reliant à Internet, on ouvre sa machine, ou son réseau, au monde entier. Linux est fait pour la communication. La majorité des distributions installent en standard de nombreux services, sans se soucier des problèmes de sécurité que cela peut engendrer. C'est donc à l'utilisateur, ou à l'administrateur, qu'incombe la charge de protéger efficacement sa machine contre les attaques extérieures. Cet article s'articule autour de trois axes visant à améliorer la sécurité :

1. Le premier consiste à limiter les informations concernant le système et, plus généralement, le réseau, qu'une personne extérieure pourrait acquérir. On présentera les risques de certains services et les manières d'y remédier.

2. Le deuxième est de faire un état des lieux des services extérieurs indispensables et de faire en sorte que ceux-ci soient parfaitement configurés et utilisent des logiciels à jour. Nous analyserons quelques vulnérabilités classiques.

3. Le dernier axe concerne la protection et la surveillance du système. Nous verrons quelques outils libres permettant de mettre en place des solutions de sécurité.

Eviter de renseigner les crackers

Afin de faciliter son attaque, un cracker va essayer de glaner des informations sur le système ou le réseau visé. Toute information peut être pertinente : les adresses IP et noms des machines du réseau, des routeurs, les noms des utilisateurs, les services actifs, les versions des logiciels et du système d'exploitation, les relations d'approbation entre machines, etc. Nous allons passer en revue un certain nombre de services qui peuvent conduire à des "fuites" d'informations.

Les "petits" services TCP/IP

Plusieurs services permettent de renseigner à distance sur l'état du système : systat, netstat, finger donneront des informations sur, respectivement, les processus en cours d'exécution (équivalent d'un ps), les sockets ouvertes sur le système (équivalent de netstat) et sur les utilisateurs ayant une session ouverte sur le système (équivalent de who).

En considérant qu'un cracker souhaite attaquer un système de nom "victime.net", un simple "telnet victime.net systat" ou "telnet victime.net netstat" lui suffira pour récupérer des informations sur ce système. Le service finger est beaucoup plus dangereux car il permet au cracker de récupérer des informations sur les utilisateurs. Un "finger @victime.net" affichera la liste des utilisateurs (noms de login) connectés :

finger @victime.net
[victime.net]

Login	Name		Tty	Idle	Login Time	Office		Office Phone
pink	Pink Pachiderm	*p0	Oct 26	08:32		(:0.0)
toto	Oto RAINBAM	p9	3d	Sept 27		14:26 (gnr)

Un finger "toto@victime.net" renseignera encore plus précisément sur l'utilisateur toto, qu'il soit connecté ou pas :

finger toto@victime.net

Login: toto	Name: Oto RAINBAM
Directory: /home/toto	Shell: /bin/csh
Office: 01 10 10 10 10	Home Phone: 90 90 90 90 19

Last login Wed Oct 20 11:59 (CEST) on tty2
New mail received Wed Oct 11 09:40 2000 (CEST)
	Unread since Thu Sep 9 15:40 1999 (CEST)
No Plan.

Il n'est pas rare que certains systèmes possèdent des comptes avec des mots de passe triviaux : par exemple le même mot pour le login et le mot de passe, ou le nom pour le login et le prénom pour le mot de passe, etc. Le service finger est alors un réel danger puisqu'il peut permettre à un cracker d'en savoir assez sur les utilisateurs pour espérer acquérir un accès sur le système.

Ces services doivent alors être systématiquement désactivés dans le cadre d'une connexion à Internet. Cela se réalise facilement en éditant le fichier /etc/inetd.conf et en commentant les lignes destinées à ces services :

# Finger, systat and netstat give out user information which may be
# valuable to potential "system crackers."  Many sites choose to disable
# some or all of these services to improve security.
#
#finger	stream	tcp	nowait	root	/usr/sbin/tcpd	in.fingerd
#cfinger stream	tcp	nowait	root	/usr/sbin/tcpd	in.cfingerd
#systat	stream	tcp	nowait	guest	/usr/sbin/tcpd	/bin/ps	-auwwx
#netstat	stream	tcp	nowait	guest	/usr/sbin/tcpd	/bin/netstat	-f inet

Il faut en outre envoyer le signal SIHUP au processus inetd afin que celui-ci lise à nouveau le fichier /etc/inetd.conf.

Le service DNS

La plupart des sites disposant de plusieurs machines mettent en place un serveur DNS par l'intermédiaire du démon named. Ce serveur a pour but de servir des requêtes internes faisant correspondre les noms des machines du réseau local à leur adresse IP. Si un serveur DNS est accessible directement ou indirectement depuis l'Internet, le cracker pourra se constituer une carte assez précise du réseau et son potentiel d'attaque n'en sera que plus élevé : il trouvera plus facilement les machines accessibles les moins sécurisées et pourra concentrer ses efforts sur celles-ci avant de prendre le système central (il est généralement plus facile d'attaquer un système depuis le réseau local que depuis l'extérieur).

Si la machine "victime.aie.net", accessible depuis l'Internet, procure un service DNS, un simple "nslookup - victime.aie.net" permet au cracker d'interroger ce service. La commande "ls aie.net" permettra alors, dans de nombreux cas, de lister toutes les machines présentes sur le domaine "aie.net". D'autres informations pourront aussi être disponibles : le mail de la personne gérant le DNS, le système d'exploitation de certaines machines, les machines assurant l'acheminement du courrier, etc.

C'est donc toujours une très mauvaise idée d'ouvrir une machine sur l'Internet si celle-ci exécute un service DNS privé. Le DNS privé devrait plutôt se faire sur une machine interne, protégée par un firewall. D'une manière générale, les machines d'un réseau local ne devraient pas avoir accès directement à l'Internet. Il est en effet inutile que toutes les machines aient une adresse IP connue du reste du monde. Des techniques comme la translation d'adresse ou le masquerading permettent d'utiliser des adresses IP non routables sur Internet pour le réseau local, tout en autorisant les machines ainsi "cachées" d'accéder à Internet.

L'utilisation de scripts cgi

L'installation d'un serveur Web entraîne parfois l'installation de plusieurs scripts cgi réputés pour créer des brèches de sécurité. Ceci est toutefois de moins en moins vrai, mais certains "vieux" systèmes présentent encore ces symptômes. Par un habile détournement des fonctionnalités initiales de ces scripts, un cracker va pouvoir exécuter du code lui permettant de récupérer des informations sur le système, par exemple le fichier /etc/passwd. Il est donc primordial, quand on installe un serveur Web ou qu'on utilise une distribution installant par défaut ce service, de vérifier la présence de ces scripts dans le répertoire les accueillant et, le cas échéant, de les supprimer. Citons en vrac des scripts réputés dangereux (en tout cas certaines versions de ces scripts) : info2www, nph-test-cgi, test-cgi...

Les scans de ports

Certains logiciels permettent de faire une véritable cartographie d'un système, voire d'un réseau dans son ensemble. Ces logiciels scannent tous les ports d'une machine afin de déterminer quels services sont disponibles. Ils peuvent même tester une plage d'adresses IP ou une domaine DNS dans son intégralité. Certains vont même jusqu'à tester les versions des logiciels serveurs et comportent une base de données d'attaques classiques. Ils peuvent ainsi déterminer automatiquement les faiblesses d'un réseau et procurent au cracker un rapport d'informations complet sur les attaques susceptibles d'aboutir.

En fait, beaucoup de ces logiciels sont avant tout dédiés à la sécurité : un administrateur système peut les utiliser pour déterminer les faiblesses de son réseau et appliquer les actions correctives qui s'imposent. Cependant, rien n'empêche qu'un cracker les détourne de leurs buts initiaux afin d'exploiter les brèches de sécurité. Nous verrons plus bas un exemple d'un tel outil. Des solutions logicielles existent pour déterminer si l'on subit un scan de ports. Si le système peut détecter ce genre d'attaques, il peut réagir automatiquement en interdisant que la ou les machines initiatrices du scan soient définitivement bannies du système (en créant, par exemple, une règle de firewall forte).

Déterminer les vulnérabilités

La partie d'échecs qui oppose l'administrateur système au cracker peut se résumer ainsi : si l'administrateur système veut gagner, il se doit de connaître son système mieux que son adversaire. Pour cela, il doit utiliser les mêmes armes que lui. La première des choses à faire est de rester à l'écoute de l'actualité de la sécurité. En s'abonnant à des groupes de discussions, en visitant régulièrement des sites Web dédiés au problème et en gardant le contact avec d'autres administrateurs, il pourra avoir assez d'informations pour faire évoluer son système au jour le jour. Evidemment, ce travail est long et demande un investissement en temps très lourd. De plus, cette activité demande des compétences multiples et variées et il est rare qu'une seule personne possède toutes les connaissances requises pour mener à bien cette tâche. Les entreprises pour lesquelles la sécurité a un aspect fondamental font souvent appel à des cabinets spécialisés. A un niveau moindre, on peut tout de même appliquer une démarche visant à réduire les risques.

Déterminer les services indispensables

La majorité des attaques extérieures exploitent des trous de sécurité de certains serveurs. En limitant au maximum le nombre de services que l'on propose à l'extérieur, on réduit les risques. De plus, ces services n'auront plus à être surveiller ni mis à jour par l'administrateur, ce qui réduit sa tâche. Evidemment, certains services ne pourront pas être arrêtés : si l'on fournit de l'information à l'Internet, les serveurs http (Web), ftp (téléchargement de fichiers) et smtp (transfert de courrier électronique) sont généralement nécessaires. Une attention particulière devra être portée aux logiciels utilisés. Tout d'abord, les dernières versions stables et sécurisées des logiciels devront être systématiquement installées : elles corrigent généralement les nouveaux trous de sécurité rencontrés. La configuration des serveurs est aussi une étape importante : on veillera à limiter au maximum les fonctionnalités des logiciels par rapport aux besoins réels. Citons quelques exemples :

- Si un site n'a pas besoin de scripts cgi, il est facile de configurer Apache pour l'empêcher d'exécuter de tels scripts.
- Certains serveurs ftp permettent d'exécuter des commandes sur le serveur : évidemment, on veillera à ce que cette fonctionnalité ne soit pas active (ce qui est le cas normalement par défaut), sauf en cas de nécessité absolue.

Il ne faut pas introduire des trous de sécurité :

- Lorsqu'on écrit des scripts cgi, il faut être sûr que ceux-ci ne peuvent pas être détournés de leur fonction première. Typiquement, les scripts recevant des paramètres doivent systématiquement vérifier la validité de ceux-ci avant de les utiliser dans une quelconque action.
- Les répertoires contenant des pages html doivent tous contenir un fichier "index.html". Si ce n'est pas le cas, il est probable qu'un utilisateur pourra, avec un simple navigateur, avoir la liste des fichiers du répertoire, pourra se déplacer dans la hiérarchie du système de fichier et avoir accès à des informations confidentielles.

Enfin, on pourra utiliser des logiciels dont les spécifications intègrent depuis le commencement des contraintes de sécurité : on pourra par exemple remplacer son vieux sendmail par postfix (http://www.postfix.org/).

Tester son système

Il est indispensable de connaître son système afin de boucher les trous dé sécurité (du moins les connus !), de façon régulière. Nous avons déjà parlé des scanners car les crackers les utilisent pour obtenir des informations sur le sytème. Un administrateur doit tester tous ses systèmes à l'aide de ces outils. Le plus célèbre est certainement SATAN (Security Administrator's Tool for Analysing Networks) mais il date un peu. Des outils plus récents, plus faciles à utiliser et évolutifs ont vu le jour. Un des meilleurs à ce jour est Nessus (http://www.nessus.org/). Il dispose d'une interface graphique évoluée (en GTK) et établit un rapport complet sur un système. Les principales failles de sécurité sont répertoriées et présentées à l'utilisateur sous forme d'une arborescence qui détaille chaque service. Le nom et la nature de l'attaque ainsi que le niveau de risque et la manière de remédier au problème font partie des informations données par Nessus. C'est un must !

Protéger et surveiller

Le filtrage IP

Le filtrage IP consiste à éliminer systématiquement certains paquets de données en fonction de leur provenance et/ou de leur destination. On peut ainsi interdire l'accès à certains services ou à certaines machines depuis l'extérieur. La solution la plus simple à mettre en oeuvre est sans doute l'utilisation d'un tcp/wrapper. Ce logiciel permet de faire de la surveillance en enregistrant dans des journaux les requêtes Internet pour les services qu'il contrôle, mais aussi du contrôle d'accès, en se basant sur l'adresse source des paquets IP. Les distributions récentes incluent généralement le wrapper tcpd, encore faut-il le mettre en oeuvre. Normalement le fichier /etc/inetd.conf contient des lignes dont le sixième champ est un appel à tcpd :

finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd

Il suffit alors d'éditer les fichiers /etc/hosts.allow et /etc/hosts.deny pour établir des règles d'utilisation des services décrits dans inetd.conf. Pour connaître la syntaxe de ces fichiers, on se référera au manuel : man 5 hosts_acces. Le problème avec tcp/wrapper est qu'il ne peut contrôler que les services démarrés depuis inetd. Une solution plus générale est l'utilisation d'un firewall. Sous Linux, cela se traduit par l'utilisation d'un noyau ayant les options de firewalling activées, et l'apprentissage des commandes ipfwadm ou ipchains. Tout cela est décrit de façon très claire dans le Firewall Howto. La logique d'utilisation de cet outil est alors la suivante : on configure le firewall pour qu'aucune requête ne soit satisfaite par défaut, puis on établit les seules règles nécessaires au fonctionnement des services extérieurs et intérieurs.

L'utilisation d'un firewall sur une machine personnelle est aujourd'hui à conseiller, notamment pour les personnes disposant d'une ligne haut débit comme le câble (et bientôt l'ADSL ?) car cela permet de repousser un grand nombre d'attaques aveugles comme il peut s'en produire quand on abuse de l'IRC ou de l'ICQ. Si l'on dispose d'un réseau, la solution la plus sage est d'installer les services extérieurs indispensables (par exemple un agent de transport de courrier) sur des machines sécurisées et de placer un firewall (voire deux !) entre les machines extérieures et le réseau local. Il faut éviter au maximum les relations d'approbations qui pourraient exister entre les machines du réseau local et celles situées sur l'extérieur. De même il est préférable qu'aucun DNS ne permette aux machines extérieures de connaître les noms des machines du réseau local (on communique alors entre ces machines par des adresses IP).

Le masquerading

Le masquerading, qui est inclus dans le noyau Linux, est une bonne technique pour rendre les machines de son réseau local inaccessibles directement depuis l'Internet. Outre le fait que cette technique permet de partager une seule liaison Internet entre plusieurs machines, elle rend possible l'utilisation d'un adressage IP privé, non routable sur Internet, pour les machines du réseau local. Seul le système directement connecté à Internet aura une adresse IP connue et exploitable par les autres machines de l'Internet. Cela signifie que même si une machine du réseau local est faiblement sécurisée, un cracker ne pourra pas l'attaquer directement : il devra au préalable "prendre" le seul système accessible depuis l'extérieur normalement hautement sécurisé. Trop de sites n'utilisent malheureusement pas encore cette technique et donnent des adresses IP routables à toutes leurs machines : le cracker n'a qu'à choisir la machine la plus faible pour infiltrer le réseau. Les informations sur cette technique sont décrites dans le IP Masquerade mini-Howto.

Détecter les intrusions

Enfin, il ne suffit pas de protéger et de laisser venir : tout site même sécurisé reste prenable. L'administrateur doit rester humble face à l'adversité ! Des outils permettent toutefois de détecter dans une certaine mesure les tentatives d'intrusion. Par exemple, on peut détecter la majorité des scans de ports. Des mesures correctives ou simplement d'avertissement peuvent alors être prises en temps réel. Là aussi, Linux est un atout majeur car il existe des logiciels libres assurant cette charge. Ceux qui sont intéressés pourront aller faire un tour sur http://www.nswc.navy.mil/ISSEC/CID/ et essayer le logiciel SHADOW.

Conclusion

Cette série d'articles avait pour but de sensibiliser les utilisateurs Linux aux problèmes de sécurité. Bien sûr, nombre de problèmes n'ont pas été abordés : les attaques des routeurs, les Denial of Services (DoS) attacks, les trojans, les codes hostiles que l'on peut recevoir par mail, etc. Quoiqu'il en soit, comme on a pu le constater, le fait que Linux soit un logiciel ouvert, et que la majorité de ses logiciels le soient aussi, est un avantage indéniable en matière de sécurité sur les solutions propriétaires : le source étant disponible, la communauté Linux peut réagir rapidement et efficacement dès qu'un problème apparaît. Cette communauté ne joue pas la langue de bois : les problèmes sont reconnus et l'information les concernant est librement et instantanément diffusée. Cette démarche garantit que l'utilisation de Linux, et avec lui tous les logiciels libres, est un investissement sain et à long terme.

Pink Pachiderm
Linux Magazine France n° 12 - Décembre 99