Bezpečnostní řízení aktualizací pomocí PowerShellu

Proč automatizovat bezpečnostní aktualizace na Windows Serveru

Bezpečnostní aktualizace jsou klíčovou ochranou proti zneužití zranitelností. Na serverech mají také zásadní vliv na dostupnost – nevhodně načasovaný restart může vyřadit kritické služby. Cílem je proto vytvořit opakovatelný, auditovatelný a bezpečný proces, který: (1) včas vyhledá a nainstaluje kritické záplaty, (2) minimalizuje výpadky prostřednictvím plánovaných okének údržby a orchestrace a (3) poskytne důkazy o souladu pro audit. PowerShell je pro tento proces přirozeným nástrojem – nabízí remoting, práci s WSUS/MECM, správu clusterů a možnost podepisovat skripty a řídit jejich oprávnění.

Typy aktualizací a terminologie

  • LCU (Latest Cumulative Update) – kumulativní měsíční balík oprav, zahrnující i dřívější záplaty.
  • SSU (Servicing Stack Update) – aktualizace instalačního zásobníku; 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 – speciální kanály; .NET má vlastní kumulativní aktualizace.
  • Třetí strany aktualizace – ovladače, firmware, middleware; často řešeny mimo Windows Update.

Volba strategie: WSUS/MECM, Azure Update nebo přímo Windows Update

  • WSUS – lokální cache a schvalování, řízení okruhů (rings). Vhodné pro offline či izolovaná prostředí.
  • MECM (SCCM) – plná správa balíků, okna údržby, reporty, podpora třetích stran.
  • Azure Update Management – plánování, orchestraci a reporty v hybridním prostředí (Windows i Linux).
  • Windows Update for Business (WUfB) – GPO/Intune řízení odložení a kanálů bez nutnosti WSUS.

Okruhy (rings) a okénka údržby

Zaveďte nasazování v krocích: canary → pilot → produkce. Každý okruh má vlastní časové okno a zálohovací plán (snapshot/backup). Zohledněte specifické požadavky u clusterovaných rolí (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 centrálně (GPO) a zdokumentujte výjimky.
  • JEA (Just Enough Administration): publikujte endpointy, umožňující pouze schválené cmdlety s definovanou rolí.
  • WDAC/AppLocker: omezte spouštění pouze na podepsané binárky a skripty.
# Nastavení politiky a podepsání 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 v měřítku

Povolte remoting s Kerberem v doméně; ve firewallové zóně používejte WinRM přes HTTPS. Pro hromadné operace preferujte Invoke-Command s aktivními PSSessions a paralelizací (-ThrottleLimit).

# Povolení remoting 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 KB (není vždy kompletní u nových buildů).
  • Get-WindowsPackage / DISM – přesnější pohled na nainstalované balíčky.
  • PSWindowsUpdate modul – vyhledávání a instalace přes Windows Update/WSUS včetně filtrování.
# Inventura KB Get-HotFix | Where-Object {$_.InstalledOn -gt (Get-Date).AddMonths(-2)} | Format-Table -Auto
# Výpis balíků pomocí DISM
dism /online /Get-Packages /Format:Table

# PSWindowsUpdate – instalace jen zabezpečovacích a .NET záplat
Install-Module PSWindowsUpdate -Scope AllUsers
Get-WindowsUpdate -MicrosoftUpdate -Category 'Security Updates','Critical Updates','.NET Framework' -AcceptAll -IgnoreReboot

Řízená instalace z WSUS: schvalování a maintenance windows

V prostředí WSUS schvalujte aktualizace pro vybrané skupiny počítačů. Pomocí PowerShellu lze automatizovat jak schvalovací proces, tak vlastní instalaci aktualizací v určeném časovém okně.

# Jednoduchá orchestraci pomocí 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 nezbytný. Kontrolujte stav Pending Reboot před i po instalaci a plánujte správu služeb (zastavení, odpojení spojení, postupné odebírání z load balanceru). V clusteru použijte evakuaci rolí.

# Detekce pending restart (ukázka) 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 jednotlivé uzly postupně: přesune role, přepne uzel do režimu údržby, nainstaluje záplaty a provede restart. Tento přístup umožňuje bezvýpadkovou údržbu.

# Spuštění CAU pro Failover cluster Import-Module ClusterAwareUpdating Invoke-CauRun -ClusterName 'CL-HV01' -CauPluginName 'Microsoft.WindowsUpdatePlugin' ` -MaxRetriesPerNode 1 -EnableFirewallRules -RequireAllNodesOnline -Force 

Rollback a odinstalace problematických aktualizací

Kritické incidenty vyžadují rychlý návrat zpět. Mějte připravené skripty pro odinstalaci konkrétních KB a obnovu konfigurace (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 

Validace po záplatování: smoke testy a metriky

  • Smoke testy: ping/HTTP 200, ověření spuštění služby, test připojení do databáze, zátěžový „synthetic“ dotaz.
  • Kontrola verzí: inventarizace buildu, .NET a ověření nasazení požadovaných KB.
  • Telemetrie: sledujte latenci, zatížení CPU, chybovost (golden signals) a korelujte data s časem nasazení.
# Minimální smoke test 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 „end-to-end“ patchovacího běhu (PowerShell)

# PatchRun.ps1 – zkrácený orchestrátor pro jeden ring 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 "Pending reboot 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: plánované úlohy serveru v definovaném okně údržby.
  • CI/CD: pipeline (GitHub Actions, Azure DevOps) pro konzistentní volání runbooků a archivaci logů.
  • Runbooky: v Azure Automation s Hybrid Runbook Worker pro on-premises servery.
# Vytvoření naplánované úlohy pro PatchRun.ps1 (ukázka) $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 on-premises.
  • PowerShell SecretManagement pro práci s trezory (DPAPI, Azure Key Vault, KeePass).
  • Vyhýbejte se ukládání přihlašovacích údajů v souborech; nikdy neukládejte hesla ani tokeny v logech.
# 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 bez-GUI prostředí

  • Využijte sconfig pro rychlé nastavení Windows Update, domény a remoting.
  • Preferujte skripty a remoting; logy přesměrujte do centrálního úložiště (SMB share, SIEM).

Politiky a konfigurace: GPO a WUfB

  • Nastavte „Do not allow update deferral policies to cause scans against Windows Update“ dle modelu (WSUS vs. WUfB).
  • Definujte okna údržby a automatické restartování mimo špičku.
  • Konfigurujte Delivery Optimization s ohledem na WAN linky.

Firmware, ovladače a .NET

Ovladače a firmware plánujte samostatně (výrobce serveru, ILO/iDRAC). .NET kumulativní aktualizace validujte v QA – mohou ovlivnit chování runtime. Používejte Application Compatibility Toolkit a integrační testy před nasazením do produkce.

Reporting a audit

  • Centralizujte výstupy z Start-Transcript a další artefakty (CSV/JSON reporty).
  • EventLog: sledujte zdroje WindowsUpdateClient, Servicing, CAU.
  • Měřte shodu: procento serverů s poslední LCU, čas do nasazení kritických záplat (MTTP – Mean Time To Patch).
# Jednoduchý report shody (ukázka) $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

  • Nedostatečná záloha před out-of-band záplatou – vždy provádějte snapshot/backup a mějte plán rollbacku.
  • Restart mimo plánované okénko