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
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(); } } }
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.
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
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(); } } }
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.
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 :
- Cliquez sur le menu Démarrer.
- Faites un clic droit sur Invite de commandes.
- Sélectionnez Exécuter en tant qu'administrateur.
- 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
- Cliquez sur le menu Démarrer.
- Faites un clic droit sur Invite de commandes.
- Sélectionnez Exécuter en tant qu'administrateur.
- 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 :
- Cliquez sur le menu Démarrer.
- Faites un clic droit sur Invite de commandes.
- Sélectionnez Exécuter en tant qu'administrateur.
- 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 :
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).
Cliquez sur le bouton + en regard du nom de votre ordinateur dans la section Connexions.
Cliquez sur Pools d’applications.
Sélectionnez la tâche à droite intitulée Ajouter un pool d’applications.
Entrez le nom « AppPool1 », puis appuyez sur OK comme indiqué :
Répétez les étapes précédentes, mais cette fois,utilisez le nom AppPool2.
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
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
Maintenant, la valeur Identité doit apparaître comme indiqué ci-dessous :
Cliquez sur OK pour enregistrer vos modifications.
Répétez l’étape précédente pour AppPool2 et utilisez le nom d’utilisateur « AppPoolIdentity2 » et le mot de passe « password2 ».
Vous voyez les éléments suivants affichés dans le Gestionnaire IIS (principalement les identités pour les pools d’applications ont changé) :
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 :
Cliquez sur le menu Démarrer.
Faites un clic droit sur Invite de commandes.
Sélectionnez Exécuter en tant qu'administrateur.
Dans la fenêtre de commande, accédez à votre répertoire wwwroot à l’aide de la commande suivante :
cd /d %SystemDrive%\inetpub\wwwroot
Créez un nouveau répertoire nommé « un » et un répertoire « deux » à l’aide des commandes suivantes :
mkdir one
mkdir two
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 :
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).
Cliquez sur le bouton + en regard du nom de votre ordinateur dans la section Connexions.
Faites un clic droit sur Site dans l’arborescence sous Connexions, puis sélectionnez Ajouter un site web.
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 : 81Cela doit ressembler à ce qui suit lorsque vous avez terminé :
Cliquez sur OK pour enregistrer les modifications.
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 Unhttp://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 :
Cliquez sur le menu Démarrer.
Faites un clic droit sur Invite de commandes.
Sélectionnez Exécuter en tant qu'administrateur.
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
Revenez au Gestionnaire IIS, puis double-cliquez sur le site Un.
Double-cliquez sur l’élément Authentification sous le titre Nom de fonctionnalité.
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 .
Cliquez sur l’option Utilisateur spécifique, puis cliquez sur le bouton Définir.
Entrez le nom d’utilisateur AnonymousAccount1 et le mot de passe password3 puis sélectionnez OK.
La boîte de dialogue suivante s’affiche :
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
- Revenez au Gestionnaire IIS, puis double-cliquez sur le site Deux.
- Double-cliquez sur l’élément Authentification sous le titre Nom de fonctionnalité.
- 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 anonymes.
- Cliquez sur l’option Utilisateur spécifique, puis cliquez sur Définir.
- Entrez le nom d’utilisateur AnonymousAccount2 et le mot de passe password4 puis sélectionnez OK.
- 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.