Wie ja vielleicht dem einen oder anderen bekannt ist, verwendet Citrix FAS für die Authentifizierung der Benutzer eine virtuelle Smartcard. Das ist im Prinzip lediglich ein Zertifikat, dass von einer Microsoft Enterprise CA ausgestellt und für die weitere Anmeldung an den Backend Systemen verwendet wird. Ändert man nichts an den Default Einstellungen sind diese Zertifikate eine Woche lang gültig.
Das bedeutet in diesem Fall auch, dass nach einer Woche ein neues Zertifikat für den Benutzer ausgestellt wird. In meinem derzeitigen Projekt ist die Gültigkeit der Zertifikate auf 6 Stunden reduziert. Für den normalen Betrieb ist die Default Einstellung von einer Woche völlig in Ordnung, in diesem speziellen Fall leider nicht. Was aber jetzt dazu führt, dass sich in der CA jede Menge abgelaufene Zertifikate befinden. Wenn ich jetzt einmal hochrechne, sind das bei einer Gültigkeit von 6 Stunden und 400 User im 24 Stunden Betrieb pro Tag 1600 abgelaufene Zertifikate. Ich rechne jetzt nicht noch weiter, denn das Ergebnis kann sich jeder selbst vorstellen.
Die Anforderung war nun, diese abgelaufenen Zertifikate zu löschen und zu verhindern, dass die CA Datenbank zu stark anwächst und es deshalb zu eventuellen Perfromance Problemen kommt. Leider gibt es von Microsoft oder auch Citrix keine wirkliche Empfehlung (oder ich habe sie einfach nur nicht gefunden). Allerdings existiert von Microsoft ein etwas älterer Artikel der beschreibt, wie mit einer enormen CA Datenbank zu verfahren ist.
The Case of the Enormous CA Database
Microsoft empfiehlt hier sehr Vorsichtig mit dem Löschen von Einträgen in der CA Datenbank zu sein. Das ist im wesentlichen damit zu erklären, da ja der Eintrag in der Datenbank nicht nur das Zertifikat, sondern auch den Private Key erhält. Befinden sich noch irgendwo Daten (E-Mails etc.), die mit diesem Schlüssel verschlüsselt wurden, haben wir nach dem Löschen von Key und Zertifikat keinen Zugriff mehr auf diese Daten. Da es nach dem Löschen auch keine Recovery-Funktion mehr gibt, sollten wir hier sehr vorsichtig sein.
Von Citrix habe ich bisher keine Aussage zu dem Thema Smardcard Zertifikat mit FAS bekommen. Im wesentlichen wird aber sobald das Zertifikat ungültig ist (oder einfach nicht mehr vorhanden), ein neues Zertifikat vom Storefront Server angefordert und von der CA ausgestellt. Damit sollten die abgelaufenen Zertifikate eigentlich nicht mehr benötigt werden.
Nachtrag 24.09.2018: Im CTP Meeting habe ich natürlich die Frage nochmal den Produkt-Managern gestellt und hier die Antwort erhalten, das ich mit meiner Aussage völlig richtig liege. Die Zertifikate können problemlos gelöscht werden.
Die Anforderung im Projekt war jetzt allerdings die abgelaufenen Zertifikate aus Sicherheitsgründen und um einfach Platz zu sparen, zu löschen.
Aus diesem Grund habe ich das ganze mal verifiziert und bin zu dem Schluss gekommen, dass sich für diesen Zweck das Kommandozeilentool certutil.exe am besten eignet. Um das Tool etwas komfortabler zu nutzen, habe ich alles in einem PowerShell Script zusammengefasst.
Das Script hat nur zwei Funktionen. Die erste ist ein Audit, was im wesentlichen lediglich ein “Was wäre wenn” Modus ist und natürlich den erforderlichen -delete Modus. Letzterer löscht wirklich unwiederbringlich alle Zertifikate die dem definierten Filter entsprechen. Kein Recovery, kein doppelter Boden.
Kommen wir zu den Filtern. In der Funktion TK_GetCaTemplate verwende ich als Filter natürlich das Template “Citrix_SmartcardLogon” (Zeile 183 im Script). Solltet ihr ein anderes Certificate Template verwenden oder das Default Template von Citrix umbenannt haben, muss hier natürlich der richtige Name rein. Das bedeutet im Script, dass ich nur Zertifikate löschen möchte, die mit diesem Template erstellt wurden. Alle anderen lasse ich unberührt.
Param (
[Parameter()]
[string]$Filter = "Citrix_SmartcardLogon"
)
In der Funktion TK_RemoveExpiredCerts filtere ich dann nur auf Zertifikate die 1. Issued und 2. bereits seit mindestens 7 Tagen abgelaufen sind. Das ganze ist in den Zeilen 219 bis 222 zu finden.
$DispString = "Issued"
...
$DateFilter = "notafter"
$ValidDate = (Get-Date).AddDays(-7).ToString("dd.MM.yyyy")
Das ganze Skript soll später über einen Scheduled Task laufen, deshalb gibt es keine Ausgaben in der Konsole. Hier muss das Skript dann mit -Verbose gestartet werden. Natürlich schreibe ich wie immer ein ausführliches Logfile (C:\_Logs) und erzeuge in einem Unterorder auch die Ausgabe der zu löschenden Zertifikate. Diese Datei kann z.B. auch zur Dokumentation verwendet werden.
Wer das Script auf der Konsole ausführt, wird zumindest einen kleinen doppelten Boden bemerken. Bevor ich mit dem tatsächlichen Löschen beginne, habe ich einen 20 Sekunden Timer eingebaut. Dieser lässt euch die Zeit, nochmal schnell CTRL-C zu verwenden, falls der Schalter -delete mal irrtümlich verwendet wurde. Der Timer sowie die Anzahl der Sekunden ist in der Zeile 311 im Script zu finden.
Start-Countdown -Seconds 20 -Message "Script run in DELETE MODE!!! You have 20 seconds to break (CTRL-C) this script."
Wer das Script verwenden möchte, kann es sich wie immer bei Github herunterladen. Aber auch an dieser Stelle nochmal die Warnung, gelöscht bleibt gelöscht – also Vorsicht.
Sehr interessantes Script. Ich verwende zwar kein Citrix, habe aber einen ähnlichen use case und werde es entsprechend umbauen. Vielen Dank für den Gedankenanstoß.
Wäre toll, wenn Du Deine „Modifikationen“ in Github oder als Kommentar teilst.