WWW et la sécurité

Introduction

Le but de ce document est de proposer quelques conseils, faciles à mettre en oeuvre, relatifs à la sécurité sur le web.

Ces conseils, qui permettent d'augmenter "facilement" la sécurité, s'adressent à plusieurs catégories d'utilisateurs:

Le but est donc d'éviter de laisser béantes des brèches facilement colmatées ...

Ce document est donc plus un recueil de conseils qu'un cours ou une FAQ sur la sécurité WWW.

Pour cela je vous invite à consulter les documents suivants :

Ainsi que la FAQ WWW.

De quels risques parlons nous ici ?

A partir du moment où un serveur WWW est mis en place, vous ouvrez une vitrine sur votre organisation.

De manière schématique, deux risques se présentent alors à vous :

  1. que cette vitrine soit utilisée pour "regarder" autre chose que ce que vous avez choisi d'y présenter

  2. que cette vitrine, ou son contenu, soit modifié à votre insu
Nous allons nous intéresser à la première catégorie de risques et voir comment il est possible de restreindre ces risques, notamment en réduisant les brèches qui peuvent apparaître suite à la mise en place d'un serveur WWW.

La deuxième catégorie de risques est rarement aggravée par la mise en place d'un serveur WWW. Les brèches à combler sont alors du domaine de la sécurité des systèmes informatiques en général.

Envoyez vos suggestions,commentaires et corrections à Nicolas.Cros@cict.fr.


Vous êtes administrateur de machine hébèrgeant un serveur WWW ...

Voici quelques règles générales à mettre en application sur un système UNIX hébergeant un serveur WWW :

Vous administrez un serveur WWW ...

Voici une stratégie possible pour la mise en place d'un serveur WWW :
Exemple :
% ls -l /usr/local/www/
total 22
drwxr-xr-x   6 www      www         1024 Oct  2 14:54 cgi-bin/
drwxr-x--x   2 www      www          512 Sep 24 11:40 conf/
drwxr-x--x   4 www      www          512 Oct  2 14:39 docs/
drwxr-x---  10 www      www         1024 Nov  4 00:00 logs/

% ls -ld /usr/local/www/docs
drwxr-x--x   3 redac1   reseau       512 Oct  7 13:38 atm/
drwxr-x--x   8 redac2   reseau      1536 Jul 19 08:22 ethernet/
drwxrwx--x   3 redac3   infos        512 Jul 26 09:45 infos/
drwxrwx--x   2 www      cict        1024 Oct 31 11:48 icones/
drwxrwx--x   2 www      cict         512 Jun 24 10:10 images/
lrwxrwxrwx   1 www      www           14 Apr  3  1996 index.html -> infos/sommaire.html

% ls -ld  ~redac1/www/atm                      
lrwxrwxrwx   1 redac1   reseau        27 Feb 22  1996 atm/ -> /usr/local/www/docs/atm

% ls -ld  ~redac3/Documents/WWW/infos                      
lrwxrwxrwx   1 redac3   infos         27 Feb 22  1996 infos/ -> /usr/local/www/docs/infos


Vous écrivez des scripts CGI ...

Les scripts CGI en général

Les scripts CGI peuvent ouvrir deux types de brèches : Voici donc quelques trucs pour faire en sorte d'utiliser ces scripts dans des conditions plus sures, classés par ordre d'importance :

  1. Ne jamais écrire un script CGI en shell (sh, csh, ksh, ...). D'une part ce n'est pas la manière la plus efficace de travailler (chaque ligne est interprétée), mais surtout le nombre de fois où les caractères de contrôles peuvent être mal interprétés est beaucoup plus important.

  2. Ce qu'il ne faut pas faire dans un script CGI

  3. Il est impératif de contrôler ce qui arrive en entrée de votre script. Pour cela il est préférable de contrôler la conformité de cet entrée à ce qu'attend votre script que de simplement ôter les caractères de contrôle. Par exemple, une adresse électronique SMTP est généralement de la forme nom.prenom@machine.domaine, les autres caractères que @ . _ - a-z A-Z 0-9 n'ont donc rien à faire ici. (exemple) En théorie, les caractères déclarés dans sendmail.cf sont les suivants . : % @ ! ^ / [ ] a-z A-Z 0-9.

  4. La liste exhaustive des caractères de contrôle à filtrer avant de passer un paramètre à un interpréteur est la suivante : & ; ' ` \ " | * ? ~ < > ( ) [ ] { } $ \n \r Voici deux exemples de contrôle sur les chaines de caractères, l'un en C et l'autre en perl.

  5. Dans un script écrit en C, il est préférable d'utiliser la famille des fonctions exec() plutôt que system(), car exec() ne passe pas par un interpréteur de commandes (shell).

  6. Il ne faut jamais faire confiance à la variable PATH pour lancer l'exécution d'un programme mais toujours donner le chemin absolu pour l'atteindre.
    En effet, une manoeuvre souvent utilisé pour corrompre un système est de modifier la variable PATH afin de faire exécuter un programme modifié, du même nom, plutôt que celui que vous attendez. Pour la même raison, il est préférable d'éviter d'inclure le répertoire courant (.) dans cette variable.
    Par exemple, en C, préférez : system("/bin/ls -l /usr/local/web/info"); à system("ls -l /usr/local/web/info"); Et si vous devez utiliser la variable PATH, positionnez là complètement au début de votre script.

  7. Ne pas oublier que vos scripts peuvent être appelés sans passer par le formulaire que vous avez écrit à cette intention. Des paramètres peuvent donc manquer ou contenir des valeurs inattendues. Si vous définissez un champ <SELECT>, vérifiez avant d'utiliser la valeur de ce champ qu'elle appartient à l'ensemble de valeurs présentées dans votre formulaire.

  8. Si vous avez l'alternative C/Perl ou plus généralement langage compilé/langage interprété (même si Perl n'est pas qu'interprété mais aussi compilé), le fait d'utiliser un langage compilé peut être intéressant pour les raisons suivantes :
    • le code n'est pas fourni (le code d'un script peut être récupéré dans certains cas) et il est moins volumineux
    • on y utilise moins l'exécution de commandes systèmes et la capture de leur sortie

  9. Ne pas installer n'importe quel script récupéré sur le réseau sur votre serveur. Lisez-le et analysez-le (ou faites-le analyser). Voici une check-list indicative :

  10. Rassembler tous les scripts CGI dans un même répertoire, tout simplement pour voir rapidement quels sont les scripts utilisés par votre serveur. Ne définissez pas pour le serveur que tout fichier se terminant par .cgi est un script cgi (avec AddType application/x-httpd-cgi .cgi), mais plutôt que tout fichier situé dans tel et tel répertoire est un script cgi à exécuter comme tel (avec ScriptAlias). Si de plus il n'est possible qu'au seul webmestre d'écrire dans le répertoire cgi-bin, vous évitez l'installation d'un script buggé dans la hiérarchie de votre serveur.

  11. Dans le répertoire cgi-bin, ne laissez que les scripts qui sont utiles (par défaut, enlevez les droits en exécution pour tous sur phf, finger, query, post-query, jj).
Pour en savoir plus :

Et les scripts Perl en particulier


Vous surfez sur le Web ...


Partie encore en cours d'élaboration

Que faire sur les butineurs ?

Sur les butineurs, attention à ne pas déclarer de "viewer externe" pour des fichiers pouvant contenir des ordres exécutables. Il est en effet préférable de ne jamais exécuter à l'aveuglette n'importe quel programme récupéré sur l'Internet.

Evitez par exemple de définir les viewers suivants :
Document Type Viewer
application/x-csh /bin/csh
application/x-msexcel-macro excel

N'oubliez pas qu'un fichier Postscript peut contenir des ordres executables réalisant des actions sur votre systèmes de fichiers.

Et java ?

Java est un langage développé par Sun MicroSystems. Les programmes Java sont pré-compilés dans une forme compacte. Ils sont ensuite exécutés par une machine Java. Certains programmes Java sont conçus pour etre exécutés dans un navigateur WWW : ce sont les appliquettes (ou applets).

Comme java est basé sur une seule machine virtuelle que toutes les implémentations de java simulent, les programmes java peuvent s'executer sur n'importe quel système disposant d'une version de java.

Les machines Java ont été conçues afin de minimiser les risques : ces machines ne peuvent exécuter certaines commandes systèmes, ni charger des librairies systèmes ; elles ne peuvent pas ouvrir des fichiers spéciaux correspondant à des disques, et l'écriture/la lecture de fichiers n'est possible que dans un sous-ensemble de la hiérarchie.

Les document HTML peuvent faire référence à des applets grâce au marqueurs <APPLET>. Les browsers qui comprennent ces marqueurs récupèrent alors les applets sur le serveur WWW, puis les font exécuter à la machine Java du client.

Et javascript ?

JavaScript est un ensemble d'extensions apportées au langage HTML, supportées seulement par quelques navigateurs (les versions 2.0 et supérieures de Netscape Navigator, la version 3 de Microsoft Internet Explorer) afin de contrôler certains aspects du browser.

Que faire ?

Désactivez :


Pour rebondir ...



Mis à jour le 04/06/97
[Sommaire CICT] CICT
Vos commentaires sur ce serveur : www@cict.fr