Windows "light" hardening

Posted on 26 May 2025 by Janci 15 min

Windows "light" hardening

Jednoduchý "light" Hardening – Windows Server 2022

Cieľ:

Vytvoriť štartovací zoznam tzv. "Best Security Practicies" pre hardening Windows Server 2022. Ide skôr o postinštalačné kroky.

Dôvod:

Nasadenie hardenovacích skriptov (Napríklad CIS Level 1) môže byť občas náročné hlavne z dôvodu zložitej infraštruktúry, ktorá obsahuje staršie, častokrát nepodporované systémy. Aplikačné riešenia prevádzkované na týchto systémoch sú často krát závislé na nastaveniach OS, ktoré sa nemôžu jednoducho nastaviť viac zabezpečene.


Nastavenia "Light" hardeningu

Zmena názvu vstavaného účtu administrátora

Dôvod: Predvolený názov „Administrator“ je cieľom útokov.

Ako: Local Security Policy (secpol.msc) → Local Policies → Security Options → Accounts: Rename administrator account

Premenujte napr. na „srvadmin843“ (náhodné meno, nie „admin“ ani „administrator“).

Skript 1


# ========================================== # Skript: Find_Local_Admin_Account.ps1 # Účel: Vyhľadá lokálny používateľský účet so SID končiacim na -500 # (t.j. vstavaný účet Administrator, aj ak bol premenovaný) # ========================================== # Načíta .NET knižnicu pre prácu s účtami používateľov Add-Type -AssemblyName System.DirectoryServices.AccountManagement # Vytvorenie kontextu pre lokálny počítač $PrincipalContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext( [System.DirectoryServices.AccountManagement.ContextType]::Machine, $env:computername ) # Vytvorenie šablóny používateľa pre vyhľadávanie $UserPrincipal = New-Object System.DirectoryServices.AccountManagement.UserPrincipal($PrincipalContext) # Inicializácia vyhľadávača a nastavenie filtra $Searcher = New-Object System.DirectoryServices.AccountManagement.PrincipalSearcher $Searcher.QueryFilter = $UserPrincipal # Vyhľadanie všetkých používateľov a filtrovanie na SID končiaci na -500 $Searcher.FindAll() | Where-Object { $_.Sid -like "*-500" } | Select-Object SamAccountName, Sid

Skript2

# Get the current name of the Administrator account
$adminName = (Get-LocalUser -Name "Administrator").Name

# Set the new name for the Administrator account
$newName = "MyNewAdmin"

# Rename the local administrator account to the new name
Set-LocalUser -Name $adminName -Name $newName


Deaktivácia automatického štartu Server Manager

Deaktivácia Správcu servera je skôr kozmetického charakteru.

Dôvod: Správca servera sa spúšťa pomerne pomaly a na krátky čas spôsobuje pomerne vysoké zaťaženie procesora.

Deaktivácia cez Task Scheduler enter image description here


Deaktivácia nepotrebných služieb

Dôvod: Default inštalácia operačného systému obsahuje zoznam aktívnych služieb, ktoré na serveri nie sú potrebné. Keďže sa nevyužívajú je zbytočné ponechať ich aktívne. Zníži sa útočný vektor, ktorý môže byť zneužitý útočníkmi.

Prehľad vybraných Windows služieb

Názov služby Zobrazovaný názov Odporúčanie Dôvod
MapsBroker Downloaded Maps Manager Zakázať Iba pre mapové aplikácie
WMPNetworkSvc Windows Media Player Network Sharing Zakázať Nie je potrebné na serveri
bthserv Bluetooth Support Service Zakázať Server nepoužíva Bluetooth
RemoteRegistry Remote Registry Zakázať Bezpečnostné riziko, ak sa nevyužíva
DiagTrack Connected User Experience and Telemetry Zakázať Telemetria – minimalizovať zdieľanie
SCardSvr Smart Card Service Zakázať Ak nepoužívate smart karty
WSearch Windows Search Zakázať Ak nie je potrebný rýchly lokálny vyhľadávač
TrkWks Distributed Link Tracking Client Zakázať Udržiavanie odkazov – nepotrebné mimo AD file serverov
WiaRpc Still Image Acquisition Zakázať Skenery a fotoaparáty nie sú používané
WPDBusEnum Portable Device Enumerator Service Zakázať Mobilné zariadenia nie sú na serveri
Spooler Print Spooler Zakázať Spracováva tlačové úlohy, umožňuje tlač
fdPHost Function Discovery Provider Host Zakázať Zisťovanie zariadení v sieti. (zakáž, ak sa nepoužíva zdieľanie)
ShellHWDetection Shell Hardware Detection Zakázať Zisťuje a reaguje na zmeny hardvéru (napr. AutoPlay)
NcbService Network Connection Broker Zakázať Spravuje konektivitu pre moderné aplikácie
SensrSvc Adaptive Brightness Zakázať Upravuje jas podľa okolitého osvetlenia
upnphost UPnP Device Host Zakázať Hostuje UPnP zariadenia
AudioEndpointBuilder Windows Audio Endpoint Builder Zakázať Spravuje zvukové koncové body
FrameServer Windows Camera Frame Server Zakázať Zdieľa video streamy medzi aplikáciami

Powershell skript pre zakázanie nepotrebných služieb

$services = @(
    "MapsBroker"
    "WMPNetworkSvc"
    "bthserv"
    "RemoteRegistry"
    "DiagTrack"
    "SCardSvr"
    "WSearch"
    "TrkWks"
    "WiaRpc"
    "WPDBusEnum"
    "Spooler"
    "fdPHost"
    "ShellHWDetection"
    "NcbService"
    "SensrSvc"
    "upnphost"
    "AudioEndpointBuilder"
    "FrameServer"
)

# Cesta k záložnému súboru
$backupFile = "$env:SystemDrive\Temp\service_status_backup.csv"
if (!(Test-Path "$env:SystemDrive\Temp")) {
    New-Item -Path "$env:SystemDrive\Temp" -ItemType Directory | Out-Null
}

# 1. Zistenie a zálohovanie aktuálneho stavu služieb
$backup = @()
Write-Output "`n--- Stav služieb ---`n"
foreach ($svc in $services) {
    $service = Get-Service -Name $svc -ErrorAction SilentlyContinue
    if ($service) {
        $entry = [PSCustomObject]@{
            Name = $svc
            Status = $service.Status
            StartType = (Get-WmiObject -Class Win32_Service -Filter "Name='$svc'").StartMode
        }
        $backup += $entry
        Write-Output ("{0,-30} {1,-15} {2}" -f $svc, $service.Status, $entry.StartType)
    } else {
        Write-Output ("{0,-30} - Not Found" -f $svc)
    }
}
$backup | Export-Csv -Path $backupFile -NoTypeInformation -Encoding UTF8
Write-Output "`n✔️ Záloha uložená do: $backupFile"

# 2. Zakázanie služieb
Write-Output "`n--- Zakazovanie služieb ---`n"
foreach ($svc in $services) {
    $service = Get-Service -Name $svc -ErrorAction SilentlyContinue
    if ($service) {
        try {
            Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
            Set-Service -Name $svc -StartupType Disabled
            Write-Output "✔️ Zakázaná služba: $svc"
        } catch {
            Write-Output "❌ Chyba pri zakazovaní: $svc - $_"
        }
    } else {
        Write-Output "ℹ️ Služba $svc neexistuje na tomto systéme."
    }
}

Powershell skript pre obnovu pôvodného nastavenia služieb


# =========================================== # Skript: Restore_Services_From_Backup_Windows_Server_2022.ps1 # Účel: Obnoví pôvodný stav služieb na základe záložného CSV súboru. # Očakáva zálohu v súbore: C:\Temp\service_status_backup.csv # Súbor musí obsahovať stĺpce: Name, Status, StartType # =========================================== # Definovanie cesty k záložnému súboru $backupFile = "$env:SystemDrive\Temp\service_status_backup.csv" # Kontrola existencie záložného súboru if (!(Test-Path $backupFile)) { Write-Error "❌ Záložný súbor neexistuje: $backupFile" exit 1 } # Načítanie údajov zo záložného CSV $backup = Import-Csv -Path $backupFile Write-Output "`n--- Obnova služieb ---`n" # Iterácia cez každú službu zo zálohy foreach ($entry in $backup) { $svc = $entry.Name # Názov služby $startType = $entry.StartType # Typ spustenia (napr. Auto, Manual, Disabled) try { # Nastavenie typu spustenia služby podľa zálohy Set-Service -Name $svc -StartupType $startType # Obnova bežiaceho/stopped stavu podľa hodnoty v zálohe if ($entry.Status -eq "Running") { Start-Service -Name $svc -ErrorAction SilentlyContinue } elseif ($entry.Status -eq "Stopped") { Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue } Write-Output "✔️ Obnovená služba: $svc → $startType" } catch { Write-Output "❌ Chyba pri obnove služby: $svc - $_" } }

Zapnutie rozšíreného logovania a auditingu

Logovanie udalostí je natívna funkcia Winsows systémov.

Dôvod:

Tzv. nastavenia logovania po čistej inštalácii spĺňajú "Default configuration", čo znamená, že s týmito nastaveniami ste schopný nainštalovať operačný systém tak, že je plne funkčný. Tieto nastavenia však nepostačujú pre zabezpečenie vyššej bezpečnosti prostredia.

Príklady rozšíreného logovania

Audit Policy Area Subkategória Odporúčané nastavenie
Logon/Logoff Logon Success & Failure
Logoff Success
Special Logon Success
Logon with explicit credentials Success & Failure
Account Logon Credential Validation Success & Failure
Account Management User Account Management Success & Failure
Security Group Management Success
Computer Account Management Success
Policy Change Audit Policy Change Success
Authentication Policy Change Success
Authorization Policy Change Success
Privilege Use Sensitive Privilege Use Success & Failure
Object Access File System Success & Failure
Registry Success & Failure
Handle Manipulation Failure
System Security System Extension Success & Failure
System Integrity Success & Failure

Logovanie udalostí Object Access vyžaduje prenejší návrh, nakoľko dochádza k väčšiemu počtu logov a tým pádom aj väčšiemu obsadeniu diskového priestoru. Nastavuje sa pre objekty, ktoré obsahujú citlivé dáta.


1. Nastavenie Advanced Audit Policy (lokálne)

Postup:

  1. Otvorte secpol.msc
  2. Choďte do:

    Advanced Audit Policy Configuration >
    System Audit Policies >
    [napr. Logon/Logoff, Account Management atď.]
    
  3. Dvojkliknite na každú subkategóriu a nastavte:

    • Configure the following audit events
    • Success a/alebo Failure podľa tabuľky nižšie

Odporúčané nastavenia:

Oblasť Subkategória Nastavenie
Logon/Logoff Logon Success & Failure
Logoff Success
Special Logon Success
Logon with explicit credentials Success & Failure
Account Logon Credential Validation Success & Failure
Account Management User Account Management Success & Failure
Security Group Management Success
Computer Account Management Success
Policy Change Audit Policy Change Success
Authentication Policy Change Success
Authorization Policy Change Success
Privilege Use Sensitive Privilege Use Success & Failure

2. Nastavenie veľkosti a rotácie logov (Security, System, Application)

Dôvod: Pre korektné nastavenie auditných logov je potrebné rátať s využiteľnosťou diskového preistoru a to už vo fáze technické návrhu. Je potrebné predvídať veľkosť obsadenia miesta, rotáciu logov, množstvo logov a zálohovanie. Doleuvedený text obsahuje odporúčania v prípade obmedzenejšieho diskového priestoru.

Manuálne (GUI):

  1. Otvorte eventvwr.msc
  2. Pravý klik na log (napr. Security) → Properties
  3. Nastavte:
    • Maximum log size: napr. 128000 KB (128 MB)
    • Overwrite events as needed

PowerShell (automaticky):

# Security log – 128 MB
wevtutil sl Security /ms:134217728
wevtutil sl Security /rt:true

# System log – 64 MB
wevtutil sl System /ms:67108864
wevtutil sl System /rt:true

# Application log – 64 MB
wevtutil sl Application /ms:67108864
wevtutil sl Application /rt:true

3. Zálohovanie Security logu pred úpravami

Skript:

# ==========================================
# Skript: Configure_And_Backup_SecurityLog.ps1
# Účel: Zálohovať Security log a nastaviť jeho veľkosť a rotáciu
# ==========================================

# Cesta pre zálohovaný log
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$backupPath = "$env:SystemDrive\Temp\SecurityLog_Backup_$timestamp.evtx"

# Vytvorenie zložky ak neexistuje
if (!(Test-Path "$env:SystemDrive\Temp")) {
    New-Item -Path "$env:SystemDrive\Temp" -ItemType Directory | Out-Null
}

Write-Output "📁 Zálohovanie Security logu do: $backupPath"
wevtutil epl Security $backupPath

# Nastavenie veľkosti a rotácie
Write-Output "🛠️ Nastavovanie Event Log parametrov..."

# Security log – 128 MB
wevtutil sl Security /ms:134217728
wevtutil sl Security /rt:true

Write-Output "✔️ Záloha vytvorená a log nakonfigurovaný."

Funkcie:

  • Export logu Security do C:\Temp\SecurityLog_Backup_<timestamp>.evtx
  • Nastaví veľkosť a rotáciu logu

Naplánovanie zálohovania

  1. Otvoriť Task Scheduler: Win + R → taskschd.msc
  2. Kliknite pravým na Task Scheduler Library → Create Basic Task
  3. Nastavte názov, napr. Zalohovanie Security Logu
  4. Vyberte Daily alebo iný interval
  5. V časti Action zvoľte: • Start a program • Program/script: powershell.exe • Add arguments:

-ExecutionPolicy Bypass -File "C:\Cesta\k\Configure_And_Backup_SecurityLog.ps1" 6. Dokončite sprievodcu

Čistenie záloh

Aby są predišlo zaplneniu diskového priestoru, je potrebné zálohy presúvať na online/offline dedikované úložisko. Časové obdobie existencie zálohy na serveri a online/offline zálohy na inom úložisku je závislé od architektúry riešenia.

Keďže priemerný pobyt útočníkov v infraštruktúre je cca 200 dní, je dobré mať nastavenú časovú politiku v podobnom intervale.

Upravený skript pre mazanie starých záloh starších ako 30 dní


# ========================================== # Skript: Configure_And_Backup_SecurityLog.ps1 # Účel: Zálohovať Security log, nastaviť veľkosť a rotáciu a vyčistiť staré zálohy # ========================================== # Cesta pre zálohovaný log $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" $backupDir = "$env:SystemDrive\Temp" $backupPath = "$backupDir\SecurityLog_Backup_$timestamp.evtx" # Vytvorenie zložky ak neexistuje if (!(Test-Path $backupDir)) { New-Item -Path $backupDir -ItemType Directory | Out-Null } # Zálohovanie Security logu Write-Output "📁 Zálohovanie Security logu do: $backupPath" wevtutil epl Security $backupPath # Nastavenie veľkosti a rotácie Write-Output "🛠️ Nastavovanie Event Log parametrov..." wevtutil sl Security /ms:134217728 # 128 MB wevtutil sl Security /rt:true # Rotácia zapnutá # Čistenie starých záloh starších ako 30 dní Write-Output "🧹 Odstraňovanie záloh starších ako 30 dní..." Get-ChildItem $backupDir -Filter "SecurityLog_Backup_*.evtx" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item -Force Write-Output "✔️ Záloha vytvorená, log nakonfigurovaný a staré zálohy odstránené."

Odporúčané veľkosti logov

Log Odporúčaná veľkosť Rotácia
Security 128 – 512 MB Áno (overwrite)
System 64 – 128 MB Áno
Application 64 – 128 MB Áno

Záver

Implementáciou týchto nastavení: - Splníte bezpečnostné štandardy NIST / ISO - Zabezpečíte kontrolu nad aktivitou používateľov - Minimalizujete riziko zaplnenia disku logmi


Vypnutie histórie skriptov, príkazov

Dôvod:

História powershell a cmd príkazov zjednodušuje prácu. Môže však viesť ku kompromitácii útočníkom. Útočník vie pomocou histórie získať informácie, ktoré si tam správcovia neúmyselne zaniesli ako heslá atď.

PowerShell – História príkazov

Kde sa ukladá: - Súbor: %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

Spôsoby vypnutia alebo čistenia:

Možnosť 1: Dočasné zakázanie PSReadLine modulu

Remove-Module PSReadLine

Možnosť 2: Vymazanie existujúcej histórie

Clear-History
Remove-Item "$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt" -Force
New-Item "$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt" -ItemType File

Možnosť 3: Trvalé vypnutie cez PowerShell profil

Pridajte do súboru Microsoft.PowerShell_profile.ps1:

Remove-Module PSReadLine

CMD (Command Prompt) – História príkazov

Kde sa ukladá: - Ukladá sa len v pamäti, nie do súboru

** Ako vypnúť alebo obmedziť:**

Manuálne cez vlastnosti CMD:

  1. Spustite CMD ako správca
  2. Pravý klik na titulok okna → Properties
  3. Sekcia Options:
    • Command History Buffer Size: nastav na 0
    • Number of Buffers: 1
    • Zruš zaškrtnutie Discard Old Duplicates

Skúsiť GPO:

gpedit.msc

User Configuration >
Administrative Templates >
Windows Components >
Command Prompt >
Turn off Command Prompt history

Doplňujúce odporúčania

Nástroj Odporúčanie
PowerShell Zakázať PSReadLine modul, čistiť históriu
CMD Znížiť veľkosť histórie alebo použiť GPO
Auditovanie Preferovať zabezpečené logovanie (napr. cez WEF)

Odporúčanie

Namiesto úplného vypnutia histórie z bezpečnostných dôvodov je lepšie: - Pravidelne ju čistiť - Nahradiť audítorským systémom (napr. logovanie relácií, Windows Event Forwarding)


Nasadenie/Inštalácia Sysmon

Sysmon (System Monitor) je nástroj od Microsoft Sysinternals, ktorý umožňuje sledovanie detailnej aktivity systému pre účely bezpečnosti a forenznej analýzy.


1. Čo je Sysmon?

  • Zachytáva udalosti ako:

    • Spúšťanie procesov
    • Zmeny súborov
    • Zápis do registra
    • Sieťové spojenia
  • Loguje ich do:

    Event Viewer > Applications and Services Logs >  Microsoft >  Windows >  Sysmon >  Operational
    
    

2. Inštalácia Sysmon

Krok 1: Stiahnite Sysmon

  • Web: https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon
  • Rozbaľte napr. do: C:\Tools\Sysmon

Krok 2: Základná inštalácia

cd C:\Tools\Sysmon
.\Sysmon64.exe -accepteula -i

Inštaluje Sysmon s predvolenou konfiguráciou (zaznamenáva len základné udalosti).


3. Použitie rozšírenej konfigurácie (SwiftOnSecurity)

SwiftOnSecurity profil:

  • GitHub: https://github.com/SwiftOnSecurity/sysmon-config
  • Súbor: sysmonconfig-export.xml

Inštalácia s konfiguráciou:

.\Sysmon64.exe -accepteula -i sysmonconfig-export.xml

4. Aktualizácia konfigurácie bez reštartu služby

.\Sysmon64.exe -c nova-konfiguracia.xml

5. Odinštalovanie Sysmon

.\Sysmon64.exe -u

Odporúčania

Parameter Odporúčanie
Konfigurácia Použiť overený sysmon.xml (napr. SwiftOnSecurity)
Štartovací režim Automatic
Integrácia Napojenie na SIEM alebo WEF
Export logov Možné pravidelne archivovať/forwardovať

Sysmon poskytuje výrazne lepší prehľad o dianí v systéme ako bežné logy. Jeho správna konfigurácia je kľúčová pre účinné monitorovanie a detekciu hrozieb.


Dodatočná konfigurácia Sysmon

Sysmon logy môžu rásť veľmi rýchlo, najmä ak je konfigurácia agresívna. Preto je kľúčové nastaviť: 1. Limit veľkosti logu 2. Rotáciu logu (overwrite) 3. Automatické zálohovanie 4. Pravidelné čistenie starých záloh

Skript pre nastavenie, zálohu a čistenie sysmon logov


# ========================================== # Skript: Configure_And_Backup_SysmonLog.ps1 # Účel: Nastaviť veľkosť Sysmon logu, vykonať zálohu a vyčistiť staré zálohy # ========================================== # Nastavenie veľkosti logu Sysmon na 128 MB a povolenie rotácie Write-Output "🛠️ Nastavovanie Sysmon logu na 128 MB a zapnutie rotácie..." wevtutil sl Microsoft-Windows-Sysmon/Operational /ms:134217728 wevtutil sl Microsoft-Windows-Sysmon/Operational /rt:true # Vytvorenie zálohy Sysmon logu $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" $backupDir = "$env:SystemDrive\Temp" $backupPath = "$backupDir\SysmonLog_Backup_$timestamp.evtx" if (!(Test-Path $backupDir)) { New-Item -Path $backupDir -ItemType Directory | Out-Null } Write-Output "💾 Export logu Sysmon do: $backupPath" wevtutil epl Microsoft-Windows-Sysmon/Operational $backupPath # Odstránenie starých záloh (starších ako 30 dní) Write-Output "🧹 Odstraňovanie záloh starších ako 30 dní..." Get-ChildItem $backupDir -Filter "SysmonLog_Backup_*.evtx" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item -Force Write-Output "✔️ Sysmon log nakonfigurovaný, zálohovaný a staré súbory odstránené."

Automatizácia zálohovania a čistenia sysmon logov


# ========================================== # Skript: Register_SysmonLog_Backup_Task.ps1 # Účel: Vytvorí naplánovanú úlohu, ktorá denne spustí zálohovanie Sysmon logu # ========================================== $Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File 'C:\Temp\Configure_And_Backup_SysmonLog.ps1'" $Trigger = New-ScheduledTaskTrigger -Daily -At 2:00am $Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName "SysmonLogBackup" -Action $Action -Trigger $Trigger -Principal $Principal -Description "Denné zálohovanie Sysmon logu do C:\Temp"

Poznámka V pôvodnom skripte je potrebné odobrať nastavovanie Sysmon logovania aby sa pri spúšťaní plánovanej úlohy nevykonávalo aj nastavovanie.

Časové okno prę ukladanie a čisxtenie záloh je závislé od projektu. Prípadne rovnaké ako pri nastaveniach pre windows logovanie - uvedené vyššie.