Come utilizzare PowerShell per configurare IIS su più server

Come utilizzare PowerShell per configurare IIS su più server

PowerShell è un ottimo strumento per gestire tutto ciò che riguarda Windows. Tuttavia, può anche svolgere un bel po’ di lavoro durante la configurazione di Internet Information Services (IIS) e migliora ulteriormente quando è possibile utilizzarlo per configurare in blocco i server IIS.

Man mano che acquisisci sempre più esperienza di progettazione/amministrazione del sistema, tendi a chiederti: “PowerShell può renderlo più facile per me?” Inizia quasi sempre con un tutorial che ti aiuta solo a capire meglio PowerShell. Considerando l’attività di configurazione di vari componenti IIS per più server, i passaggi possono essere suddivisi in passaggi logici, che sono fondamentalmente i passaggi che devi completare in una GUI su un singolo server Windows. Esaminiamo un breve elenco di passaggi per iniziare e che puoi aggiungere facoltativamente per ulteriori configurazioni:

  • Importazione di un certificato PFX da una condivisione remota
  • Crea una nuova associazione per https in IIS
  • Allega il certificato importato all’ancora https
  • Seleziona la casella “Richiedi SSL” in Gestione IIS.
  • Aggiungi la registrazione personalizzata per ottenere il valore X-Forwarded-For dal servizio di bilanciamento del carico.

La maggior parte di questi passaggi sono semplici clic della GUI, quindi perché non è stato possibile eseguire tutto con alcuni comandi di PowerShell? O meglio ancora, eseguire un elenco di più server remoti per eseguire la stessa attività? La maggior parte dei passaggi che verranno illustrati in questo post sono frammenti di codice che puoi inserire nella tua tipica struttura di PowerShell. È possibile avere registrazioni personalizzate ed elementi univoci per il debug degli script di PowerShell. In caso contrario, puoi facilmente collegarli insieme per eseguire rapidamente ciò che devi fare per le tue configurazioni IIS.

Alcune cose da impostare in anticipo

Per iniziare, hai bisogno di alcune variabili. Un elenco di lavoro di server da configurare e una cartella di rete disponibile in cui si trova il file del certificato PFX:

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

$CertFolder = '\FileServer01SharedCerts'

Questo prenderà l’elenco dei server dal file .txt e imposterà la posizione in cui verrà trovato il certificato di importazione.

Se lo eseguirai su più server, alla fine vorrai assicurarti di essere in esecuzione su server online. Il prossimo utilizzo del cmdlet Test-Connection consiste nel eseguire il ping di ogni server almeno una volta per assicurarsi che sia attivo prima di procedere. Se il server è online, la logica copierà la cartella dalla condivisione di rete contenente il certificato nella cartella C:WindowsTemp sul server remoto. In questo modo, il cmdlet Invoke-Command per importare il certificato non incorrerà in problemi di autorizzazione durante la copia da un percorso di rete:

foreach ($Server in $Servers) {

if (Connessione di prova -NomeComputer $Server -Silenzioso -Conteggio 1) {

Copia-elemento -Percorso $CertFolder`

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

-Ricorrenza -Forza

Write-Host “Risorse copiate correttamente!”

}

altro {

Write-Host “$Server sembra essere offline!”

}

…codice mostrato di seguito…

}

Nota che è utile fornire un feedback alla console con le righe Write-Host quando esegui questo. Sarebbe anche bello aggiungere a un registro esistente se si avvolge lo script con esso. Ora sappiamo quali server sono online e hanno risorse copiate localmente. Ora siamo pronti per andare avanti.

Importa il certificato e crea una nuova associazione

Questa azione viene eseguita utilizzando il cmdlet Invoke-Command, che esegue questa azione localmente su ogni server. A seconda del livello di sicurezza che vuoi implementare, puoi fare alcune cose con la password necessaria per importare il certificato PFX. Puoi salvarlo al volo usando Get-Credential, oppure puoi semplicemente inserire la password in testo normale incorporata nel comando utilizzato per l’importazione. Suggerirei almeno di proteggere la password con Get-Credential, anche se ci sono molti altri modi per inserire una password in modo sicuro qui. Per raccogliere la password puoi utilizzare:

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

Questo memorizzerà la password del certificato senza dover avere la password in testo normale all’interno dello script. Passeremo questa variabile locale al comando remoto usando il componente $Using:. Poiché Invoke-Command e il relativo blocco di script vengono eseguiti in un ambito diverso (locale per la macchina remota), non è a conoscenza di alcuna variabile locale definita al di fuori del blocco di script. Ciò consente di passare qualsiasi variabile locale alla sessione remota e utilizzarla in modo appropriato.

Importeremo il certificato nell’archivio certificati dell’account personale (Il mio) computer.

Il codice seguente esegue questi passaggi:

  1. Avvio di un processo su un server remoto
  2. Importa l’azione utilizzando la password fornita dal passaggio Ottieni credenziali
  3. Crea un’associazione https sulla porta 443.
  4. Aggiunta di un certificato importato a un’ancora https

*Questo è ancora all’interno del ciclo foreach definito sopra:

Invoke-Command -ComputerName $Server -ScriptBlock {

$SiteName = “Il mio sito web”

Import-PfxCertificate -Password $Using:MyPwd.Password`

-CertStoreLocation Cert:\LocalMachine\My `

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

Import-Modulo WebAdministration

Nuovo-WebBinding -Nome $SiteName -IP “*” -Porta 443 -Protocollo https

$SSLCert = Get-ChildItem -Certificato percorso:\LocalMachine\My `

| Where-Object {$_.Subject.Contains(“CertFriendlyName”)}

$Binding = Ottieni-WebBinding -Nome $SiteName -Protocollo “https”

$Binding.AddSslCertificate($SSLCert.GetCertHashString(), “Mio”)

Write-Host “Installazione riuscita su: $env:COMPUTERNAME”

}

Oltre a qualsiasi output che si forza l’output alla console come parte della propria configurazione, ci sarà anche dell’output per l’azione di importazione del certificato dopo che è stato importato correttamente.

È anche utile ripulire il tuo pasticcio, quindi aggiungi alcune righe per rimuovere la cartella dei file. pfx che è stato copiato nella macchina. Questo sarà all’interno del foreach loop, preferibilmente vicino alla fine:

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

Write-Host "Cleanup on $Server completed!"

Richiedi SSL sul tuo sito

Il prossimo frammento di comando verrà utilizzato durante la distribuzione della distribuzione. Se vuoi che sia richiesto subito, aggiungilo al resto del codice sopra e sei a posto. Potresti avere un’implementazione graduale in cui potresti voler abilitarlo su server specifici. In ogni caso, lo crei, l’essenza del lavoro sarà in queste poche righe:

Import-Module WebAdministration

Set-WebConfiguration -Posizione “Il mio sito Web”`

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

Si noti che il parametro -Location è il nome del sito IIS che richiede SSL. Questo ora forzerà tutte le connessioni sicure al tuo nuovo ancoraggio con il certificato appropriato. Nella GUI, ciò equivarrebbe a fare clic sull’icona “Impostazioni SSL” in Gestione IIS per il tuo sito specifico e selezionare la casella “Richiedi SSL”:

Configurazione delle opzioni di registrazione IIS

Se gestisci un parco di server IIS dietro un servizio di bilanciamento del carico, puoi sfruttare le informazioni che il servizio di bilanciamento del carico raccoglie dalle connessioni in ingresso. Supponendo che il tuo particolare sistema di bilanciamento del carico sia configurato per acquisire il valore X-Forwarded-For, puoi ottenere gli indirizzi IP in ingresso di tutte le connessioni in ingresso ai tuoi server IIS e visualizzarli nei registri IIS noti. Ciò è particolarmente utile quando si tratta di risolvere i problemi di rilevamento della connessione da determinate risorse che potrebbero aver causato errori su un determinato server.

Pertanto, IIS non raccoglie il valore X-Forwarded-For. Deve essere configurato come valore personalizzato in modo che IIS possa acquisirlo e registrarlo. C’è anche un modo per configurarlo nella GUI, ma puoi aggiungere questo comando al nostro script di provisioning corrente per averlo in atto dall’inizio:

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

-Filtra “system.applicationHost/sites/siteDefaults/logFile/customFields”`

-Nome “.”`

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

Una volta completato, puoi verificare che questo campo personalizzato sia stato aggiunto a IIS a livello di server aprendo Gestione IIS e facendo clic su Il mio server > Registrazione > File di registro: Seleziona campi…

Una volta fatto, sarai in grado di vedere gli indirizzi IP per le connessioni in entrata ai tuoi server IIS nei registri IIS tradizionali.

Questi sono solo alcuni esempi delle impostazioni che puoi configurare sui tuoi server IIS. Più server gestisci e configuri allo stesso modo, più clic risparmi, il che è sempre positivo. Suggerisco di testare comandi diversi per le impostazioni desiderate sullo stesso server. Una volta che hai un processo per quell’unico server, può essere ripetuto su tutti i server che vuoi con la struttura fornita qui in questo post.

Questo dovrebbe essere più che sufficiente per iniziare a risparmiare tempo e avere una distribuzione IIS più standardizzata nel tuo ambiente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *