Manuel:Droits d'accès aux images

This page is a translated version of the page Manual:Image authorization and the translation is 84% complete.
Outdated translations are marked like this.
Other languages:

Cet article concerne les administrateurs système qui souhaitent restreindre l'accès aux images et aux fichiers en se basant sur les utilisateurs et (ou) les droits des groupes d'utilisateurs.

Les fichiers téléversés sont généralement distribués directement par le serveur web, et non pas via MediaWiki. Alors qu'il existe un niveau minimal de sécurité masqué par l'encodage des chemins (comme /c/c4/...), le chemin peut être calculé facilement à partir du nom de fichier ce qui ne fournit pas de réelle protection.

Ce n'est pas une configuration recommandée. MediaWiki n'est pas conçu pour être un système de gestion de contenu (CMS - Content management system), ni pour protéger les données sensibles. Au contraire, il a été conçu pour être le plus ouvert possible. Ainsi, il ne prend pas en charge de manière inhérente une protection complète et étanche du contenu privé. Tout administrateur souhaitant utiliser cette fonctionnalité doit relire attentivement les Problèmes de sécurité avec les extensions d'autorisation.

Présentation

Par défaut, toutes les images et les fichiers téléversés sont accessibles directement par le serveur web. Si vous souhaitez donner accès uniquement aux utilisateurs autorisés de l'environnement MediaWiki, il faut réunir deux conditions :

  1. Le répertoire actuel doit être protégé contre l'accès direct et,
  2. MediaWiki Authorization doit être appelé en exécutant un script lorsqu'une URL contenant ce répertoire est demandée pour accèder à une image ou un fichier.

L'implémentation fondamentale nécessite :

  1. Le répertoire des images ($wgUploadDirectory ) doit être déplacé en dehors de la racine du web dans le système de fichiers, ou bien protégé
  2. Le chemin de téléversement ($wgUploadPath ) doit pointer vers img_auth.php .

Dans les deux cas, les mécanismes dépendent de la plateforme du serveur web. Cet article fournit des instructions détaillées pour les deux plateformes :

  1. Apache (la plupart des versions)
  2. Microsoft Internet Information Server (IIS), version 6.0 et supérieure

Dans toutes les instructions, on suppose que MediaWiki est installé dans /path/to.

Par exemple dans :

/path/to vaut /MyWiki

Comment fonctionne img_auth.php ?

Image authorisation works by routing requests for uploaded media files through the img_auth.php script, instead of allowing the web server to directly send the file to the browser. This is done by setting $wgUploadPath to the location of the img_auth.php script ($wgUploadPath = "$wgScriptPath/img_auth.php";), instead of the upload diectory. This causes MediaWiki to generate file URLs that look something like http://wiki.example.org/w/img_auth.php/01/01/Example.png. When the web server receives a request for such a URL, it will know to call the img_auth.php script and pass it the reremainder of the URL as PATH_INFO. The script will then check whether the user has access to the file given in the PATH_INFO, based on the normal mechanism used for managing access to wiki pages. If img_auth.php determines that the user has access to the requested file, it read the file's content and streams it back to the user, just as if the webserver was serving the file directly from the disk. If however the user does not have access to the file, img_auth.php returns the standard 403 "Access Denied" error.

Configurer le téléversement des fichiers

Avant d'adopter cette configuration, il est très important que vous compreniez comment configurer le téléversement des fichiers. Veuillez prendre quelques instants pour relire et comprendre cet article - cela vous épargnera beaucoup de temps.


Prise en charge du PATH_INFO PHP

Ceci nécessite que votre configuration PHP prenne en charge PATH_INFO (beaucoup de configurations CGI ne le font pas) et que êtes dans le mode $wgWhitelistRead ou sinon, il n'y aura pas de point ... à moins que vous ne souhaitiez sécuriser davantage l'installlation MediaWiki; voir ci-dessous.

Un autre scénario dirigé par la sécurité (uniquement pour Apache/Unix)

Même si vous ne voulez pas restreindre l'accès à vos images, vous pouvez utiliser la mécanique de img_auth.php : pour éviter les répertoires accessibles publiquement, sur lesquels le serveur web a des droits d'écriture. Bien qu'avoir un répertoire sur le serveur web accessible en écriture n'est pas dangereux en soi, ceci est la première moitié pour une attaque réussie de votre serveur web. La seconde moitié ensuite pourrait être un script exploitable (PHP) de MediaWiki lui-même ou, plus vraisemblablement, un autre script. Si l'attaquant peut exploiter le script corrompu pour téléverser ou pour générer un autre script qui va l'aider lors d'attaques ultérieures, de spamming, ou autres ... l'attaquant doit encore trouver un endroit pour y enregistrer ce script, qui soit accessible en écriture par le serveur web ... , disponible et bien connu dans le répertoire 'images' des installations standard de MediaWiki.

Une toute première mesure de sécurité pour cela, est de mettre un fichier .htaccess dans le répertoire 'images' avec le contenu suivant :

# No php execution in the upload area
php_admin_flag engine off

Par contre .htaccess ne doit pas être modifiable par le serveur web ! C'est dommage que MediaWiki ne soit pas livré avec cette restriction par défaut (au moins pas dans la version 1.6.10).

Il serait encore meilleur de déplacer le répertoire 'images' accessible en lecture, en dehors de la racine des documents, en le renommant sous un nom que l'on ne puisse pas deviner (par exemple le code de hachage MD5 de <ceQueVousVoulez>) et de distribuer les images via 'img_auth.php', de sorte que le répertoire réel ne soit jamais divulgué nulle part.

Pour faire cela, suivez les étapes ci-après :

  1. connectez-vous au shell de votre serveur web en mode ligne de commande (des actions similaires sont souvent possibles avec votre client FTP, si ce n'est pas le cas demandez à votre fournisseur de vous aider)
  2. créez le répertoire images/upload en dehors de (en parallèle de) la racine de votre document (notez le /.. à la fin du chemin) et de sorte que l'on ne puisse pas le deviner :
    cd </chemin/absolu/vers/la/racine/de/vos/documents>/..
    mkdir <nom_de_répertoire_non_devinable>
    
  3. déclarez-le accessible en lecture et écriture par le serveur web :
    chgrp <groupe_de_votre_serveur_web> <nom_de_répertoire_non_devinable>
    chmod 770 <nom_de_répertoire_non_devinable>
    
  4. create the .htaccess file as noted above and make it readable only (this is paranoia, because the web server never looks here, only PHP not taking care of .ht* files normally, but just in case this directory ever will be made available to the web server directly):
    cd <nom_de_répertoire_non_devinable>
    echo 'php_admin_flag engine off' > .htaccess
    chmod 444 .htaccess
    
  5. mettez à jour votre fichier de configuration LocalSettings.php : $wgUploadPath = "$wgScriptPath /img_auth.php"; $wgUploadDirectory = '</chemin/absolu/vers/la/racine/de/vos/documents>/../<nom_de_répertoire_non_devinable>'; $wgEnableUploads = true; # Nous ne voulons pas restreindre l'accès mais simplement rendre l'installation de MediaWiki plus sécurisée $wgWhitelistRead = false;

qui devrait faire ce qu'on attend sans configuration supplémentaire.

Cela devrait convenir pour tous les serveurs web qui utilisent PHP avec un module Apache. Il n'y a pas d'autre modification des fichiers de configuration Apache à faire. Par conséquent vous ne verrez jamais le chemin vers vos images, car img_auth.php intercepte tous les accès en lecture. Mais toutes vos images sont disponibles, y compris les vignettes.

Si vous utilisez CGI ou IIS, votre fidélisation (milage) peut varier.

Instructions Apache

La plupart des administrateurs ont trouvé directe et très simple, l'implémentation dans l'environnement Apache.

If you are using a GoDaddy shared hosting account, you may need to reference this thread if you are having problems viewing uploaded images with img_auth.php:

Apache étape 1. Protéger le répertoire Images de l'accès Internet

Dans votre répertoire [/path/to]/images , créez un fichier .htaccess contenant une ligne :

Deny from All
Si vous n'avez pas déplacé votre répertoire, il n'y a pas lieu de modifier $wgUploadDirectory

Apache étape 2. Executer le script img_auth.php pour tous les accès

Apache étape 2.1. modifier $wgUploadPath dans LocalSettings.php. Pas utile si l'étape 2.2 Apache a été faite

$wgUploadPath = "[/path/to]/img_auth.php";

[/path/to] is the URL path, not the file system path, so if img_auth.php is in /usr/share/mediawiki but is accessed as http://example.org/mediawiki/img_auth.php, the line would read:

$wgUploadPath = "/mediawiki/img_auth.php";

Vérifiez d'avoir bien commencé par une barre oblique / si img_auth.php est actuellement dans votre répertoire racine. Les images ne seront pas affichées du tout si vous oubliez de faire ainsi :

$wgUploadPath = "/img_auth.php";

Apache étape 2.2. créer des alias pour exécuter img_auth.php

Cette étape est uniquement nécessaire si vous souhaitez continuer à utiliser des URLs contenant les chemins directs vers vos images. MediaWiki ne doit jamais avoir besoin de cela si vous avez terminé avec succès les mises à jour précédentes de la configuration.

Mettez à jour le fichier httpd.conf en ajoutant les deux alias suivants :

Alias [/path/to]/images/ [/path/to]/img_auth.php/
Alias [/path/to]/images [/path/to]/img_auth.php

The second [/path/to] on each line should be the absolute path on the file system, and it may be necessary to add a trailing frontslash to img_auth.php (i.e., use [/path/to]/img_auth.php/).

Apache étape 2.3. redémarrez votre serveur Apache

Instructions Apache sans PATH_INFO avec mod_rewrite

Apache étape 1. télécharger le script cgi de prise en charge d'autorisation d'image

Si PATH_INFO n'existe pas, téléchargez le script CGI de prise en charge des droits des images. Enregistrez le script sous le nom cgi_img_auth.php dans votre répertoire MediaWiki.

Apache étape 2. Protéger le répertoire Images de l'accès Internet

Dans votre répertoire [/path/to]/images, créez un fichier .htaccess contenant une seule ligne :

Deny from All
Si vous n'avez pas déplacé votre répertoire, il n'y a pas lieu de modifier $wgUploadDirectory

Apache étape 3. Executer le script cgi_img_auth.php pour tous les accès

Apache étape 3.1. mettre à jour $wgUploadPath dans LocalSettings.php

$wgUploadPath = "[/path/to]/cgi_img_auth.php";

Apache étape 3.2. modifier .htaccess

Mettez à jour le fichier .htaccess pour qu'il ressemble à

RewriteEngine on
RewriteRule ^/path/to/images(.*)$ /path/to/cgi_img_auth.php/$1 [R]
RewriteRule ^path/to/cgi_img_auth.php/(.*)$ path/to/cgi_img_auth.php?path=/$1

Notez par ailleurs que cette étape n'est pas nécessaire avec certaines installations.

Apache - assurez la compatibilité en utilisant des URLs à jour

If your website is rewriting URLs through .htaccess, then you will need an exception before the custom rewrites:

RewriteCond %{REQUEST_URI} /img_auth\.php/
RewriteRule ^ - [L]

(Cela signifie : dans le cas où img_auth est appelé, règles d'arrêt)

Exemple de fichier .htaccess :

RewriteEngine On
# First condition&rule:
RewriteCond %{REQUEST_URI} /img_auth\.php/
RewriteRule ^ - [L]
# Rest of rules:
RewriteCond ...
RewriteRule ...

Apache - masquer la liste des répertoires

Si vous ne souhaitez pas que les utilisateurs puissent lister votre répertoire d'images, indiquez le dans la configuration Apache :

        <Directory /var/www/wiki/images>
                Options -Indexes
        </Directory>

Instructions IIS

L'implémentation sous IIS est plus complexe car on n'y dispose pas des possibilités du 'pipe' de Apache ou d'Unix en général. Néanmoins, avec quelques manipulations on peut faire en sorte que IIS puisse exécuter le CGI et assurer la protection.

  Avertissement : The img_auth approach ONLY works with the PHP ISAPI mode on the WIMP (Windows, IIS, MySQL, PHP) platform. If you followed the standard windows installation instructions, your wiki will be using CGI (php-cgi.exe) and you will have to convert to ISAPI. Les instructions pour faire cela se trouvent dans l'espace de discussion. There is a bug in the php-cgi approach in parsing PATH_INFO that will show up as "CGI Error: The specified CGI application misbehaved by not returning a complete set of HTTP headers" on some files in the restricted path. C'est un problème PHP ou IIS, et non pas MediaWiki.

IIS étape 1. Protéger le répertoire Images de l'accès Internet anonyme

With IIS it is important that users cannot access images or files by using alternative URL paths to the bypass the virtual directory redirect. C'est pourquoi il faut créer un nouveau répertoire hors de la racine de MediaWiki.

IIS étape 1.1 créer un nouveau répertoire physique

Créez un nouveau répertoire physique. Ce répertoire ne doit pas se trouver à l'intérieur d'un autre répertoire web existant, ni d'un autre répertoire web virtuel :

Exemple :

c:\inetpub\wwwroot\MyWikiImg

IIS étape 1.2 vérifiez ou configurez la sécurité des répertoires

The Directory security must allow read, write, modify for the Internet Guest Account (usually IUSR_[server name]). Ne vous inquiétez pas, on va corriger cela dans les étapes suivantes.

IIS étape 2. exécuter le script img_auth.php pour tous les accès au répertoire Image

In IIS this is done by creating a virtual directory with the same name as the physical directory (if your directory is off the root web).

IIS étape 2.1 créer le répertoire virtuel de même nom que le répertoire physique

Create a new virtual directory using Start->Administrative Tools->Internet Information Services (IIS) Manager in the web service you are using for MediaWiki.

Pour créer le répertoire virtuel, cliquez-droit sur le service web -> New Virtual Directory...

Dans l'assistant, créez un nouveau répertoire virtuel ayant le même nom que le répertoire physique et faites le pointer vers ce répertoire.

IIS étape 2.2 rediriger le nouveau répertoire virtuel vers img_auth.php

Still in IIS Manager, right click on the new virtual directory->Properties select the 'Virtual Directory' tab and change the 'The content for this resource should come from:' to 'A redirection to a URL'. Initialisez 'Redirect To:' avec l'URL vers img_auth de votre MediaWiki.

Exemple :

http://wiki.example.org/MyWiki/img_auth.php

N'oubliez pas de cliquer sur Apply pour exécuter.

IIS étape 3 copier l'ancien répertoire image dans le nouveau

Copiez le contenu de l'ancien répertoire d'images ($ip/image) ainsi que les sous-répertoires dans le nouveau répertoire que vous avez créé.

Le dossier 'image' ne se trouvera pas dans le nouveau répertoire.

Le nouveau répertoire ne devrait pas apparaître comme :

Mauvais :

MyWikiImg
  images
    0
    1
    . . .

Bon :

MyWikiImg
  0
  1
  . . .

IIS étape 4 rediriger le traitement des images MediaWiki

IIS étape 4.1 modifier $wgUploadPath dans LocalSettings.php

$wgUploadPath = "[NewVirtualDirPath]";

Exemple :

$wgUploadPath = "/MyWikiImg";

IIS étape 4.2 modifier $wgUploadDirectory dans LocalSettings.php

$wgUploadDirectory = "[NewVirtualDirImages]";

Exemple :

$wgUploadDirectory = "D:\Inetpub\wwwroot\MyWikiImg";

IIS étape 4.3 redémarrer votre service web IIS

IIS étape 4.4 PATH_INFO IIS problématique

If your installation is not working, it may be because img_auth.php requires the server to return PATH_INFO to know exactly which file you wish to access (e.g., everything in the URL after the virtual directory).

There have been several articles and hints that some versions of IIS may disallow the server variables PATH_INFO and PATH_TRANSLATE 'for security reasons'. While we did not have this problem on the current server and patch level (IIS 6.0) it is a noted issue for IIS 4.0 (and possibly prior), you may want to investigate if img_auth.php is not working for you.

L'article complet de la base de connaissance se trouve sur Using PATH_INFO and PATH_TRANSLATED from CGI Applications. Cet article vous indique la manière d'exécuter un programme écrit en MS Visual Basic (il est possible que vous deviez charger CScript).