Comment utiliser PowerShell pour configurer IIS sur plusieurs serveurs
Agence web » Actualités du digital » 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. Néanmoins, 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 les serveurs IIS en masse.

Au fur et à mesure que vous devenez de plus en plus expérimenté dans le travail d’ingénierie/d’administration des systèmes, vous avez tendance à vous demander : « PowerShell peut-il me faciliter la tâche ? Cela commence presque toujours par un parcours d’apprentissage qui vous aide à mieux comprendre PowerShell. En pensant à 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 prendriez dans l’interface graphique sur un seul serveur Windows. Travaillons avec une courte liste d’étapes qui peuvent vous aider à démarrer et qui peuvent être ajoutées pour d’autres configurations, si vous le souhaitez :

  • Importer un certificat PFX à partir d’un partage distant
  • Créer une nouvelle liaison pour https dans IIS
  • Attachez le certificat importé à la liaison https
  • Cochez la case « Exiger SSL » dans IIS Manager
  • Ajouter une journalisation personnalisée pour récupérer la valeur X-Forwarded-For à partir d’un équilibreur de charge

La plupart de ces étapes sont des clics simples dans l’interface graphique, alors pourquoi tout cela ne pourrait-il pas être fait avec une poignée de commandes PowerShell ? Mieux encore, exécuter une liste de plusieurs serveurs distants pour effectuer la même tâche ? Une grande partie des étapes qui seront démontrées dans cet article seront des extraits de code que vous pouvez déposer dans votre structure PowerShell typique. Vous pouvez avoir une journalisation personnalisée et des éléments propres à la façon dont vous déboguez les scripts PowerShell. Sinon, vous pouvez facilement les combiner pour une rotation rapide de ce que vous devez compléter pour vos configurations IIS.

Quelques éléments à mettre en place

Quelques variables sont nécessaires pour commencer. Une liste de travail des serveurs à configurer et un partage réseau accessible où se trouve le fichier de certificat PFX :

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

Cela récupérera la liste des serveurs du fichier TXT et définira un emplacement où se trouvera le certificat à importer.

Si vous l’exécutez sur plusieurs serveurs, vous voudrez éventuellement vous assurer que vous travaillez sur des serveurs en ligne. L’utilisation suivante de l’applet de commande Test-Connection pour 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 du serveur distant. De cette façon, l’applet de commande Invoke-Command pour importer le certificat ne rencontrera pas de problèmes d’autorisations 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 $ServerC$WindowsTempCertAssets `
          -Recurse -Force
          Write-Host "Assets successfully copied!"
     }
     else {
          Write-Host "$Server appears to be offline!"
     }
...code demonstrated below...
}

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

Importer le certificat et créer une nouvelle liaison

Cette action est complétée par l’applet de commande Invoke-Command qui exécutera cette action localement sur chaque serveur. Selon le niveau de sécurité que vous souhaitez incorporer, vous pouvez faire certaines choses avec le mot de passe nécessaire pour importer le certificat PFX. Vous pouvez le stocker à la volée à l’aide de Get-Credential ou vous pouvez simplement saisir le mot de passe en texte brut en ligne avec la commande utilisée pour l’importation. Je suggérerais de sécuriser le mot de passe en utilisant Get-Credential au minimum, bien qu’il existe de nombreuses autres façons d’injecter le mot de passe en toute sécurité ici. Pour récolter le mot de passe, vous pouvez utiliser :

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

Demander le mot de passe après la cmdlet Get-Credential

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 dans la commande distante en utilisant le 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 ne sait rien des variables locales définies en dehors du bloc de script. Cela vous permet de transmettre toutes les variables locales à la session distante et de les utiliser en conséquence.

Nous allons importer le certificat dans le magasin de certificats Personnel (Mon) du compte machine.

Le code suivant décrit ces étapes :

  1. Le démarrage du processus sur le serveur distant
  2. L’action d’importation à l’aide du mot de passe fourni à l’étape Get-Credential
  3. Créer une liaison https sur le port 443
  4. Ajout du certificat importé à la liaison https

* Cela tombe toujours dans la boucle foreach définie ci-dessus :


Invoke-Command -ComputerName $Server -ScriptBlock {
     $SiteName = "My Web Site"
     Import-PfxCertificate -Password $Using:MyPwd.Password `
          -CertStoreLocation Cert:LocalMachineMy `
          -FilePath C:WindowsTempCertAssetsMyCert.pfx
     Import-Module WebAdministration
     New-WebBinding -Name $SiteName -IP "*" -Port 443 -Protocol https
     $SSLCert = Get-ChildItem -Path Cert:LocalMachineMy `
          | Where-Object {$_.Subject.Contains("CertFriendlyName")}
     $Binding = Get-WebBinding -Name $SiteName -Protocol "https"
     $Binding.AddSslCertificate($SSLCert.GetCertHashString(), "My")
     Write-Host "Setup successful on: $env:COMPUTERNAME"
}

En plus de toute sortie que vous forcez sur la console dans le cadre de votre propre personnalisation, il y aura également une sortie pour l’action d’importation de certificat une fois qu’elle aura été importée avec succès.

Il est également bon de nettoyer vos dégâts, alors ajoutez quelques lignes pour supprimer le dossier contenant le fichier .pfx qui a été copié sur la machine. Cela résidera à l’intérieur de la boucle foreach, de préférence vers la fin :

Remove-Item -Path "$ServerC$WindowstempCertAssets" -Recurse -Force
Write-Host "Cleanup on $Server completed!"

Exiger SSL sur votre site

Ce prochain bit de commandes sera utilisé quelle que soit la façon dont vous déployez votre déploiement. Si vous voulez que cela soit requis immédiatement, ajoutez-le simplement avec le reste du code ci-dessus et vous avez terminé. Vous pouvez avoir un déploiement progressif qui peut vous amener à vouloir l’activer sur des serveurs spécifiques. Quelle que soit la façon dont vous créez cela, la viande du travail sera ces quelques lignes:

Import-Module WebAdministration
Set-WebConfiguration -Location "My Web Site" `
     -Filter 'system.webserver/security/access' -Value "Ssl"

Remarquez que le -Emplacement Le paramètre est le nom du site IIS pour lequel vous souhaitez exiger SSL. Cela forcera désormais toutes les connexions sécurisées à votre nouvelle liaison avec son certificat associé. Ce serait l’équivalent graphique de cliquer sur l’icône Paramètres SSL dans le gestionnaire IIS pour votre site particulier et de vérifier le Exiger SSL boîte:

Paramètre IIS pour exiger SSL

Personnaliser les options de journalisation IIS

Si vous gérez une flotte de serveurs IIS situés 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 le X-transféré-pour valeur, vous pouvez saisir l’adresse IP entrante de toutes les connexions entrantes vers vos serveurs IIS et les afficher dans les journaux IIS bien connus. Ceci est particulièrement utile lorsqu’il s’agit de résoudre des problèmes dans lesquels vous devez suivre les connexions à partir de ressources spécifiques qui peuvent avoir rencontré des erreurs sur un serveur particulier.

En résumé, IIS ne collecte pas la valeur X-Forwarded-For. Il doit être configuré en tant que valeur personnalisée pour IIS à saisir et à enregistrer. Il existe également un moyen de configurer cela dans l’interface graphique, mais vous pouvez ajouter cette commande dans notre script de provisionnement actuel pour que cela soit en place dès le début :

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
     -Filter "system.applicationHost/sites/siteDefaults/logFile/customFields" `
     -Name "." `
     -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 à la niveau serveur en ouvrant IIS Manager et en cliquant sur MonServeur > Journalisation > Fichier journal : Sélectionner les champs…

Paramètres de journalisation IIS

Une fois cela en place, 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 de serveurs et sont configurés de la même manière, plus vous économiserez de clics, ce qui est toujours une bonne chose. Je suggère de tester les différentes commandes pour vos paramètres souhaités sur un serveur. Une fois que vous avez le processus pour ce serveur unique, il peut être répété sur autant de fois que vous le souhaitez avec la structure donnée ici dans cet article. Cela devrait être plus que suffisant pour vous permettre de gagner du temps et d’avoir un déploiement IIS plus standardisé dans votre environnement.