Proč automatizovat bezpečnostní aktualizace na Windows Serveru
Bezpečnostní aktualizace jsou klíčovou obranou proti zneužití zranitelností. Na serverech mají zároveň zásadní dopad na dostupnost – špatně načasovaný restart může vyřadit klíčové služby. Cílem je proto vybudovat opakovatelný, auditovatelný a bezpečný proces, který: (1) včas vyhledá a nainstaluje kritické záplaty, (2) minimalizuje výpadky pomocí servisních oken a orchestrace a (3) poskytne důkaz o shodě pro audit. PowerShell je pro tento proces přirozeným nástrojem – nabízí vzdálenou správu, práci s WSUS/MECM, správu clusterů i možnost skripty podepisovat a řídit jejich oprávnění.
Typy aktualizací a terminologie
- LCU (Latest Cumulative Update) – kumulativní měsíční balík oprav, který zahrnuje i dřívější opravy.
- SSU (Servicing Stack Update) – aktualizace instalačního stacku; u novějších verzí je součástí LCU.
- Out-of-band – mimořádné záplaty pro urgentní zranitelnosti (např. 0-day).
- Feature on Demand / .NET – zvláštní kanály; .NET má vlastní kumulativní aktualizace.
- Aktualizace třetích stran – ovladače, firmware, middleware; často se řeší mimo Windows Update.
Volba strategie: WSUS/MECM, Azure Update, nebo přímo Windows Update
- WSUS – místní cache a schvalování, řízení okruhů (rings). Vhodné pro offline/izolovaná prostředí.
- MECM (SCCM) – úplná správa balíků, servisní okna, reporting, aktualizace třetích stran.
- Azure Update Management – plánování, orchestrace a reporty napříč hybridním prostředím (Windows i Linux).
- Windows Update for Business (WUfB) – odložení aktualizací a řízení kanálů pomocí GPO/Intune bez WSUS.
Okruhy (rings) a servisní okna
Zaveďte nasazování ve vlnách: canary → pilot → produkce. Každý okruh má vlastní časové okno a plán obnovy (snapshot/záloha). Zahrňte specifické požadavky pro clusterované role (Hyper-V, S2D, SQL FCI) – zde využijte Cluster-Aware Updating (CAU), které postupně evakuuje uzly a aplikuje aktualizace bez výpadku služby.
Bezpečnost skriptování: podepisování, politiky a JEA
- Podepisování skriptů: používejte certifikát Code Signing a politiku
AllSigned. - Execution Policy: nastavte jednotně (GPO) a zdokumentujte výjimky.
- JEA (Just Enough Administration): publikujte koncové body, které povolují jen schválené rutiny cmdletů s definovanou rolí.
- WDAC/AppLocker: omezte spouštění na podepsané binární soubory a skripty.
# Nastavení politiky a podpis skriptu Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope LocalMachine $cert = Get-ChildItem Cert:CurrentUserMy -CodeSigningCert | Select-Object -First 1 Set-AuthenticodeSignature -FilePath .PatchWindow.ps1 -Certificate $cert Get-AuthenticodeSignature .PatchWindow.ps1 | Format-List
PowerShell remoting: bezpečné připojení a správa ve velkém měřítku
Povolte vzdálenou správu s Kerberem v doméně; na perimetru používejte WinRM přes HTTPS. Pro hromadné operace upřednostňujte Invoke-Command s opakovaně používanými relacemi PSSessions a paralelním zpracováním (-ThrottleLimit).
# Povolení vzdálené správy a vytvoření HTTPS posluchače (zkráceno) Enable-PSRemoting -Force New-SelfSignedCertificate -DnsName 'node01.contoso.local' -CertStoreLocation Cert:LocalMachineMy | Out-Null winrm create winrm/config/Listener?Address=*+Transport=HTTPS "@{Hostname='node01.contoso.local'; CertificateThumbprint='THUMB'}"
Paralelní provedení na více serverech
$servers = 'srv-app01','srv-app02','srv-db01'
Invoke-Command -ComputerName $servers -ScriptBlock { Get-HotFix | Sort InstalledOn -Descending } -ThrottleLimit 8
Zjištění stavu a shody: co je nainstalováno a co chybí
Get-HotFix– rychlý přehled nainstalovaných aktualizací KB (na novějších typech sestavení nemusí být vždy úplný).Get-WindowsPackage/DISM– přesnější přehled balíčků.- Modul
PSWindowsUpdate– vyhledávání a instalace prostřednictvím Windows Update/WSUS včetně filtrů.
# Inventura KB Get-HotFix | Where-Object {$_.InstalledOn -gt (Get-Date).AddMonths(-2)} | Format-Table -Auto
Výpis balíčků DISM
dism /online /Get-Packages /Format:Table
PSWindowsUpdate – instalace pouze aktualizací zabezpečení a .NET
Install-Module PSWindowsUpdate -Scope AllUsers
Get-WindowsUpdate -MicrosoftUpdate -Category ‚Security Updates‘,’Critical Updates‘,‘.NET Framework‘ -AcceptAll -IgnoreReboot
Řízená instalace z WSUS: schvalování a servisní okna
V prostředích s WSUS schvalujte aktualizace pro cílové skupiny počítačů. Pomocí PowerShellu můžete automatizovat jak schvalování, tak samotnou instalaci na serverech v definovaném okně.
# Jednoduchá orchestrace přes PSWindowsUpdate s WSUS $servers = Get-Content .ring-pilot.txt $sb = { Import-Module PSWindowsUpdate Set-WUSettings -MicrosoftUpdate:$true -WUServer 'http://wsus.contoso.local' -WUStatusServer 'http://wsus.contoso.local' Get-WindowsUpdate -AcceptAll -Install -IgnoreReboot -SendReport -PSWUSettings @{ SmtpServer='smtp.contoso.local'; To='patchops@contoso.local' } } Invoke-Command -ComputerName $servers -ScriptBlock $sb -AsJob
Orchestrace restartů a detekce „pending restart“
Restart je často nutný. Před instalací i po ní kontrolujte stav Pending Reboot a plánujte práci se službami (zastavení, odpojení připojení, postupné vyřazování zátěžového balanceru). V clusteru využijte evakuaci rolí.
#Detekce čekajícího restartu (výřez) function Test-PendingReboot { $paths = @( 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionComponent Based ServicingRebootPending', 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdateAuto UpdateRebootRequired' ) foreach ($p in $paths) { if (Test-Path $p) { return $true } } return $false }
if (Test-PendingReboot) { Write-Host "Host vyžaduje restart"; }
Cluster-Aware Updating (CAU) pro Hyper-V a S2D
CAU aktualizuje uzly postupně: přesune role, uvede uzel do režimu údržby, nainstaluje záplaty a provede restart. To je vhodné pro údržbu bez výpadku.
# Spuštění běhu CAU (clustery Failover Clustering) Import-Module ClusterAwareUpdating Invoke-CauRun -ClusterName 'CL-HV01' -CauPluginName 'Microsoft.WindowsUpdatePlugin' ` -MaxRetriesPerNode 1 -EnableFirewallRules -RequireAllNodesOnline -Force
Vrácení změn a odinstalace problémových aktualizací
Kritické incidenty vyžadují rychlý návrat k předchozímu stavu. Mějte připravený skript pro odinstalaci konkrétní aktualizace KB a obnovení konfigurací (Infrastructure as Code).
# Nouzová odinstalace kumulativní aktualizace (příklad) wusa.exe /uninstall /kb:5034123 /quiet /norestart # Nebo přes DISM (pozor na přesný název balíčku) dism /online /Remove-Package /PackageName:Package_for_RollupFix~31bf3856ad364e35~amd64~~17763.512.1.10
Ověření po záplatování: smoke testy a měření
- Smoke testy: ping/HTTP 200, přihlášení ke službě, test připojovacího řetězce databáze, syntetický zátěžový dotaz.
- Kontrola verzí: zjišťujte sestavení a verzi .NET a ověřte, že byly nainstalovány požadované aktualizace KB.
- Telemetrie: sledujte latenci, CPU a chybovost (klíčové signály) a porovnávejte je s časem nasazení.
# Příklad minimálního smoke testu po restartu $services = 'IISADMIN','W3SVC' $services | ForEach-Object { Get-Service $_ | Where-Object {$_.Status -ne 'Running'} } | Set-Service -Status Running Invoke-WebRequest -Uri 'https://app.contoso.local/healthz' -UseBasicParsing -TimeoutSec 10
Šablona patchovacího běhu „end-to-end“ (PowerShell)
# PatchRun.ps1 – zkrácený orchestrátor pro jeden okruh param( [Parameter(Mandatory)] [string] $RingFile, [int] $Throttle = 6, [switch] $WhatIfDeploy )
Import-Module PSWindowsUpdate
$servers = Get-Content $RingFile
$sb = {
param($WhatIfDeploy)
function Test-PendingReboot {
$p = @(
‚HKLM:SOFTWAREMicrosoftWindowsCurrentVersionComponent Based ServicingRebootPending‘,
‚HKLM:SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdateAuto UpdateRebootRequired‘
); foreach($x in $p){ if(Test-Path $x){ return $true } }; return $false
}
Start-Transcript -Path „C:Logspatch-$(hostname)-$(Get-Date -f yyyyMMddHHmmss).log“ -Append
try {
if (Test-PendingReboot) { Write-Warning „Čeká restart před instalací.“ }
Set-WUSettings -MicrosoftUpdate:$true
$updates = Get-WindowsUpdate -Category ‚Security Updates‘,’Critical Updates‘ -IgnoreReboot
if ($updates) {
if ($WhatIfDeploy) { $updates | Format-Table -Auto }
else { Install-WindowsUpdate -AcceptAll -AutoReboot -IgnoreReboot }
} else { Write-Host „Žádné relevantní aktualizace.“ }
} finally { Stop-Transcript }
}
Invoke-Command -ComputerName $servers -ScriptBlock $sb -ArgumentList $WhatIfDeploy -ThrottleLimit $Throttle
Plánování a spouštění: plánovač, runbooky, pipeline
- Task Scheduler: serverové úlohy v definovaném servisním okně.
- CI/CD: pipeline (GitHub Actions, Azure DevOps) pro jednotné spouštění runbooků a archivaci logů.
- Runbooky: v Azure Automation s Hybrid Runbook Worker pro místní servery.
# Vytvoření naplánované úlohy pro PatchRun.ps1 (výřez) $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File C:OpsPatchRun.ps1 -RingFile C:Opsringspilot.txt' $trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 02:00 Register-ScheduledTask -TaskName 'PilotPatch' -Action $action -Trigger $trigger -RunLevel Highest
Správa tajných údajů a přístupů ve skriptech
- Používejte Managed Identity (cloud) nebo gMSA pro služby v místním prostředí.
- PowerShell SecretManagement pro práci s trezory (DPAPI, Azure Key Vault, KeePass).
- Vyhýbejte se ukládání přihlašovacích údajů do souborů; nikdy nezapisujte hesla ani tokeny do logů.
# Příklad práce s trezorem Install-Module Microsoft.PowerShell.SecretManagement -Scope AllUsers Set-Secret -Name 'SmtpPassword' -Secret (Read-Host -AsSecureString) $pwd = Get-Secret -Name 'SmtpPassword'
Specifika pro Server Core a prostředí bez grafického rozhraní
- Využijte
sconfigpro rychlé nastavení služby Windows Update, domény a vzdálené správy. - Upřednostňujte skripty a vzdálenou správu; logy směrujte do centrálního úložiště (sdílená složka SMB, SIEM).
Politiky a konfigurace: GPO a WUfB
- Nastavte „Do not allow update deferral policies to cause scans against Windows Update“ podle zvoleného modelu (WSUS vs. WUfB).
- Definujte servisní okna a automatické restartování mimo špičku.
- Konfigurujte Delivery Optimization s ohledem na linky WAN.
Firmware, ovladače a .NET
Ovladače a firmware plánujte odděleně (výrobce serveru/ILO/iDRAC). Kumulativní aktualizace .NET ověřujte v prostředí QA – mohou změnit chování běhového prostředí. Před nasazením do produkce používejte Application Compatibility Toolkit a integrační testy.
Reporting a audit
- Centralizujte přepisy (
Start-Transcript) a artefakty (reporty CSV/JSON). - Protokol událostí: sledujte zdroje WindowsUpdateClient, Servicing a CAU.
- Dosáhněte shody: sledujte procento serverů s nejnovější LCU a dobu do instalace kritické záplaty (MTTP – Mean Time To Patch).
# Jednoduchý report shody (výřez) $servers = Get-Content .all-servers.txt $results = foreach ($s in $servers) { try { $hotfix = Invoke-Command -ComputerName $s -ScriptBlock { (Get-HotFix | Sort InstalledOn -Descending | Select -First 1) } [pscustomobject]@{ Server=$s; LastKB=$hotfix.HotFixID; InstalledOn=$hotfix.InstalledOn } } catch { [pscustomobject]@{ Server=$s; LastKB=$null; InstalledOn=$null } } } $results | Export-Csv .reportspatch-compliance.csv -NoTypeInformation -Encoding UTF8
Nejčastější úskalí a jak se jim vyhnout
- Chybějící záloha před záplatou vydanou mimořádně – vždy pořiďte snapshot/zálohu a připravte plán návratu.
- Restart mimo servisní okno – důsledně kontrolujte příznak pending reboot a servisní okna.
- Ad hoc výjimky – zachovejte IaC (GPO/DSC) a procesy PR i pro změny skriptů.
- Nepodepsané skripty v produkci – vyžadujte AllSigned/WDAC.
- Servery „snowflake“ – standardizujte výchozí konfiguraci a používejte Desired State Configuration.
Desired State Configuration (DSC) pro stabilní výchozí konfiguraci
DSC udržuje požadovaný stav serveru – včetně nastavení Windows Update, služeb a plánovače. Změny jsou deklarativní, auditovatelné a opakovatelné.
Configuration PatchBaseline { Import-DscResource -ModuleName PSDscResources Node $AllNodes.Where{$_.Role -eq 'App'}.NodeName { Service WindowsUpdate { Name='wuauserv'; StartupType='Automatic'; State='Running' } Registry RebootSettings { Key = 'HKLM:SOFTWAREPoliciesMicrosoftWindowsWindowsUpdateAU' ValueName = 'NoAutoRebootWithLoggedOnUsers' ValueData = 1 ValueType = 'Dword' Ensure = 'Present' } } }
Závěr
Bezpečnostní aktualizace na Windows Serveru vyžadují kombinaci správné strategie (WSUS/MECM/Azure Update), robustní orchestrace (okruhy, CAU, servisní okna) a bezpečného skriptování (podepisování, JEA, trezor tajných údajů). PowerShell poskytuje všechny stavební prvky pro vyhledávání, instalaci, ověřování i vykazování záplat – od jednoho hostitele až po rozsáhlý cluster. Zavedením standardizovaných runbooků, měřením shody a automatizovaným návratem k předchozímu stavu dosáhnete rychlého, opakovatelného a auditovatelného procesu záplatování, který minimalizuje rizika i prostoje.
