Windows Server 2022 absichern (Hardening)

In diesem Artikel finden sich meine Einstellungen für das Hardening von Windows Server 2022. Diese Einstellungen können für das Template für VMs genutzt werden. Neue VMs basierend auf diesen Einstellungen erhalten somit schon ein gewisses Maß an Sicherheit. Die Einstellungen sind meiner Meinung nach nicht zu restriktiv und dürften sich damit für die meisten Anwendungen/Dienste eignen.

Für das Hardening habe ich einen Windows Server 2022 Standard (mit Desktop) installiert. Dieser Artikel setzt direkt nach der Installation des Betriebssystems an. Bis auf nötige Treiber bzw. Tools des Hypervisors ist keine weitere Software installiert.

Windows Server 2022

Nach der Installation des Betriebssystems sollte nur die unbedingt erforderliche Software installiert werden (beispielsweise Treiber für die Hardware oder VM-Tools), natürlich in der jeweils aktuellen Version. Zusätzliche Software, welche nur der eigenen Bequemlichkeit dienen, wie beispielsweise andere Browser oder Editoren, haben auf einem Server nichts verloren.

Windows Updates installieren

Direkt nach der Installation des Betriebssystems können schon die ersten Updates installiert werden. Wenn man es noch nicht getan hat, kann man sich an dieser Stelle auch direkt Gedanken über das Patch Management machen.

Windows Updates

Updates müssen zeitnah installiert werden, nicht nur für das Betriebssystem, sondern auch für weitere Software, welche auf dem Server installiert wird.

Lokalen Administrator deaktivieren oder umbenennen

Am besten ist es, wenn der ein neues lokales Administrator Konto angelegt und das vorhandene Konto „Administrator“ deaktiviert wird. Hintergrund ist, dass die SID des lokalen Administrators mit „S-1-5“ beginnt und mit „-500“ endet. Somit ist es recht einfach auch den Namen eines unbenannten Administrator Kontos zu ermitteln:

Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$PrincipalContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Machine, $env:computername)
$UserPrincipal = New-Object System.DirectoryServices.AccountManagement.UserPrincipal($PrincipalContext)
$Searcher = New-Object System.DirectoryServices.AccountManagement.PrincipalSearcher
$Searcher.QueryFilter = $UserPrincipal
$Searcher.FindAll() | Where-Object {$_.Sid -Like "*-500"} | Select-Object SamAccountName,Sid

Die bessere Variante ist also ein neues Administrator Konto zu erstellen und das Konto „Administrator“ zu deaktivieren. Wer auf Nummer sicher gehen will, deaktiviert das lokale Administrator Konto, benennt es um und legt ein neues Konto für die Administration an.

lokale Administrator Konten

Automatischen Start des Server Manager deaktivieren

Das Deaktivieren des Server Managers ist eher kosmetischer Natur, ich persönlich finde es furchtbar, wenn Programme nach der Anmeldung automatisch starten. Gerade der Server Manager startet recht träge und verursacht für eine kurze Zeit eine relativ hohe CPU Last, dass muss ja nicht bei jeder Anmeldung am Server sein, gerade wenn man den Server Manager eher selten oder nicht benutzt:

Server Manager

Damit der Server Manager nicht bei jeder Anmeldung startet, kann der Task für den Server Manager im Task Scheduler deaktiviert werden:

Server Manager

Das Deaktivieren des Tasks schaltet den automatischen Start des Server Manager auch für weitere Benutzer ab, welche sich an dem Server anmelden.

Nicht benötigte Dienste deaktivieren

Windows Server 2022 bringt einige Dienste mit, die für die meisten Server nicht erforderlich sind. Einige der Dienste werden automatisch gestartet, manche werden nur bei Bedarf oder zyklisch durch das Betriebssystem gestartet. Ein gutes Beispiel ist der „Print Spooler“, dieser Dienst ist auf jedem Server aktiv, auch wenn der Server weder als Druckserver dient oder selbst auf Druckern drucken muss. Gerade der „Print Spooler“ sorgte aber mit der „PrintNightmare“-Schwachstelle für erhebliche Sicherheitslücken.

Dienste welche nicht benötigt werden, sollten daher unbedingt deaktiviert werden. Das folgende PowerShell Script liefert alle Dienste, welche meistens nicht benötigt werden:

$Services = @(
"InstallService",
"Spooler",
"Browser",
"WPDBusEnum",
"fdPHost",
"ShellHWDetection",
"TrkWks",
"bthserv",
"NcbService",
"SensrSvc",
"WiaRpc",
"upnphost",
"AudioEndpointBuilder",
"FrameServer"
)
foreach ($Service in $Services) {
Get-Service $Service | select Name,Displayname,StartType,Status
}
Windows Dienste

Mit dem oben angegeben Script lassen sich die Dienste prüfen. Wenn die Dienste nicht benötigt werden, können diese mit dem folgenden Script deaktiviert werden:

$Services = @(
"InstallService",
"Spooler",
"Browser",
"WPDBusEnum",
"fdPHost",
"ShellHWDetection",
"TrkWks",
"bthserv",
"NcbService",
"SensrSvc",
"WiaRpc",
"upnphost",
"AudioEndpointBuilder",
"FrameServer"
)
foreach ($Service in $Services) {
Get-Service $Service | Set-Service -StartupType Disabled
}

Wenn ein Dienst doch benötigt wird, lässt dieser sich ja wieder per Gruppenrichtlinie oder manuell wieder aktivieren. Der Spooler Dienst ist dafür ein gutes Beispiel: In der Standardeinstellung sollte dieser unbedingt deaktiviert sein und nur wenn benötigt wieder aktiviert werden.

Internet Explorer / Edge deinstallieren

In Windows Server 2022 sind gleich zwei Browser vorinstalliert: Internet Explorer und Edge. Auf einem Standard Server benötigt man meiner Meinung nach keinen Browser, daher sollte mindestens der Internet Explorer deinstalliert werden.

Der Internet Explorer erhält ab Juli 2022 keine Sicherheitsupdates und sollte daher deinstalliert werden:

dism /online /Remove-Capability /CapabilityName:Browser.InternetExplorer~~~~0.0.11.0
Internet Explorer

Auch Edge ist auf Windows Server 2022 vorinstalliert, kann aber ebenfalls deinstalliert werden:

Microsoft Edge

Umso weniger Software auf einem Server installiert ist, umso weniger Angriffsfläche gibt es. Natürlich ist es bequem, wenn ein Browser installiert ist und Links in Fehlermeldungen direkt geöffnet werden können.

Wenn es unbedingt erforderlich ist, lässt sich ja später ein Browser wieder bei Bedarf nachinstallieren und direkt mit einer Policy versehen (siehe Abschnitt „Edge Security Baseline“).

Windows Security Baseline anwenden

Microsoft bietet mit dem „Microsoft Security Compliance Toolkit“ einen Satz von Einstellungen an, welche die Sicherheit des Betriebssystems erhöhen. Die empfohlenen Einstellungen lassen sich einfach anwenden und bei Bedarf auch granular zurücknehmen oder erweitern. Das Security Compliance Toolkit kann hier runtergeladen werden:

Aus dem Download mindestens die folgenden beiden Komponenten benötigt:

  • LGPO.zip
  • Windows Server 2022 Security Baseline.zip

Mit LGPO lassen sich die empfohlenen Sicherheitseinstellungen in eine lokale Gruppenrichtlinie übernehmen. Die lokale Gruppenrichtlinie hat den Vorteil, dass sie immer angewendet wird, egal ob der Server später einem Active Directory beitritt oder ein Stand-Alone Server bleibt. Die lokalen Gruppenrichtlinien lassen sich auch mit Domain Gruppenrichtlinien überschreiben, wenn dies erforderlich ist. Somit kann man immer ein gewisses Sicherheitslevel für das Betriebssystem durchsetzen, auch wenn es mal nur schnell ein Testsystem wird, welches möglicherweise keine Gruppenrichtlinie aus dem AD anwendet.

Die Sicherheitseinstellungen aus dem Security Compliance Toolkit lassen sich aber auch in eine Gruppenrichtlinie für die Domain übernehmen. Ob die Einstellungen lokal oder in der Domain vorgenommen werden, kann also frei gewählt werden.

Um die Einstellungen lokal anzuwenden, muss das Tool LGPO in den Unterordner „\Scripts\Tools“ kopiert werden:

Security Baseline

Mit der PowerShell und dem folgenden Befehl können die Richtlinien dann importiert werden:

.\Baseline-LocalInstall.ps1 -WSMember
Security Baseline

Der Parameter „WSMember“ gibt dabei ein, welcher Satz von Richtlinien importiert werden soll. Möglich sind die folgenden Angaben:

  • WSMember – Windows Server, domain-joined member server
  • WSNonDomainJoined – Windows Server, non-domain-joined
  • WSDomainController – Windows Server, domain controller

WSMember eignet sich daher für die meisten Server.

Tipp: Bei VMs kann es nach dem Anwenden der Security Baseline zu dem folgenden Fehler bei der Anwendung der lokalen GPO kommen:

C:\Windows\system32>gpupdate /force
Updating policy…

Computer Policy update has completed successfully.

The following warnings were encountered during computer policy processing:

Windows failed to apply the {F312195E-3D9D-447A-A3F5-08DFFA24735E} settings. {F312195E-3D9D-447A-A3F5-08DFFA24735E} settings might have its own log file. Please click on the „More information“ link.
User Policy update has completed successfully.

For more detailed information, review the event log or run GPRESULT /H GPReport.html from the command line to access information about Group Policy results.

Das Problem sind hier die Einstellungen zum „Device Guard“ bzw. „Virtualization Based Security“ aus der Security Baseline. Diese Einstellungen sind möglicherweise innerhalb einer VM nicht verfügbar oder müssen erst für die VM aktiviert werden. Unter folgendem Link finden sich die Einstellungen für ESXi 7:

Wenn Virtualization Based Security (VBS) vom Hypervisor nicht unterstützt wird, muss die folgende Einstellungen in der lokalen GPO geändert werden:

Device Guard
Nach dem Ändern der Einstellungen meldet auch „gpupdate“ keinen Fehler mehr.

Edge Security Baseline anwenden

Auch für den Edge Browser gibt es eine Security Baseline, diese ist ebenfalls im Microsoft Security Compliance Toolkit halten. Wenn der Edge Browser installiert ist, lassen sich mit der Richtlinie auch ein paar wichtige Einstellungen für Edge direkt anwenden. Auch hier ist es wieder möglich die Sicherheitseinstellungen lokal oder per GPO anzuwenden.

Für eine lokale Richtlinie muss wieder das Tool LGPO in den Unterordner „Scripts\Tools“ kopiert werden. Die lokale Richtlinie kann dann wieder mit „.\Baseline-LocalInstall.ps1“ (ohne Parameter) angewendet werden.

Edge Security Baseline

Windows Firewall konfigurieren

Auch die Windows Firewall enthält einige aktivierte Regeln die auf einem Standard Server nicht unbedingt benötigt werden. Eingehende sind 64 Regeln aktiv:

Windows Firewall

Ausgehend sind es sogar 75 Regeln, obwohl die Windows Firewall hier in der Standardeinstellung alle ausgehenden Verbindungen zulässt.

Windows Firewall

In der Standardeinstellung lässt die Windows Firewall nur Verbindungen zu, die durch eine Regel erlaubt werden. Ausgehende Verbindungen werden (vom lokalen Server zu anderen Zielen) werden in der Standardeinstellung zugelassen und nur geblockt, wenn es es eine entsprechende Regel gibt.

Die Firewall Regeln lassen sich mit dem folgenden PowerShell Script etwas ausdünnen:

$FirewallRules = @(
"AllJoyn Router (TCP-In)",
"AllJoyn Router (TCP-Out)",
"AllJoyn Router (UDP-In)",
"AllJoyn Router (UDP-Out)",
"Captive Portal Flow",
"Cast to Device functionality (qWave-TCP-In)",
"Cast to Device functionality (qWave-TCP-Out)",
"Cast to Device functionality (qWave-UDP-In)",
"Cast to Device functionality (qWave-UDP-Out)",
"Cast to Device SSDP Discovery (UDP-In)",
"Cast to Device streaming server (HTTP-Streaming-In)",
"Cast to Device streaming server (RTCP-Streaming-In)",
"Cast to Device streaming server (RTP-Streaming-Out)",
"Cast to Device streaming server (RTSP-Streaming-In)",
"Cast to Device UPnP Events (TCP-In)",
"Connected User Experiences and Telemetry",
"Desktop App Web Viewer",
"DIAL protocol server (HTTP-In)",
"Email and accounts",
"mDNS (UDP-In)",
"mDNS (UDP-Out)",
"Microsoft Media Foundation Network Source IN [TCP 554]",
"Microsoft Media Foundation Network Source IN [UDP 5004-5009]",
"Microsoft Media Foundation Network Source OUT [TCP ALL]",
"Narrator",
"Start",
"Windows Default Lock Screen",
"Windows Feature Experience Pack",
"Work or school account",
"Your account"
)
foreach ($FirewallRule in $FirewallRules) {
Get-NetFirewallRule -Displayname $FirewallRule | Set-NetFirewallRule -Enabled:false
}

Das Script deaktiviert die entsprechenden Regeln, löscht diese aber nicht. Zusätzlich macht es meiner Meinung nach Sinn, ausgehende RDP Verbindungen vom Server zu anderen Zielen zu verbieten, dies schützt ein wenig davor, dass der Server als „Jump Server“ zu anderen Servern genutzt wird. Es schützt aber nur ein wenig, da jeder mit Administrator Rechten auf dem Server, diese Firewall Regeln einfach wieder deaktivieren kann. Die Firewall Regeln gehören daher eher in eine Domain Gruppenrichtlinie. Wer trotzdem eine entsprechende Firewall Regel zum blockieren von ausgehenden RDP Verbindungen erstellen möchte, kann dafür den folgenden Befehl nutzen:

New-NetFirewallRule -DisplayName "Block Outgoing Remote Desktop Connection" -Direction Outbound -Program "%windir%\system32\mstsc.exe" -Action Block -Description "Block outgoing RDP Sessions by mstsc.exe"

9 Gedanken zu „Windows Server 2022 absichern (Hardening)“

  1. Hallo Franky,

    Vielen Dank für die Beschreibung, hab das bei unserem 2022 Template gleich mal umgesetzt :-)

    Für alle die ein deutsches Windows nutzen, hier die Firewall-Regeln auf deutsch:

    $FirewallRules = @(
    „AllJoyn-Router (TCP eingehend)“,
    „AllJoyn-Router (TCP ausgehend)“,
    „AllJoyn-Router (UDP eingehend)“,
    „AllJoyn-Router (UDP ausgehend)“,
    „Erfassungsportalablauf“,
    ‚“Wiedergabe auf Gerät“-Funktionalität (qWave-TCP eingehend)‘,
    ‚“Wiedergabe auf Gerät“-Funktionalität (qWave-TCP ausgehend)‘,
    ‚“Wiedergabe auf Gerät“-Funktionalität (qWave-UDP eingehend)‘,
    ‚“Wiedergabe auf Gerät“-Funktionalität (qWave-UDP ausgehend)‘,
    ‚“Wiedergabe auf Gerät“-SSDP-Suche (UDP eingehend)‘,
    ‚“Wiedergabe auf Gerät“-Streamingserver (HTTP-Streaming eingehend)‘,
    ‚“Wiedergabe auf Gerät“-Streamingserver (RTCP-Streaming eingehend)‘,
    ‚“Wiedergabe auf Gerät“-Streamingserver (RTP-Streaming ausgehend)‘,
    ‚“Wiedergabe auf Gerät“-Streamingserver (RTSP-Streaming eingehend)‘,
    ‚“Wiedergabe auf Gerät“-UPnP-Ereignisse (TCP eingehend)‘,
    „Benutzererfahrungen und Telemetrie im verbundenen Modus“,
    „Desktop-App-Web-Viewer“,
    „DIAL-Protokollserver (HTTP-In)“,
    „E-Mail und Konten“,
    „mDNS (UDP eingehend)“,
    „mDNS (UDP ausgehend)“,
    „Microsoft Media Foundation-Netzwerkquelle IN [TCP 554]“,
    „Microsoft Media Foundation-Netzwerkquelle IN [UDP 5004-5009]“,
    „Microsoft Media Foundation-Netzwerkquelle OUT [TCP ALL]“,
    „Sprachausgabe“,
    „Starten“,
    „Windows-Standardsperrbildschirm“,
    „Windows Feature Experience Pack“,
    „Geschäfts- oder Schulkonto“,
    „Ihr Konto“
    )

    Antworten
  2. Hallo,

    ich habe eben Versucht auf einem Windows Server 2002 den Edge zu deinstallieren. Ich kann den Edge Uninstall nicht deinstallieren und der Browser wird automatisch wieder installiert.

    gruß
    Tobias

    Antworten
    • Du brauchst mindestens einen Standardbrowser. Ich habe es so gemacht: Direkt nach dem Installieren habe ich Edge deinstalliert. Dann Firefox heruntergeladen und installiert. Danach den IE per CMD löschen.

      Antworten
  3. Die Anwendung der Windows Server 2022 Security Baseline ist prinzipiell eine gute Sache.
    Man stößt jedoch immer wieder auf merkwürdige Verhaltensweisen nach Adaptierung. Das geht von kein Connect per RDP mehr möglich (internal Error 0x4) bis zu nicht mehr funktionierenden SQL Servern (pipe Fehler) oder anderen Auffälligkeiten….
    Dann ist es immer ein Horror herauszuarbeiten werche der ganzen Settings da querschiesst…. ;-)

    Antworten
  4. Den Dienst „bowser/browser“ zu beenden, finde ich auch ein wenig fragwürdig, weil dann „lanmanworkstation“ und „netlogon“ auch nicht mehr funktionieren. Eine RDP Anmeldung wird damit auch nicht leichter. Soll das so?

    Antworten
  5. Den Autostart des Servermanagers kann man auch einfach in der GUI abstellen:
    Verwalten –> Server-Manager-Eigenschaften und dann Häkchen rein bei „Server-Manager beim Anmelden nicht automatisch starten“

    Das ist dann weniger Holzhammer :)

    Antworten

Schreibe einen Kommentar