Bežnou praxou je, aby sme na serveroch mali pozakazované používanie potenciálne zneužiteľných protokolov a šifier. No len kým sa to bezpečnosti pomerne ľahko povie, vypnite TLS 1.1, alebo šifrovanie TLS_RSA_WITH_RC4_128_SHA alebo niečo podobné, žiadny príčetný človek zodpovedný za prevádzku neohrozí produkciu len z toho dôvodu aby ukojil zvrátené predstavy bandy fantasmagorických pošukov, ktorí síce nijako nevedia popísať ako by mal smerovať potenciálny vektor útoku vedúci k zneužitiu napr. staršej šifry, ale zaručene vedia že jej nezakázaním, tak, že včera bolo neskoro, ohrozujeme bezpečnosť systémov intergalaktickým spôsobom a rituálna poprava na námestí plnom ľudí, opätovné oživenie a následné rozštvrtenie v pekle nie sú dostatočným trestom za takéto chovanie.
No ale keďže v podstate majú tak trochu aj pravdu, a nejaký ten hardening systémov by mal existovať, nie je dôvod nepoužívané protokoly a šifry povypínať.
Prv než čokoľvek vypneme, by sme ale radi vedieť, či to náhodou niekto aj nepoužíva. V tomto prípade sa logovanie protokolov zapisuje do systémového Event logu s ID 36880. Ich logovanie zapneme cez registre
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SecurityProviders\SCHANNEL\EventLogging = 7
Zachvíľku budeme mať plný log prístupov a rýchlo pochopíme, že nie je možné čítať ho a niečo rozumné si z toho odniesť. Pomôžeme si Kamilovým powershellovým skriptom, ktorý nám logy prelustruje a zoradí v rozumnom výpise:
$filter = '<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[(EventID=36880)]]</Select>
</Query>
</QueryList>'
$domains=(get-adforest).domains; $dcs = foreach ($domain in $domains) { Get-ADDomain -Identity $domain | select -ExpandProperty replicadirectoryservers }
$tm = (Get-Date) - (New-TimeSpan -Day 3)
foreach ($dc in $dcs) {
$dc
Get-WinEvent -ComputerName $dc -MaxEvents 100000 -filterxml $filter | where {$_.TimeCreated -gt $tm }| % {
$_info = [ordered]@{
"Domain Controller" = $dc
"Protocol" = [string] $_.Properties.Value[1]
"CipherSuite" = [string] $_.Properties.Value[2]
"TargetName" = [string] $_.Properties.Value[5]
"TimeCreated" = $_.TimeCreated
}
New-Object psobject -Property $_info
} | export-csv -path C:\temp\36880Events.csv -Delimiter ";" -Append -NoTypeInformation -Encoding Default
}
Skript prejde všetky doménové radiče a logy novšie ako 3 dni, resp. do počtu 100tisíc vyexportuje do csv:
Jediná taká menšia zrada je číslo CipherSuite, ktorú nám to vypíše v decimálnej hodnote, ale zase prehodiť do hexa kódu nie je taký problém (49192 dec = C028 hex). Na základe toho kódu potom vieme zistiť meno tej šifry a overiť si či nie je nebezpečná – napr. https://ciphersuite.info/cs/TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384/ alebo https://www.ibm.com/docs/en/zos/2.3.0?topic=programming-cipher-suite-definitions
.
No a teraz je to už jednoduché. Po nejakom čase si tento výstup vyhodnotíme, zhodnotíme dopad na prevádzku a nakoniec niektoré šifry povypíname. Či už manuálne cez registre, alebo cez nástroj IIS Crypto napríklad.
Krátke doplnenie o skript, ktorý ako vstup používa názov konkrétneho servera.
$filter = '<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[(EventID=36880)]]</Select>
</Query>
</QueryList>'
$server = "NAZOV SERVERA"
$tm = (Get-Date) - (New-TimeSpan -Day 3)
Get-WinEvent -ComputerName $server -MaxEvents 100000 -filterxml $filter | where {$_.TimeCreated -gt $tm }| % {
$_info = [ordered]@{
"Server" = $server
"Protocol" = [string] $_.Properties.Value[1]
"CipherSuite" = [string] $_.Properties.Value[2]
"TargetName" = [string] $_.Properties.Value[5]
"TimeCreated" = $_.TimeCreated
}
New-Object psobject -Property $_info
} | export-csv -path C:\temp\36880Events.csv -Delimiter ";" -Append -NoTypeInformation -Encoding Default