Bezpečnost a PowerShell

Bezpečnost a PowerShell

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ý reboot 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í okének údržby 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 skripty podepisovat a řídit jejich oprávnění.

Typy aktualizací a terminologie

  • LCU (Latest Cumulative Update) – kumulativní měsíční balík oprav, 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.
  • Treťostranné 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/izolovaná prostředí.
  • MECM (SCCM) – plná správa balíků, maintenance windows, reporting, třetí strany.
  • Azure Update Management – plánování, orchestraci a reporty napříč hybridem (Windows i Linux).
  • Windows Update for Business (WUfB) – GPO/Intune deferral a řízení kanálů bez WSUS.

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

Zaveďte nasazování ve vlnách: canary → pilot → produkce. Každý okruh má vlastní časové okno a krycí plán (snapshot/backup). 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 organizovaně (GPO) a zdokumentujte výjimky.
  • JEA (Just Enough Administration): publikujte endpointy, které dovolují jen schválené cmdlety s definovanou rolí.
  • WDAC/AppLocker: omezte spouštění na podepsané binárky a skripty.
# Nastavení politiky a podpis skriptu Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope LocalMachine $cert = Get-ChildItem Cert:\CurrentUser\My -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 perimetru 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:\LocalMachine\My | 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 – přesnější 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 jen 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 maintenance windows

V prostředích s WSUS schvalujte aktualizace pro cílové skupiny počítačů. PowerShellem můžete automatizovat jak schvalování, tak vlastní 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 rebootů a detekce „pending restart“

Restart je často nutný. Kontrolujte stav Pending Reboot před i po instalaci a plánujte služby (zastavení, drain connections, postupné odpojování z LB). V clusteru použijte evakuaci rolí.

#Detekce pending restart (výřez) function Test-PendingReboot { $paths = @( 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending', 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' ) 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 maintenance, 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 (golden signals) a korelujte s časem nasazení.
# Příklad minimal smoke testu po rebootu $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:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
); foreach($x in $p){ if(Test-Path $x){ return $true } }; return $false
}

Start-Transcript -Path "C:\Logs\patch-$(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é joby v definovaném maintenance window.
  • CI/CD: pipeline (GitHub Actions, Azure DevOps) pro konzistentní volání runbooků a archiv 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:\Ops\PatchRun.ps1 -RingFile C:\Ops\rings\pilot.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-prem.
  • PowerShell SecretManagement pro práci s trezory (DPAPI, Azure Key Vault, KeePass).
  • Vyhýbejte se ukládání pověření v souborech; nikdy nelogujte hesla/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 maintenance windows 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 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.
  • DORažte 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 .\reports\patch-compliance.csv -NoTypeInformation -Encoding UTF8 

Nejčastější úskalí a jak se jim vyhnout

  • Chybějící záloha před out-of-band záplatou – vždy snapshot/backup a rollback plán.
  • Reboot mimo okénko – striktně hlídejte flag pending reboot a maintenance windows.
  • Ad-hoc výjimky – držte IaC (GPO/DSC) a PR procesy i pro skriptové změny.
  • Nepodepsané skripty v produkci – vyžadujte AllSigned/WDAC.
  • „Snowflake“ servery – standardizujte baseline, používejte Desired State Configuration.

Desired State Configuration (DSC) pro stabilní „baseline“

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:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' 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 (rings, CAU, maintenance windows) a bezpečného skriptování (podepisování, JEA, trezor tajemství). PowerShell poskytuje všechny stavební bloky pro vyhledání, instalaci, ověření i reportování záplat – od single hostu až po rozsáhlý cluster. Zavedením standardizovaných runbooků, měření shody a automatizovaných rollbacků dosáhnete rychlého, opakovatelného a auditovatelného patchovacího procesu, který minimalizuje riziko i downtime.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *