Jak używać programu PowerShell do konfigurowania usług IIS na wielu serwerach
PowerShell to świetne narzędzie do zarządzania wszystkim, co dotyczy systemu Windows. Jednak może również wykonać sporo pracy podczas konfigurowania internetowych usług informacyjnych (IIS) i staje się jeszcze lepszy, gdy można go użyć do zbiorczej konfiguracji serwerów IIS.
W miarę zdobywania coraz większego doświadczenia w projektowaniu/administrowaniu systemami, często zadajesz sobie pytanie: „Czy PowerShell może mi to ułatwić?” Prawie zawsze zaczyna się od samouczka, który tylko pomaga lepiej zrozumieć PowerShell. Biorąc pod uwagę zadanie konfigurowania różnych komponentów IIS dla wielu serwerów, kroki można podzielić na logiczne kroki, które w zasadzie są krokami, które należy wykonać w graficznym interfejsie użytkownika na jednym serwerze Windows. Przeanalizujmy krótką listę kroków, które pomogą Ci rozpocząć, i którą możesz opcjonalnie dodać w celu uzyskania dalszych konfiguracji:
- Importowanie certyfikatu PFX ze zdalnego udziału
- Utwórz nowe powiązanie dla https w IIS
- Dołącz zaimportowany certyfikat do kotwicy https
- Zaznacz pole „Wymagaj SSL” w Menedżerze IIS.
- Dodaj rejestrowanie niestandardowe, aby uzyskać wartość X-Forwarded-For z modułu równoważenia obciążenia.
Większość z tych kroków to proste kliknięcia GUI, więc dlaczego nie można tego wszystkiego zrobić za pomocą kilku poleceń PowerShell? Albo jeszcze lepiej uruchomić listę wielu zdalnych serwerów, aby wykonać to samo zadanie? Większość kroków, które zostaną zademonstrowane w tym poście, to fragmenty kodu, które można wstawić do typowej struktury PowerShell. Możesz mieć niestandardowe rejestrowanie i elementy unikatowe dla debugowania skryptów PowerShell. Jeśli nie, możesz je łatwo połączyć, aby szybko zrobić to, co musisz zrobić dla swoich konfiguracji IIS.
Kilka rzeczy do skonfigurowania wcześniej
Aby rozpocząć, potrzebujesz kilku zmiennych. Robocza lista serwerów do skonfigurowania i dostępny folder sieciowy, w którym znajduje się plik certyfikatu PFX:
$Servers = Get-Content -Path C:WebServers.txt
$CertFolder = '\FileServer01SharedCerts'
Spowoduje to pobranie listy serwerów z pliku .txt i ustawienie lokalizacji, w której zostanie znaleziony certyfikat importu.
Jeśli będziesz uruchamiać to na wielu serwerach, w końcu będziesz chciał się upewnić, że korzystasz z serwerów, które są online. Następnym zastosowaniem polecenia cmdlet Test-Connection jest pingowanie każdego serwera co najmniej raz, aby upewnić się, że jest aktywny przed przejściem dalej. Jeśli serwer jest w trybie online, logika skopiuje folder z udziału sieciowego zawierającego certyfikat do folderu C:WindowsTemp na serwerze zdalnym. W ten sposób polecenie cmdlet Invoke-Command w celu zaimportowania certyfikatu nie napotka problemów z uprawnieniami podczas kopiowania z lokalizacji sieciowej:
foreach ($Server in $Servers) {
if (Test-Connection -ComputerName $Server -Quiet -Count 1) {
Kopiuj element -Ścieżka $CertFolder`
-Destination \\$Server\C$\Windows\Temp\CertAssets `
-Rekurencja -Siła
Write-Host „Zasoby zostały pomyślnie skopiowane!”
}
w przeciwnym razie {
Write-Host „$Server wydaje się być w trybie offline!”
}
…kod zademonstrowany poniżej…
}
Zwróć uwagę, że po uruchomieniu tej opcji przydatne jest przekazanie informacji zwrotnej do konsoli za pomocą linii Write-Host. Byłoby również miło dodać do istniejącego dziennika, jeśli owiniesz nim swój skrypt. Teraz wiemy, które serwery są online, a zasoby są kopiowane lokalnie. Teraz jesteśmy gotowi iść naprzód.
Zaimportuj certyfikat i utwórz nowe powiązanie
Ta akcja jest wykonywana za pomocą polecenia cmdlet Invoke-Command, które wykonuje tę akcję lokalnie na każdym serwerze. W zależności od poziomu bezpieczeństwa, który chcesz wdrożyć, możesz zrobić kilka rzeczy z hasłem wymaganym do zaimportowania certyfikatu PFX. Możesz zapisać je w locie za pomocą Get-Credential lub możesz po prostu wprowadzić hasło w postaci zwykłego tekstu osadzonego w poleceniu użytym do importu. Sugerowałbym przynajmniej zabezpieczenie hasła za pomocą Get-Credential, chociaż istnieje wiele innych sposobów na bezpieczne wprowadzenie hasła tutaj. Aby odebrać hasło możesz użyć:
$MyPwd = Get-Credential -UserName 'Enter password below' -Message 'Enter password below'
Dzięki temu hasło certyfikatu zostanie zapisane bez konieczności umieszczania hasła w postaci zwykłego tekstu w skrypcie. Przekażemy tę zmienną lokalną do polecenia zdalnego za pomocą komponentu $Using:. Ponieważ polecenie Invoke-Command i towarzyszący mu blok skryptu są wykonywane w innym zakresie (lokalnie na komputerze zdalnym), nie są znane żadne zmienne lokalne zdefiniowane poza blokiem skryptu. Pozwala to na przekazanie dowolnych zmiennych lokalnych do sesji zdalnej i odpowiednie ich użycie.
Będziemy importować certyfikat do magazynu certyfikatów konta osobistego (Mój komputer).
Poniższy kod wykonuje te kroki:
- Rozpoczęcie procesu na zdalnym serwerze
- Zaimportuj akcję przy użyciu podanego hasła z kroku Get-Credential
- Utwórz powiązanie https na porcie 443.
- Dodawanie zaimportowanego certyfikatu do kotwicy https
*Jest to nadal w ramach pętli foreach zdefiniowanej powyżej:
Invoke-Command -ComputerName $Server -ScriptBlock {
$SiteName = „Moja witryna internetowa”
Import-PfxCertificate -Password $Using:MyPwd.Password`
-CertStoreLocation Cert:\LocalMachine\My `
-FilePath C:\Windows\Temp\CertAssets\MyCert.pfx
Administracja sieciowa modułu importu
New-WebBinding -Name $SiteName -IP „*” -Port 443 -Protokół https
$SSLCert = Get-ChildItem -Path Cert:\LocalMachine\My `
| Where-Object {$_.Subject.Contains(„CertFriendlyName”)}
$Binding = Get-WebBinding -Name $SiteName -Protokół „https”
$Binding.AddSslCertificate($SSLCert.GetCertHashString(), „Mój”)
Write-Host „Instalacja powiodła się na: $env:NAZWA KOMPUTERA”
}
Oprócz wszelkich danych wyjściowych, które wymuszasz na konsoli w ramach własnej konfiguracji, po pomyślnym zaimportowaniu pojawią się również dane wyjściowe dla akcji importowania certyfikatu.
Dobrze jest też posprzątać bałagan, więc dodaj kilka linijek, aby usunąć folder plików. PFX, który został skopiowany do komputera. Będzie to wewnątrz pętli foreach, najlepiej pod koniec:
Remove-Item -Path "\\$Server\C$\Windows\temp\CertAssets"-Recurse -Force
Write-Host "Cleanup on $Server completed!"
Wymagaj SSL w swojej witrynie
Ten następny fragment polecenia zostanie użyty podczas wdrażania wdrożenia. Jeśli chcesz, aby było to wymagane od razu, po prostu dodaj go do reszty kodu powyżej i gotowe. Możesz mieć stopniowe wdrażanie, w którym możesz chcieć włączyć to na określonych serwerach. W każdym razie tworzysz go, istota pracy będzie w tych kilku linijkach:
Import-Module WebAdministration
Set-WebConfiguration -Lokalizacja „Moja witryna internetowa”`
-Filter 'system.webserver/security/access' -Value "Ssl"
Należy zauważyć, że parametr -Location jest nazwą witryny IIS, która wymaga protokołu SSL. Wymusi to teraz wszystkie bezpieczne połączenia z nową kotwicą z odpowiednim certyfikatem. W GUI byłoby to równoznaczne z kliknięciem ikony „Ustawienia SSL” w Menedżerze IIS dla określonej witryny i zaznaczeniem pola „Wymagaj SSL”:
Konfigurowanie opcji rejestrowania IIS
Jeśli zarządzasz flotą serwerów IIS, które znajdują się za load balancerem, możesz skorzystać z informacji zbieranych przez load balancer z połączeń przychodzących. Zakładając, że dany moduł równoważenia obciążenia jest skonfigurowany do przechwytywania wartości X-Forwarded-For, możesz uzyskać przychodzące adresy IP wszystkich połączeń przychodzących do serwerów IIS i wyświetlić je w znanych dziennikach usług IIS. Jest to szczególnie przydatne w przypadku rozwiązywania problemów ze śledzeniem połączeń z niektórych zasobów, które mogły powodować błędy na określonym serwerze.
W związku z tym usługi IIS nie zbierają wartości X-Forwarded-For. Musi być skonfigurowany jako wartość niestandardowa, aby usługi IIS mogły go przechwycić i zarejestrować. Istnieje również sposób na skonfigurowanie tego w GUI, ale możesz dodać to polecenie do naszego obecnego skryptu udostępniania, aby mieć je na swoim miejscu od samego początku:
Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter „system.applicationHost/sites/siteDefaults/logFile/customFields”`
-Nazwa „.”`
-Value @{logFieldName='X-Forwarded-For';sourceName='X-Forwarded-For';sourceType='RequestHeader'}
Po zakończeniu możesz sprawdzić, czy to niestandardowe pole zostało dodane do usług IIS na poziomie serwera, otwierając Menedżera usług IIS i klikając Mój serwer > Rejestrowanie > Plik dziennika: Wybierz pola…
Gdy to zrobisz, będziesz mógł zobaczyć adresy IP dla połączeń przychodzących do serwerów IIS w tradycyjnych dziennikach IIS.
To tylko kilka przykładów ustawień, które możesz skonfigurować na serwerach IIS. Im więcej serwerów zarządzasz i konfigurujesz w ten sam sposób, tym więcej kliknięć oszczędzasz, co zawsze jest dobre. Proponuję przetestować różne komendy pod kątem pożądanych ustawień na tym samym serwerze. Gdy masz już proces dla tego jednego serwera, możesz go powtórzyć na tylu serwerach, ile chcesz, ze strukturą podaną tutaj w tym poście.
Powinno to wystarczyć, aby zacząć oszczędzać czas i mieć bardziej ustandaryzowane wdrożenie usług IIS w Twoim środowisku.
Dodaj komentarz