Utilisation du chiffrement pour protéger les mots de passe

par Saad Ladki

Introduction

Ce document fournit une vue d’ensemble des étapes requises pour définir à la fois le pool d’applications et l’isolation des processus de travail pour les serveurs IIS 7.0 et versions ultérieures. L’isolation du pool d’applications implique la protection des données auxquelles les Services d’évaluation Windows (processus de système local IIS) doivent accéder. Un exemple de ces données est le mot de passe du pool d’applications. L’isolation des processus de travail, d’autre part, implique la protection des données auxquelles l’identité du pool d’applications doit accéder. Un exemple de ces données est le mot de passe de compte d’utilisateur anonyme.

Prérequis

Pour aider à simplifier ce processus, deux exemples de code sont fournis :

  • Créer un fournisseur de chiffrement RSA dans machine.config.
  • Définir le nom du fournisseur par défaut dans machine.config.

La dernière section des prérequis vous guide dans la configuration de quatre comptes d’utilisateur qui seront utilisés dans les rubriques ultérieures.

Création d’une nouvelle application de fournisseur de chiffrement RSA

  1. Ouvrez le Bloc-notes Windows et créez un fichier dans un répertoire de votre choix nommé createProvider.cs qui contient le code C# suivant :

    using System;
    using Microsoft.Web.Administration;
    using System.Configuration;
    
    namespace testingEncryption
    {   
        public class createProvider   
        {
            public static void Main(string[] args)
            {
                String keyContainerName = args[0];
                String description = args[1];
                String providerName = args[2];
                System.Configuration.Configuration machineConfig =
                System.Configuration.ConfigurationManager.OpenMachineConfiguration();
                System.Configuration.ProviderSettings settings =
                    new System.Configuration.ProviderSettings(providerName,
                    "System.Configuration.RsaProtectedConfigurationProvider,
                    System.Configuration,
                    Version=2.0.0.0, Culture=neutral,
                    PublicKeyToken=b03f5f7f11d50a3a");
                settings.Parameters["description"] = description;
                settings.Parameters["keyContainerName"] = keyContainerName;
                settings.Parameters["cspProviderName"] = String.Empty;
                settings.Parameters["useMachineContainer"] = "true";
                settings.Parameters["useOAEP"] = "false";
                settings.Parameters["name"] = providerName;
                ProtectedConfigurationSection pcSection =
                    (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection ("configProtectedData");
                pcSection.Providers.Add(settings);
                machineConfig.Save();
            }
        }
    }
    
  2. Ensuite, lancez une invite de commandes avec élévation de privilèges :

    • Cliquez sur le menu Démarrer.
    • Faites un clic droit sur Invite de commandes.
    • Sélectionnez Exécuter en tant qu'administrateur.
  3. Dans la fenêtre d’invite de commandes, accédez à l’emplacement où vous avez enregistré le fichier createProvider.cs et exécutez la commande suivante pour compiler votre code :
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll createProvider.cs

Cette étape est maintenant terminée.

Création d’une application pour modifier le fournisseur par défaut

  1. Ouvrez le Bloc-notes Windows et créez un fichier dans un répertoire de votre choix nommé setProvider.cs qui contient le code C# suivant :

    using System;
    using Microsoft.Web.Administration;
    using System.Configuration;
    namespace testingEncryption 
    {
        public class setProvider
        {
            public static void Main(string[] args)
            {
                String provider = args[0];  // example: DataProtectionConfigurationProvider
                System.Configuration.Configuration machineConfig =
                    System.Configuration.ConfigurationManager.OpenMachineConfiguration();
                ProtectedConfigurationSection pcSection =
                    (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection("configProtectedData");
                string oldEncryptionProviderName = pcSection.DefaultProvider;
                Console.WriteLine("The default provider is currently: " + oldEncryptionProviderName);
                Console.WriteLine("Changing the default provider to: " + provider);
                pcSection.DefaultProvider = provider;
                machineConfig.Save();
            }
        }
    }
    
  2. Ensuite, lancez une invite de commandes avec élévation de privilèges :

    • Cliquez sur le menu Démarrer.
    • Faites un clic droit sur Invite de commandes.
    • Sélectionnez Exécuter en tant qu'administrateur.
  3. Dans la fenêtre d’invite de commandes, accédez à l’emplacement où vous avez enregistré le fichier setProvider.cs et exécutez la commande suivante pour compiler votre code :
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll setProvider.cs

Cette étape est maintenant terminée.

Création de comptes d’utilisateur

Dans cette étape, nous créons quatre nouveaux comptes d’utilisateur qui seront utilisés dans ce document.

Pour commencer, ouvrez une fenêtre d’interpréteur de commandes s’exécutant sous des droits d’administration en procédant comme suit :

  1. Cliquez sur le menu Démarrer.
  2. Faites un clic droit sur Invite de commandes.
  3. Sélectionnez Exécuter en tant qu'administrateur.
  4. Dans la fenêtre de commande, exécutez les commandes suivantes :
net user /add AppPoolIdentity1 password1
   net user /add AppPoolIdentity2 password2
   net user /add AnonymousAccount1 password3
   net user /add AnonymousAccount2 password

Cette étape est maintenant terminée.

Isolation du pool d’applications

IIS dispose d’un processus appelé Services d’évaluation Windows qui s’exécute dans le contexte de LOCALSYSTEM et est le seul processus qui a besoin d’accéder aux mots de passe du pool d’applications. Dans cette tâche, nous :

  • Créons une nouvelle clé RSA (iisWasKey) à laquelle seuls LOCALSYSTEM et Administrateurs ont accès. Cette clé sera utilisée pour chiffrer les mots de passe de chaque pool d’applications.
  • Créez deux pools d’applications.
  • Configurez chacun de ces pools d’applications pour qu’ils s’exécutent sous différentes identités et chiffrent leurs mots de passe à l’aide de iisWasKey.
  • Limitez les autorisations du système de fichiers NTFS sur les fichiers clés afin que seuls SYSTEM et Administrateurs aient accès.

Créez une nouvelle clé RSA

  1. Cliquez sur le menu Démarrer.
  2. Faites un clic droit sur Invite de commandes.
  3. Sélectionnez Exécuter en tant qu'administrateur.
  4. Dans la fenêtre de commande, accédez à l’emplacement où vous avez enregistré votre createProvider.exe et exécutez la commande suivante :
createProvider.exe iisWasKey RsaKeyForWAS Rsa_WAS

Vérifiez que ces modifications se sont produites correctement. Ouvrez votre %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\config\machine.config à l’aide du Bloc-notes Windows et vérifiez que les lignes de la section sont présentes pour le nouveau fournisseur :

keyContainerName="NetFrameworkConfigurationKey" cspProviderName=""
useMachineContainer="true" useOAEP="false" name="RsaProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,

Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
useMachineProtection="true" keyEntropy="" name="DataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

cspProviderName="" useMachineContainer="true" useOAEP="false"
name="Rsa_WAS"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Chiffrer les mots de passe du pool d’applications

Par défaut, chaque fois qu’une propriété est chiffrée, IIS utilise le defaultProvider pour le chiffrement défini dans machine.config. La valeur par défaut est RsaProtectedConfigurationProvider.

Dans cette étape, nous utilisons l’application setProvider.exe créée précédemment pour remplacer le fournisseur par iisWasKey, puis le Gestionnaire IIS pour modifier les mots de passe :

  1. Cliquez sur le menu Démarrer.
  2. Faites un clic droit sur Invite de commandes.
  3. Sélectionnez Exécuter en tant qu'administrateur.
  4. Dans la fenêtre de commande, accédez à l’emplacement où vous avez enregistré votre setProvider.exe et exécutez la commande suivante :
setProvider.exe Rsa_WAS

Le fournisseur par défaut Rsa_WAS a été modifié avec succès.

Créer des nouveaux pools d’applications

Dans cette étape, nous créons deux nouveaux pools d’applications que nous isolons les uns des autres. Pour ce faire, lancez le Gestionnaire IIS :

  1. Cliquez sur Démarrer, puis tapez « INetMgr.exe », puis appuyez sur Entrée (si vous y êtes invité(e), sélectionnez Continuer pour élever vos autorisations).

  2. Cliquez sur le bouton + en regard du nom de votre ordinateur dans la section Connexions.

  3. Cliquez sur Pools d’applications.

  4. Sélectionnez la tâche à droite intitulée Ajouter un pool d’applications.

  5. Entrez le nom « AppPool1 », puis appuyez sur OK comme indiqué :

    Screenshot of the Add Application Pool dialog box with a focus on the O K option.

  6. Répétez les étapes précédentes, mais cette fois,utilisez le nom AppPool2.

  7. Vous voyez maintenant l’écran suivant dans IIS :
    Screenshot of the Application Pools screen showing a list of application pools on the server.

  8. Notez comment l’identité pour AppPool1 et AppPool2 sont NetworkService. Nous allons modifier ce paramètre pour qu’il corresponde aux comptes que nous avons créés précédemment en faisant un clic droit sur AppPool1, puis en sélectionnant Paramètres avancés

  9. Sous le titre Modèle de processus :

    • Cliquez sur le bouton à droite des mots Identité.

    • Dans la fenêtre Identité du pool d’applications, sélectionnez la case d’option « Compte personnalisé », puis cliquez sur le bouton « Définir... ».

    • Entrez le nom d’utilisateur et le mot de passe suivants dans la boîte de dialogue Définir les informations d’identification.

      nom d’utilisateur : AppPoolIdentity1
      mot de passe : password1

      Screenshot of the Set Credentials dialog, showing the User name, Password, and Confirm password fields.

  10. Maintenant, la valeur Identité doit apparaître comme indiqué ci-dessous :

    Screenshot of the Advanced Settings dialog box with the Identity value being highlighted in the Process Model section.

  11. Cliquez sur OK pour enregistrer vos modifications.

  12. Répétez l’étape précédente pour AppPool2 et utilisez le nom d’utilisateur « AppPoolIdentity2 » et le mot de passe « password2 ».

  13. Vous voyez les éléments suivants affichés dans le Gestionnaire IIS (principalement les identités pour les pools d’applications ont changé) :

    Screenshot of the Application Pools showing the changed identities for the applications pools.

  14. Vérifiez les modifications à l’aide du Bloc-notes Windows et ouvrez le fichier %SystemRoot%\System32\Inetsrv\applicationHost.config. Accédez à la section applicationPools et vous verrez que nous avons chiffré les mots de passe du pool d’applications à l’aide de la clé Rsa_WAS, comme prévu :

    password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAAUkBfhWFbUHIt/qtlo+P7CiZC10r9H0DGBvAl
                 U2mhiOxMoHXX6Dz0S8TQjKx2YTKvuE8y+SBUWrEs3JYzXKOkY45Q9z6E/3BFvru5oR9uzbjInASKF/83N
                 N1tIEsoorQWmUOjnL4XM9RNzpqkY6TgyC3CyPUGN9fR7li5+AUupHHfgVPMzcLHfCsoq+ri+X6IbEnJdu
                  cUEAYBn1P9F/Zxk=:enc]" />
                  password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAEbQEa/sAmyLbryAR0hD3voip2+0RfzM44sXPekp
                  I2H7HYLzta55NfLcG8vSPHhasahKVgO4wcIcT03CLSn+5koWvAaIRdeClhXWK/X8ZQPFooOpyhOqT0TEP5v
                  jB+DXAKgq0RC6ufHFtrHMy0U69ew7/49YXEcrkF+o8OJZ1K+EkgA3J2ikHKxW0pFBU0tFvLCjt2/UXypfNI
                  0hYPe2syk=:enc]" />
    

Verrouillage des fournisseurs de chiffrement

Par défaut, le IIS_IUSRS reçoit un accès en lecture aux clés lorsqu’elles sont créées. Toutefois, vous pouvez utiliser l’outil ASPNET_REGIIS pour supprimer cet accès. Pour ce faire, exécutez les commandes suivantes à partir de l’invite de commandes avec élévation de privilèges :

cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr iisWasKey IIS_IUSRS

Cela a empêché IIS_IUSRS (le groupe d’identités du pool d’applications) de lire la clé iisWasKey, qui est destinée uniquement aux administrateurs et à l’accès LOCALSYSTEM.

Isolation des processus de travail

Cette rubrique explique comment configurer l’isolation des processus de travail en créant deux nouveaux sites qui font partie de différents pools d’applications et qui ont des identités d’authentification anonymes différentes. Nous créons ensuite un nouveau fournisseur RSA pour chaque pool d’applications pour chiffrer les mots de passe anonymes.

Créer des nouveaux sites

Dans cette section, nous créons deux nouveaux sites et ajoutons chaque site à un pool d’applications que nous avons créé précédemment. Pour commencer, ouvrez l’interpréteur de commandes s’exécutant sous des droits d’administration en procédant comme suit :

  1. Cliquez sur le menu Démarrer.

  2. Faites un clic droit sur Invite de commandes.

  3. Sélectionnez Exécuter en tant qu'administrateur.

  4. Dans la fenêtre de commande, accédez à votre répertoire wwwroot à l’aide de la commande suivante :

    cd /d %SystemDrive%\inetpub\wwwroot
    
  5. Créez un nouveau répertoire nommé « un » et un répertoire « deux » à l’aide des commandes suivantes :

    mkdir one
    
    mkdir two
    
  6. Créez un fichier de base Default.htm dans les répertoires « un » et « deux » qui contiennent le code HTML suivant :

    <html><body>Hello from site X</body></html>
    

    Remarque

    Remplacez « X » par « un » ou « deux » en fonction de l’emplacement du répertoire du fichier.

Utilisez maintenant le gestionnaire IIS pour créer deux sites :

  1. Cliquez sur Démarrer, tapez INetMgr.exe, puis appuyez sur Entrée (si vous y êtes invité(e), sélectionnez Continuer pour élever vos autorisations).

  2. Cliquez sur le bouton + en regard du nom de votre ordinateur dans la section Connexions.

  3. Faites un clic droit sur Site dans l’arborescence sous Connexions, puis sélectionnez Ajouter un site web.

  4. Utilisez les informations suivantes pour créer votre site :

    Nom du site web : un
    Pool d’applications : AppPool1
    Chemin d’accès physique : {emplacement de votre répertoire inetpub}\wwwroot\one
    Port : 81

    Cela doit ressembler à ce qui suit lorsque vous avez terminé :

    Screenshot of the Add Web Site dialog with the Site name field being populated by the One entry.

  5. Cliquez sur OK pour enregistrer les modifications.

  6. Répétez les deux étapes précédentes, mais cette fois, utilisez les informations suivantes pour le second site :

    Nom du site web : deux
    Pool d’applications : AppPool2
    Chemin d’accès physique : {emplacement de votre répertoire inetpub}\wwwroot\two
    Port : 82

Vous avez maintenant créé deux nouveaux sites nommés Un et Deux, puis les avez ajoutés aux pools d’applications AppPool1 et AppPool2.

Les URL permettant de tester vos sites sont les suivantes :

  • http://localhost:81 pour le site Un
  • http://localhost:82 pour le site Deux

Créer des nouveaux fournisseurs pour chaque pool d’applications

Dans cette section, nous créons un nouveau fournisseur RSA pour chacun des pools d’applications :

  1. Cliquez sur le menu Démarrer.

  2. Faites un clic droit sur Invite de commandes.

  3. Sélectionnez Exécuter en tant qu'administrateur.

  4. Dans la fenêtre de commande à exécuter, accédez à l’emplacement où vous avez enregistré votre createProvider.exe et exécutez la commande suivante :

    createProvider.exe App1Key RsaKeyForAppPool1 Rsa_app1
    createProvider.exe App2Key RsaKeyForAppPool2 Rsa_app2
    

Définissez le compte anonyme pour le site un

Dans votre fenêtre d’invite de commandes avec élévation de privilèges, exécutez la commande suivante :

setProvider.exe Rsa_app1
  1. Revenez au Gestionnaire IIS, puis double-cliquez sur le site Un.

  2. Double-cliquez sur l’élément Authentification sous le titre Nom de fonctionnalité.

  3. Sélectionnez Authentification anonyme, puis cliquez sur Modifier sous le titre Tâches sur le côté droit, ce qui affiche la boîte de dialogue Modifier les informations d’identification d’authentification anonyme .

  4. Cliquez sur l’option Utilisateur spécifique, puis cliquez sur le bouton Définir.

  5. Entrez le nom d’utilisateur AnonymousAccount1 et le mot de passe password3 puis sélectionnez OK.

  6. La boîte de dialogue suivante s’affiche :

    Screenshot of the Edit Anonymous Authentication Credentials dialog box.

  7. Appuyez sur OK pour enregistrer vos modifications.

Définissez le compte anonyme pour le site deux

Dans votre fenêtre d’invite de commandes avec élévation de privilèges, exécutez la commande suivante :

setProvider.exe Rsa_app2
  1. Revenez au Gestionnaire IIS, puis double-cliquez sur le site Deux.
  2. Double-cliquez sur l’élément Authentification sous le titre Nom de fonctionnalité.
  3. Sélectionnez Authentification anonyme, puis cliquez sur Modifier sous le titre Tâches sur le côté droit, ce qui affiche la boîte de dialogue ModifierInformations d’identification d’authentification anonyme.
  4. Cliquez sur l’option Utilisateur spécifique, puis cliquez sur Définir.
  5. Entrez le nom d’utilisateur AnonymousAccount2 et le mot de passe password4 puis sélectionnez OK.
  6. Cliquez sur OK pour enregistrer vos modifications.

Réinitialisez le fournisseur de chiffrement par défaut

  • Revenez à votre fenêtre d’invite de commandes avec élévation de privilèges et exécutez la commande suivante :
setProvider.exe RsaProtectedConfigurationProvider

Remarque

Cette modification garantit que toutes les propriétés futures chiffrées utilisent le fournisseur de chiffrement par défaut.

Vérifiez les modifications

Vérifiez que ce que nous voulions s’est bien produit. À l’aide du Bloc-notes Windows, ouvrez le fichier %SystemRoot%\System32\Inetsrv\applicationHost.config :

  • Notez que le mot de passe pour AppPool1 et AppPool2 sont toujours protégés avec la clé Rsa_Was.

  • Notez que le mot de passe de AnonymousAccount1 est également protégé par la clé Rsa_app1 :

    password="[enc:Rsa_app1:jAAAAAECAAADZgAAAKQAAKoz4LV7HyPQuyNzXh8gspB0rPG7j3Ijvn3d+jY3/f
        gma8ZxA7AHLUxjis9b0+Qu8XkLvsGn/A+F+m1O68gY1LkWzAcSW9ks81FuiBVhpZx73FzEo6aOz2QqBduJ7Xhu
        x923KMBqmwkIVJ0mVAdzwFIm6LWymwRXxNxDE4eosKsw6QP6Rd6duC8gckaLxrTndclErQYgGdMt3W6ofxzRMlc=:enc]" />
    
  • Enfin, notez que le mot de passe AnonymousAccount2 est également protégé par la clé Rsa_app2 :

    password="[enc:Rsa_app2:jAAAAAECAAADZgAAAKQAAKmHMhCTICEUhGncSGCxQc6ll/QGXo0asEIzOf3rIjl
     sBDGRYhlDQWlf2QbFcIsBGYt8dHo9hzAQN/f03BPSlaFynevpSx4xJOg2/B8ATgPmCg4vgxpY5huZbGxongs55c
       Rr20WFXsxzlUuw1xoUZI8c1+7gQPOtF0Rwh1g8NBmb5ML/R3jAIFcMtVhaj0OOIfAP7JCjdInwztBqK0XO7FM=:enc]" />
    

Verrouillage des fournisseurs de chiffrement

Sécurisez les autorisations de fichier pour nos clés, comme nous l’avons fait précédemment, ci-dessus. Exécutez les commandes suivantes à partir de l’invite de commandes avec élévation de privilèges :

cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr App1Key IIS_IUSRS
aspnet_regiis.exe -pa App1Key   AppPoolIdentity1
aspnet_regiis.exe -pr App2Key IIS_IUSRS
aspnet_regiis.exe -pa App2Key   AppPoolIdentity2

Ces commandes ont supprimé la possibilité pour IIS_IUSRS de lire les clés et ont ajouté uniquement l’identité du pool d’applications qui a besoin d’une autorisation d’accès aux clés.

Test de vos sites

Testez maintenant vos sites :

  • http://localhost:81
  • http://localhost:82

Tout devrait continuer à fonctionner comme avant.

Résumé

En résumé, nous avons effectué les tâches suivantes pour sécuriser les paramètres du pool d’applications :

  • Création de deux pools d’applications
  • Création de deux comptes d’utilisateur locaux et configuration en tant qu’identités de pool d’applications
  • Nous avons créé une clé de chiffrement d’administration et l’avons utilisée pour protéger tous les mots de passe des identités de pool d’applications
  • Nous avons utilisé ASPNET_REGIIS pour empêcher IIS_IUSRS (groupe d’identités de pool d’applications) d’accéder à la clé

Ces tâches garantissent efficacement que seuls les comptes Administrateurs et SYSTEM peuvent lire les mots de passe des pools d’applications. Par conséquent, si les applications au sein d’un pool d’applications tentaient de récupérer les mots de passe de leur (ou de tout) pool d’applications, la tentative échouerait.

Pour isoler les paramètres de processus de travail, nous :

  • Avons créé un nouveau compte d’identité anonyme
  • Nous avons créé un nouveau fournisseur pour le pool d’applications
  • Nous avons chiffré le mot de passe d’authentification anonyme avec la clé du pool d’applications
  • Nous avons supprimé l’accès au fournisseur d’authentification anonyme pour IIS_IUSRS et accordé l’accès uniquement à l’identité du pool d’applications

Cela garantit efficacement que l’identité du pool d’applications peut déchiffrer le mot de passe anonyme auquel elle appartient et personne d’autre.