Comment utiliser PowerShell pour configurer IIS sur plusieurs serveurs

Comment utiliser PowerShell pour configurer IIS sur plusieurs serveurs

PowerShell est un excellent outil pour gérer tout ce qui concerne Windows. Cependant, il peut également faire beaucoup de travail pour vous lors de la configuration des services d’information Internet (IIS) et s’améliore encore lorsque vous pouvez l’utiliser pour configurer en masse les serveurs IIS.

Au fur et à mesure que vous acquérez de plus en plus d’expérience dans la conception/l’administration de systèmes, vous avez tendance à vous demander : « PowerShell peut-il me faciliter la tâche ? Cela commence presque toujours par un tutoriel qui vous aide uniquement à mieux comprendre PowerShell. Compte tenu de la tâche de configuration de divers composants IIS pour plusieurs serveurs, les étapes peuvent être décomposées en étapes logiques, qui sont essentiellement les étapes que vous devez effectuer dans une interface graphique sur un seul serveur Windows. Passons en revue une courte liste d’étapes pour vous aider à démarrer et que vous pouvez éventuellement ajouter pour d’autres configurations :

  • Importation d’un certificat PFX à partir d’un partage distant
  • Créer une nouvelle liaison pour https dans IIS
  • Attachez le certificat importé à l’ancre https
  • Cochez la case « Exiger SSL » dans IIS Manager.
  • Ajoutez une journalisation personnalisée pour obtenir la valeur X-Forwarded-For de l’équilibreur de charge.

La plupart de ces étapes sont de simples clics sur l’interface graphique, alors pourquoi tout cela n’aurait-il pas pu être fait avec quelques commandes PowerShell ? Ou mieux encore, exécuter une liste de plusieurs serveurs distants pour accomplir la même tâche ? La plupart des étapes qui seront présentées dans cet article sont des extraits de code que vous pouvez insérer dans votre structure PowerShell typique. Vous pouvez avoir une journalisation personnalisée et des éléments uniques pour le débogage des scripts PowerShell. Sinon, vous pouvez facilement les lier pour faire rapidement ce que vous devez faire pour vos configurations IIS.

Quelques éléments à mettre en place au préalable

Pour commencer, vous avez besoin de quelques variables. Une liste de travail des serveurs à configurer et un dossier réseau disponible où se trouve le fichier de certificat PFX :

$Servers = Get-Content -Path C:WebServers.txt

$CertFolder = '\FileServer01SharedCerts'

Cela prendra la liste des serveurs du fichier .txt et définira l’emplacement où se trouvera le certificat d’importation.

Si vous l’exécutez sur plusieurs serveurs, vous voudrez éventuellement vous assurer que vous l’exécutez sur des serveurs en ligne. La prochaine utilisation de l’applet de commande Test-Connection consiste à envoyer un ping à chaque serveur au moins une fois pour s’assurer qu’il est actif avant de continuer. Si le serveur est en ligne, la logique copie le dossier du partage réseau contenant le certificat vers le dossier C:WindowsTemp sur le serveur distant. De cette façon, l’applet de commande Invoke-Command pour importer le certificat ne rencontrera pas de problèmes d’autorisation lors de la copie à partir d’un emplacement réseau :

foreach ($Server in $Servers) {

if (Test-Connection -ComputerName $Server -Quiet -Count 1) {

Copy-Item -Path $CertFolder`

-Destination \\$Server\C$\Windows\Temp\CertAssets `

-Récursivité -Force

Write-Host « Actifs copiés avec succès ! »

}

autre {

Write-Host « $Server semble être hors ligne ! »

}

…code illustré ci-dessous…

}

Notez qu’il est utile de donner des commentaires à la console avec des lignes Write-Host lorsque vous exécutez ceci. Ce serait également bien d’ajouter à un journal existant si vous enveloppez votre script avec. Nous savons maintenant quels serveurs sont en ligne et ont des actifs copiés localement. Nous sommes maintenant prêts à aller de l’avant.

Importer le certificat et créer une nouvelle liaison

Cette action est effectuée à l’aide de l’applet de commande Invoke-Command, qui exécute cette action localement sur chaque serveur. Selon le niveau de sécurité que vous souhaitez mettre en œuvre, vous pouvez effectuer certaines opérations avec le mot de passe requis pour importer le certificat PFX. Vous pouvez l’enregistrer à la volée à l’aide de Get-Credential, ou vous pouvez simplement entrer le mot de passe en texte brut intégré dans la commande utilisée pour importer. Je suggérerais au moins de sécuriser le mot de passe avec Get-Credential, bien qu’il existe de nombreuses autres façons de saisir un mot de passe en toute sécurité ici. Pour collecter le mot de passe, vous pouvez utiliser :

$MyPwd = Get-Credential -UserName 'Enter password below' -Message 'Enter password below'

Cela stockera le mot de passe du certificat sans avoir à avoir le mot de passe en texte brut dans votre script. Nous allons passer cette variable locale à la commande distante à l’aide du composant $Using:. Étant donné que Invoke-Command et son bloc de script qui l’accompagne s’exécutent dans une portée différente (locale à la machine distante), il n’a connaissance d’aucune variable locale définie en dehors du bloc de script. Cela vous permet de transmettre toutes les variables locales à la session distante et de les utiliser de manière appropriée.

Nous allons importer le certificat dans le magasin de certificats du compte personnel (Mon) ordinateur.

Le code suivant effectue ces étapes :

  1. Démarrer un processus sur un serveur distant
  2. Action d’importation à l’aide du mot de passe fourni à l’étape Get-Credential
  3. Créez une liaison https sur le port 443.
  4. Ajouter un certificat importé à une ancre https

*Ceci est toujours dans la boucle foreach définie ci-dessus :

Invoke-Command -ComputerName $Server -ScriptBlock {

$SiteName = « Mon site Web »

Import-PfxCertificate -Mot de passe $Using:MyPwd.Password`

-CertStoreLocation Cert :\LocalMachine\Mon `

-FilePath C:\Windows\Temp\CertAssets\MyCert.pfx

Import-Module WebAdministration

Nouveau-WebBinding -Name $SiteName -IP « * » -Port 443 -Protocole https

$SSLCert = Get-ChildItem -Path Cert:\LocalMachine\Mon `

| Où-Objet {$_.Subject.Contains(« CertFriendlyName »)}

$Binding = Get-WebBinding -Name $SiteName -Protocol « https »

$Binding.AddSslCertificate($SSLCert.GetCertHashString(), « Mon »)

Write-Host « Installation réussie sur : $env:COMPUTERNAME »

}

En plus de toute sortie que vous forcez à envoyer à la console dans le cadre de votre propre configuration, il y aura également une sortie pour l’action d’importation de certificat après son importation réussie.

Il est également bon de nettoyer votre désordre, alors ajoutez quelques lignes pour supprimer le dossier de fichiers. pfx qui a été copié sur la machine. Ce sera à l’intérieur de la boucle foreach, de préférence vers la fin :

Remove-Item -Path "\\$Server\C$\Windows\temp\CertAssets"-Recurse -Force

Write-Host "Cleanup on $Server completed!"

Exiger SSL sur votre site

Cet extrait de commande suivant sera utilisé lors du déploiement du déploiement. Si vous voulez qu’il soit requis immédiatement, ajoutez-le simplement au reste du code ci-dessus et vous êtes prêt à partir. Vous pouvez avoir un déploiement progressif où vous souhaiterez peut-être l’activer sur des serveurs spécifiques. Dans tous les cas, vous le créez, l’essentiel de l’oeuvre sera dans ces quelques lignes :

Import-Module WebAdministration

Set-WebConfiguration -Emplacement « Mon site Web »`

-Filter 'system.webserver/security/access' -Value "Ssl"

Notez que le paramètre -Location est le nom du site IIS qui requiert SSL. Cela forcera maintenant toutes les connexions sécurisées à votre nouvelle ancre avec le certificat approprié. Dans l’interface graphique, cela équivaudrait à cliquer sur l’icône « Paramètres SSL » dans le gestionnaire IIS pour votre site spécifique et à cocher la case « Require SSL » :

Configuration des options de journalisation IIS

Si vous gérez une flotte de serveurs IIS qui se trouvent derrière un équilibreur de charge, vous pouvez tirer parti des informations que l’équilibreur de charge collecte à partir des connexions entrantes. En supposant que votre équilibreur de charge particulier est configuré pour capturer la valeur X-Forwarded-For, vous pouvez obtenir les adresses IP entrantes de toutes les connexions entrantes vers vos serveurs IIS et les afficher dans les journaux IIS connus. Ceci est particulièrement utile lorsqu’il s’agit de résoudre les problèmes de suivi de connexion de certaines ressources qui peuvent avoir causé des erreurs sur un serveur particulier.

Par conséquent, IIS ne collecte pas la valeur X-Forwarded-For. Elle doit être configurée en tant que valeur personnalisée afin qu’IIS puisse la capturer et l’enregistrer. Il existe également un moyen de configurer cela dans l’interface graphique, mais vous pouvez ajouter cette commande à notre script de provisioning actuel pour l’avoir en place dès le début :

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `

-Filtre « system.applicationHost/sites/siteDefaults/logFile/customFields »`

-Nom « . »`

-Value @{logFieldName='X-Forwarded-For';sourceName='X-Forwarded-For';sourceType='RequestHeader'}

Une fois terminé, vous pouvez vérifier que ce champ personnalisé a été ajouté à IIS au niveau du serveur en ouvrant IIS Manager et en cliquant sur My Server > Logging > Log File : Select Fields…

Une fois cela fait, vous pourrez voir les adresses IP des connexions entrantes vers vos serveurs IIS dans les journaux IIS traditionnels.

Ce ne sont là que quelques exemples des paramètres que vous pouvez configurer sur vos serveurs IIS. Plus vous gérez et configurez de serveurs de la même manière, plus vous économisez de clics, ce qui est toujours une bonne chose. Je suggère de tester différentes commandes pour les paramètres souhaités sur le même serveur. Une fois que vous avez un processus pour ce serveur, il peut être répété sur autant de serveurs que vous le souhaitez avec la structure donnée ici dans cet article.

Cela devrait être plus que suffisant pour commencer à gagner du temps et disposer d’un déploiement IIS plus standardisé dans votre environnement.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *