Windows "light" hardening
Posted on 26 May 2025 by Janci — 15 min

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
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:
- Otvorte
secpol.msc
Choďte do:
Advanced Audit Policy Configuration > System Audit Policies > [napr. Logon/Logoff, Account Management atď.]
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):
- Otvorte
eventvwr.msc
- Pravý klik na log (napr. Security) → Properties
- Nastavte:
- Maximum log size: napr.
128000 KB
(128 MB) - Overwrite events as needed
- Maximum log size: napr.
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
doC:\Temp\SecurityLog_Backup_<timestamp>.evtx
- Nastaví veľkosť a rotáciu logu
Naplánovanie zálohovania
- Otvoriť Task Scheduler:
Win + R → taskschd.msc
- Kliknite pravým na Task Scheduler Library → Create Basic Task
- Nastavte názov, napr. Zalohovanie Security Logu
- Vyberte Daily alebo iný interval
- 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:
- Spustite CMD ako správca
- Pravý klik na titulok okna → Properties
- Sekcia Options:
- Command History Buffer Size: nastav na
0
- Number of Buffers:
1
- Zruš zaškrtnutie Discard Old Duplicates
- Command History Buffer Size: nastav na
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.