Automatizace bezpečnostních aktualizací pomocí PowerShell skriptů

Proč automatizovat bezpečnostní aktualizace na Windows Serveru

Bezpečnostní aktualizace představují klíčovou obranu proti zneužití zranitelností. Na serverech zároveň zásadně ovlivňují 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í údržbový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í remoting, práci s WSUS/MECM, správu clusterů i možnost podepisovat skripty a řídit jejich oprávnění.

Typy aktualizací a terminologie

  • LCU (Latest Cumulative Update) – kumulativní měsíční balíček oprav, zahrnující i dřívější opravy.
  • SSU (Servicing Stack Update) – aktualizace servisního stacku; u novějších verzí je součástí LCU.
  • Out-of-band – mimořádné záplaty pro urgentní zranitelnosti (například 0-day útoky).
  • Feature on Demand / .NET – speciální kanály; .NET má vlastní kumulativní aktualizace.
  • Aktualizace třetích stran – ovladače, firmware, middleware; často řešené 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 nebo izolovaná prostředí.
  • MECM (SCCM) – plná správa balíčků, údržbová okna, reporting, integrace třetích stran.
  • Azure Update Management – plánování, orchestraci a reportování napříč hybridním prostředím (Windows i Linux).
  • Windows Update for Business (WUfB) – GPO/Intune pro odložení a řízení kanálů bez potřeby WSUS.

Okruhy (rings) a údržbová okna

Zaveďte nasazování ve vlnách: canary → pilot → produkce. Každý okruh má vlastní časové okno a krycí plán (snapshot/backup). Zohledně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: nastavujte centrálně pomocí GPO a dokumentujte výjimky.
  • JEA (Just Enough Administration): publikujte endpointy, které umožňují pouze schválené cmdlety s definovanou rolí.
  • WDAC/AppLocker: omezte spuštění na podepsané binárky 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 v měřítku

Povolte remoting s Kerberem v doméně; do perimeteru používejte WinRM přes HTTPS. Pro masové operace preferujte Invoke-Command s běžící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'}"

# Paralelizované 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 (ne vždy kompletní na nových build typech).
  • Get-WindowsPackage / DISM – detailní pohled na balíčky.
  • PSWindowsUpdate modul – vyhledávání a instalace přes Windows Update/WSUS včetně filtrů.
# Inventura KB
Get-HotFix | Where-Object {$_.InstalledOn -gt (Get-Date).AddMonths(-2)} | Format-Table -Auto

# DISM výpis balíků
dism /online /Get-Packages /Format:Table

PSWindowsUpdate – instalace pouze security 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 údržbová okna

V prostředích s WSUS schvalujte aktualizace pro cílové skupiny počítačů. PowerShellem můžete automatizovat jak schvalování, tak samotnou instalaci na serverech v definovaném okně.

# Primitivní 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ý. Kontrolujte stav Pending Reboot před i po instalaci a plánujte správu služeb (zastavení, vyprázdnění připojení, postupné odpojování z load balanceru). V clusteru použijte evakuaci rolí.

# Detekce pending restart (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 údržby, nainstaluje záplaty a provede restart. Vhodné pro dosažení bezvýpadkové údržby.

# Spuštění běhu CAU (klastry Failover Clustering)
Import-Module ClusterAwareUpdating
Invoke-CauRun -ClusterName 'CL-HV01' -CauPluginName 'Microsoft.WindowsUpdatePlugin' `
    -MaxRetriesPerNode 1 -EnableFirewallRules -RequireAllNodesOnline -Force

Rollback a odinstalace problémových aktualizací

Kritické incidenty vyžadují rychlý návrat. Mějte připravený skript pro odinstalaci konkrétního KB a pro návrat 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

Validace po záplatování: smoke testy a měření

  • Smoke testy: ping/HTTP 200, přihlášení služby, test databázového connection stringu, zátěžový „synthetic“ dotaz.
  • Kontrola verzí: inventarizujte build, .NET a ověřte, že požadované KB byly aplikovány.
  • Telemetrie: sledujte latenci, CPU, chybovost (tzv. golden signals) a korelujte se časem nasazení.
# Příklad minimal 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 „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: serverové úlohy v definovaném údržbovém okně.
  • 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-prem 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 (v cloudu) nebo gMSA pro služby on-prem.
  • PowerShell SecretManagement pro práci s trezory (DPAPI, Azure Key Vault, KeePass).
  • Vyhýbejte se ukládání pověření do souborů; nikdy nelogujte hesla nebo tokeny.
# 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 smě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 údržbová okna a automatické restartování mimo provozní špičku.
  • Konfigurujte Delivery Optimization s ohledem na WAN linky.

Firmware, ovladače a .NET

Ovladače a firmware plánujte odděleně (výrobce serveru/ILO/iDRAC). .NET kumulativní aktualizace validujte na QA – mohou měnit chování runtime. Používejte Application Compatibility Toolkit a integrační testy před produkcí.

Reporting a audit

  • Centralizujte transcripty (Start-Transcript) a artefakty (CSV/JSON reporty).
  • EventLog: sledujte zdroje WindowsUpdateClient, Servicing, CAU.
  • Dosahujte shodu: procento serverů s poslední LCU, čas do aplikace 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