VMware vCenter Zertifikat erneuern

Ich musste gerade das Zertifikat meiner VMware-Laborumgebung mit vCenter aktualisieren und habe nach einer guten Anleitung dazu gesucht. Ich habe keine vollständige Anleitung gefunden, also habe ich mich entschlossen, hier eine zu veröffentlichen.

So geht’s:

  1. Melden Sie sich mit SSH auf dem vCenter Server an (Sie müssen SSH aktivieren, wenn es deaktiviert ist)
  2. Geben Sie shell in die Konsole ein.
  3. Erstellen Sie ein Verzeichnis, in dem wir alles speichern werden: mkdir /tmp/cert
  4. Führen Sie chsh -s /bin/bash root aus, um später eine Verbindung über WinSCP zu ermöglichen
  5. Starten Sie den Zertifikatsmanager: /usr/lib/vmware-vmca/bin/certificate-manager
  6. Wählen Sie die erste Option („Replace Machine SSL certificate with custom certificate“)
  7. Geben Sie den lokalen Administrator ein (d.h. standardmäßig administrator@vsphere.local)
  8. Wählen Sie die erste Option („1. generate Certificate Signing Request(s) and Key(s) for Machine SSL certificate“)
  9. Geben Sie den Pfad zu dem in Schritt 3 erstellten Ordner ein (/tmp/cert)
  10. Geben Sie die Parameter des Zertifikats an. Für die Optionen „Name“ und „Hostname“ müssen Sie den FQDN des Servers angeben
  11. Die CSR zur Erstellung des Zertifikats durch Ihre CA wird im Ausgabeverzeichnis gespeichert
  12. Laden Sie den CSR über WinSCP herunter und erstellen Sie auf dieser Basis ein Zertifikat. Das Zertifikat muss im Base64-Format vorliegen und Sie benötigen das öffentliche Stammzertifikat Ihrer CA.
  13. Laden Sie das Zertifikat und das Wurzelzertifikat in den /tmp/cert-Ordner hoch
  14. Setzen Sie den Dialog fort (Option 1) oder wenn Sie etwas Zeit dazwischen hatten, können Sie nach dem Start des Zertifikatsmanagers statt Option 1 auch Option 2 wählen.
  15. Nun müssen Sie die Pfade zu dem Zertifikat, dem Schlüssel und dem Stammzertifikat Ihrer CA angeben
  16. Ist dies geschehen, installiert der Assistent das Zertifikat. Dies dauert eine Weile und wird fast alle Dienste neu konfigurieren und neu starten.

Getestet auf vCenter 6.5 und vCenter 6.7

VMware Remote Console (VMRC) silent installieren

Nachdem ich mich einige Stunden damit herumgeschlagen hatte, fand ich schließlich den folgenden Befehl heraus, um VMRC ohne Neustart und mit deaktivierten automatischen Software-Aktualisierungsverfahren zu installieren. Mit diesem Befehl:

VMware-VMRC-10.0.2-7096020.exe /s /v "/qn REBOOT=R EULAS_AGREED=1 AUTOSOFTWAREUPDATE=0 ATACOLLECTION=0"

Zur Deinstallation verwende diesen Befehl (die GUID kann bei anderen VMRC-Versionen anders lauten):

MsiExec.exe /X{09E3AC7C-395C-47C6-9F66-4B9FB8325341} /qn /norestart

 

Automatisch IP Adressen von Angreifern mit der Windows Firewall blockieren

Durch Zufall habe ich entdeckt, dass in einem meiner Ereignisprotokolle („Applications and Services Logs\Microsoft\Windows\RemoteDesktopServices-RdpCoreTS\Operational“) mehrere Einträge mit der ID 140 vorhanden sind. Diese Ereignisse protokollieren die Versuche von Benutzern, sich über RDP auf meinem Server anzumelden versuchen, aber mit falschen Anmeldeinformationen. Natürlich sollte es keine Versuche geben oder vielleicht nur einen oder zwei von mir selbst. Aber in meinem Fall sind es Hunderte.

Zuerst habe ich überprüft, ob mein lokales und mein Domänenadministratorkonto beide deaktiviert sind. Dies war der Fall, so dass die meisten Anmeldeversuche ebenfalls fehlschlagen, weil der jeweilige Benutzer deaktiviert ist. Ich nehme an, dass die meisten versuchen, diese Benutzer zu verwenden. Der Benutzer wird durch die Versuche nicht gesperrt, da zwischen den Wiederholungsversuchen genügend Zeit liegt.

Der Text des Anmeldeversuchs im Ereignisprotokoll lautet „A connection from the client computer with an IP address of xxx.xxx.xxx.xxx failed because the user name or password is not correct.“.

Also habe ich ein PowerShell-Skript erstellt, das diese Meldungen ausliest, die IP daraus filtert und in die Blacklist der Windows Firewall aufnimmt.
Voraussetzung dafür ist, dass es bereits eine Firewall-Regel mit mindestens 2 blockierten IP-Adressen gibt. Ich war einfach zu faul, dies in meinem Skript zu lösen. Um diese Regel zu erstellen, starten Sie die Windows Firewall Einstellungen und erstellen Sie eine neue Regel unter „Eingehende Regeln“.

Wählen Sie „Benutzerdefiniert“ aus. Lassen Sie „Alle Programme“ stehen (klicken Sie einfach auf „Weiter“). Beliebigen Protokolltyp und Port belassen (einfach „Weiter“ klicken). Wählen Sie im Abschnitt „Anwendungsbereich“ unter „Für welche entfernten IP-Adressen gilt diese Regel?“ die Option „Diese IP-Adressen“ und fügen Sie zwei Dummy-Adressen hinzu, z. B. 1.2.3.4 und 1.2.3.5. Wir brauchen mindestens zwei Adressen für das Skript. Klicken Sie auf „Weiter“.

Wählen Sie „Die Verbindung blockieren“.

Bei „Profil“ kreuzen Sie alle Profile an. Auf der letzten Seite geben Sie einen guten Namen für Ihre Regel ein. Wir werden den Namen in unserem Skript benötigen. Nun ist Ihre Regelkonfiguration abgeschlossen.

Jetzt das Skript. Dies ist der Code, der mit den bereits genannten Voraussetzungen arbeitet. Kopieren Sie den Text in eine Datei mit der Endung .ps1.

### Variables ###
# The name of the firewall rule in Windows Firewall
$firewallRuleName = "Block RDP Attackers"

# IPs that will not be blacklisted. i.e. your home IP if you are using Dyndns or any other static IP
$whiteList = @(
[System.Net.Dns]::GetHostAddresses("myhome.dyndns.org").IPAddressToString, #Example for DNS entry
"89.20.58.68" #Example for IP
)


### Script ###
Write-Host "Running at $(Get-Date)"
$regExIp = "\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?"
$regExIp6 = "((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?"

# Get the current Eventlogs with the 140 event
$currentAttackers = @(Get-Winevent Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational | Where-Object {$_.Id -eq 140} | Select Message -ExpandProperty Message)

# If there is no response, there are no attacks
if ($currentAttackers -eq $null) {
Write-Host "No current attackers"
return
}

# Get each attackermessage and filter the IP from it using the regex above
for ($i = 0; $i -lt $currentAttackers.Count; $i++) {
if ($currentAttackers[$i] -match $regExIp -or $currentAttackers[$i] -match $regExIp6){
$currentAttackers[$i] = $Matches[0]
} 
}

# Get the already known attackers from the firewall rule
$knownAttackers = (Get-NetFirewallRule -DisplayName $firewallRuleName | Get-NetFirewallAddressFilter).RemoteAddress
if ($knownAttackers -eq $null){
$knownAttackers = @()
}
$knownAttackers = $knownAttackers | Sort-Object -Unique

# Check each logged attacker and check if it is already known
foreach($newAttacker in $currentAttackers) {
if ($knownAttackers.Contains($newAttacker)) { #If it is known, don't do anything
continue
}
elseif ($whiteList -contains $newAttacker) { #If it is whitelisted, don't do anything
Write-Host "$newAttacker is dynamically whitelisted"
continue
}
else{ #otherwise it is a new attacker and add it to the blacklist
$knownAttackers += $newAttacker
Write-Host "Added $newAttacker"
}
}

# remove dublicates (should not be there, but anyway...)
$knownAttackers = $knownAttackers | Sort-Object -Unique
Write-Host "$($knownAttackers.Count) IPs on blacklist"

# Setting Firwall rules with all known and all new attackers
Set-NetFirewallRule -DisplayName $firewallRuleName -RemoteAddress $knownAttackers
Write-Host ""

Letzte Änderungen: (23.01.2021) IPv6 hinzugefügt und ein Problem behoben, wenn nur ein Event existiert. Dank an Joachim

Wenn Sie einen anderen Namen als „Block RDP Attackers“ für die Firewall-Regel haben, müssen Sie die Zeile „$firewallRuleName = „Block RDP Attackers““ in Ihren Regelnamen ändern.

Führen Sie das Skript „als Administrator“ aus. Es wird Ihr Ereignisprotokoll durchsuchen und alle IPs ermitteln, die in den Ereignissen mit der ID 140 im entsprechenden Protokoll erwähnt werden. Diese IPs werden zu der zuvor erstellten Regel hinzugefügt und blockieren diese IPs in Zukunft.

Ich habe eine geplante Aufgabe für dieses Skript, um es regelmäßig auszuführen. In einem Zeitraum von nur wenigen Stunden sind bereits etwa 600 IP-Adressen auf meiner Blockliste. Wenn Sie die geplante Aufgabe konfigurieren, achten Sie darauf, dass das Kontrollkästchen „mit höchsten Rechten ausführen“ aktiviert ist.

Übersetzt mit www.DeepL.com/Translator (kostenlose Version)