janv. 20 2010

[ASP.NET] Hébergement avec le trust level Medium

Category: ASP.NETNicolas Esprit @ 13:45

Suite à la publication du présent site web sur mon hébergeur, je me suis rendu compte que le Trust Level était défini à Medium et ceci pose souvent problème pour beaucoup d'applications ASP.NET. Un petit rappel sur la sécurité d'accès du code ne faisant pas de mal, j'ai voulu revoir les bases sur ce sujet et vous invite à consulter cet article MSDN.

Par défaut, une application ASP.NET ou un Web Service s'éxecutent en Full Trust et peuvent ainsi accéder à des ressources ou des opérations dont la sécurité est restreinte. Pourquoi mon hébergeur à choisi le mode Medium ? Tout simplement parce que l'hébergement mutualisé exige un certain nombre de protections pour permettre d'obtenir un niveau de qualité de service acceptable pour le client et l'hébergeur, et permet la cohabitation d'applications Web sans  présupposer quelles ressources vont être demandées à l'exécution. Le mode de Medium-Trust est souvent indispensable pour garantir l'isolation du code par rapport à des ressources critiques du système. La conception même du serveur d'applications ASP.Net permet en Full-Trust de faire tout et n'importe quoi, et présente le risque qu'un code utilisateur affecte négativement la stabilité de la plate-forme dans son ensemble.

Les plus grosses contraintes qu'on puisse voir avec le niveau Medium sont :

  • OleDbPermission n'est pas disponible. Cela signifie que vous ne pouvez pas utiliser le DataProvider ADO.NET OleDb pour accéder aux bases de données Access. Toutefois, vous pouvez utiliser le DataProvider SQL Server.
  • EventLogPermission n'est pas disponible. Cela signifie que vous ne pouvez pas accéder au journal des événements Windows.
  • ReflectionPermission n'est pas disponible. Cela signifie que vous ne pouvez pas utiliser la réflexion.
  • RegistryPermission n'est pas disponible. Cela signifie que vous ne pouvez pas accéder à la base de registre.
  • WebPermission est restreint. Cela signifie que votre demande ne peut communiquer avec une adresse ou plage d'adresses que vous définissez dans l'élément trust.
  • FileIOPermission est restreint. Cela signifie que vous ne pouvez accéder à des fichiers dans l'arborescence de répertoire virtuel de votre application.

Sachant que mon hébergeur a rajouté la propriété <location allowOverride="false"> je suis maintenant bien coincé :-(

Du point de vue des administrateurs IIS, il est tout à fait possible de permettre aux applications de actions précises (comme l'utilisation d'OleDb par exemple) malgrès le niveau Medium. Pour cela, il faut créér une stratégie personnalisée basée sur le niveau Medium :

  1. Copier le fichier de stratégie d'approbation moyen web_MediumTrust.config situé dans le répertoire suivant pour créer un nouveau fichier de stratégie dans le même répertoire:% windir% \ Microsoft.NET \ Framework \ (Version) \ Config. Il faut lui donner un nom explicite comme customWeb_MediumTrust.config par exemple.
  2. Ajouter les autorisations que l'on souhaite accorder. Dans l'exemple suivant, la FileIOPermission est modifiée pour permettre l'accès en lecture à un répertoire spécifique en dehors de la hiérarchie du répertoire virtuel de l'application.
    <PermissionSet
        class="NamedPermissionSet"
        version="1"
        Name="ASP.Net">
      ...
        <IPermission
             class="FileIOPermission"
           version="1"
             Read="C:\SomeDir;$AppDir$"
             Write="$AppDir$"
             Append="$AppDir$"
             PathDiscovery="$AppDir$"
    />
      ...
    </PermissionSet>
    
  3. Créer un nouveau niveau de sécurité personnalisé dans le fichier Web.config de la machine. Le fichier de stratégie est le nom de celui créé à l'étape 1.
    <securityPolicy>
      <trustLevel name="CustomMedium" policyFile="customWeb_mediumtrust.config" />
      ...
    </securityPolicy>
    
  4. Configurer les applications à exécuter au niveau de la nouvelle politique spécifique en positionnant le niveau de confiance à "CustomMedium".
    <system.web>
      <securityPolicy>
       <trustLevel name="CustomMedium"
                   policyFile="customWeb_mediumtrust.config" />
       <trustLevel name="Full" policyFile="internal" />
       <trustLevel name="High" 
                   policyFile="web_hightrust.config" />
       <trustLevel name="Medium" 
                   policyFile="web_mediumtrust.config" />
       <trustLevel name="Low"  policyFile="web_lowtrust.config" />
       <trustLevel name="Minimal"
                   policyFile="web_minimaltrust.config" />
     </securityPolicy>
     <trust level="CustomMedium" originUrl="" />
    </system.web>

 

Je vais donc revoir un peu mon application et contacter les administrateurs pour savoir plus précisément ce qu'il en est du niveau de sécurité utilisé. Toujours est-il que je peux vous recommander ceci pour vos développements en mode Medium :

  • Identifier les types de ressources que votre application a besoin et les opérations privilégiées qu'elle doit accomplir.
  • Déterminer quelles sont les autorisations disponibles.
  • Configurez votre environnement de développement et fichier Web.config de votre application pour le niveau Medium dès à présent.
  • Pour les applications existantes, envisagez d'utiliser l'outil PermCalc.

Voilà, je vais de ce pas envoyer un mail aux admins :-)

Tags: , , ,

Commentaires

1.
Seb Seb France says:

Tiens-nous au courant de la réponse des admin! Perso je trouve con de ne pas pouvoir utiliser la réflection au niveau medium... on touche très très vite aux limites du mutualisé.

Les commentaires sont clos