Thursday, September 25, 2014

Kerberos-Verschlüsselung in Domänen mit 2003 Domain Controllern



Das folgende Beispiel schildert eine Lösung für die Konfiguration von Clients mit Hilfe von Group Policy Preferences und LDAP-Filtern. Ähnliche Vorgehensweisen können auch für andere Aufgaben verwendet werden, so kann z.B. die Richtlinieneinstellung Ordner nur auf primären Computern umleiten, die ab Windows 8 verfügbar ist, mit den gleichen Methoden auch für ältere Betriebssysteme implementiert werden.

Das Problem

Ab Windows Vista wird für Kerberos AES als Standard-Verschlüsselungsverfahrenverwendet. Dieser Blogbeitrag beschreibt einen Schönheitsfehler, wenn Windows 7/8 Clients in einer Domäne betrieben werden, deren Domain Controller noch unter Windows Server 2003 (R2) betrieben werden.

Windows 7 verwendet für Kerberos AES als Standardverschlüsselung, Windows Server 2003 kennt aber nur RC4. Der erste Anmeldeversuch schlägt daher stets fehl, und auf dem DC wird ein Event 675 protokolliert. Windows 7 wiederholt den Anmeldeversuch dann mit RC4. Das ist zwar nur ein Schönheitsfehler, aber in einer verwalteten Umgebung, in der die Security-Eventlogs überwacht werden, führt das zu vielen unnötigen Einträgen. Der Blogbeitrag verrät uns auch gleich die Lösung: Durch Setzen von DefaultEncryptionType (REG_DWORD) auf 0x17 können wir Windows zwingen, RC4 als Standardverschlüsselung zu verwenden.

Anmerkung: Wenn Clients RC4 gegen 2008 DCs verwenden, führt das ebenfalls zum Fehlschlagen des ersten Anmeldeversuchs, da 2008 RC4 standardmäßig verweigert. Auch unschön…

Die Aufgabe

In unseren Domänen befinden sich derzeit noch DCs mit Windows Server 2003. Daher sollen Clients mit Windows Vista und neuer RC4 verwenden. Wenn kein 2003 DC (mehr) vorhanden ist, sollen Clients AES verwenden.

Natürlich könnten wir den zugehörigen Registrierungswert mit SCCM oder ähnlichem verteilen. Dazu müssten wir aber manuell tätig werden, nachdem wir den letzten 2003 DC dekommissioniert haben. Schöner wäre es, wenn unsere Clients das automatisch erkennen würden und sich dann passend konfigurieren.

Die Lösung

Wir suchen nach einem Weg, wie wir auf unseren Clients ermitteln können, ob es in der Domäne noch DCs mit 2003 gibt. Wenn ja, sollen sie DefaultEncryptionType=0x17 verwenden (also RC4), wenn nein, soll DefaultEncryptionType gelöscht und damit wieder AES verwendet werden. Das können wir recht einfach erreichen mit Hilfe von Group Policy Preferences und LDAP-Filtern.

Mit Hilfe der LDAP-Filter können wir nach Computern suchen, die im Attribut operatingSystem den Wert „Windows Server 2003“ enthalten. Wenn wir diese Suche auf OU=Domain Controllers beschränken, sind wir schon fast am Ziel.
Alles, was wir benötigen, konfigurieren wir in einem Gruppenrichtlinienobjekt, das wir anschließend mit den erforderlichen OUs verknüpfen, in denen sich unsere Clients befinden (Arbeitsplätze und ggf. Mitgliedsserver).

Schritt 1: Ermitteln des Distinguished Name der Domäne

LDAP-Filter in Group Policy Preferences bieten uns keine direkte Möglichkeit, eine OU auszuwählen, in der wir suchen wollen. Wir müssen die Bindung (Search Base) in der Form LDAP://OU=Domain Controllers,DC=corp,DC=contoso,DC=com angeben. Den Domain DN können wir natürlich statisch eintragen, aber da wir mehr als eine Domäne verwalten, ist das nicht ideal. Wir holen uns daher den Domain DN in eine Umgebungsvariable, und diese Variable verwenden wir später in der Suche nach 2003 DCs.

Zunächst erstellen wir im Pfad Computerkonfiguration – Einstellungen – Windows-Einstellungen – Umgebung eine neue Umgebungsvariable ComputerDomainDN.

Abbildung 1: Umgebungsvariable ComputerDomainDN erstellen

Den Wert %DomainDN% der Variablen gibt es allerdings noch nicht – diese zweite Variable füllen wir mit Hilfe der Zielgruppenadressierung auf Elementebene auf der Registerkarte Gemeinsame Optionen.

Abbildung 2: Gemeinsame Optionen konfigurieren

Mit der Schaltfläche Zielgruppenadressierung… öffnen wir den Zielgruppenadressierungseditor. Hier erstellen wir im Menü Neues Element eine LDAP-Abfrage, die das Attribut distinguishedName der Domäne ermittelt und den Inhalt in der Variablen DomainDN zurückgibt.

Abbildung 3: Filtern und DomainDN ermitteln

Hinweis: Auch wenn in Abbildung 3 Umgebungsvariablenname steht, existiert die hier angegebene Variable nur temporär innerhalb der Group Policy Preferences. Wir müssen daher eine echte Umgebungsvariable definieren, die wir später auch anderweitig verwenden können.

Schritt 2: Ermitteln von 2003 Domain Controllern

Auch für das Vorhandensein von 2003 DCs verwenden wir eine Umgebungsvariable. Das hat den Vorteil, dass wir in Schritt 3, wenn wir DefaultEncryptionType setzen bzw. löschen, keine zwei LDAP-Filter benötigen, sondern lokal gegen diese Variable filtern können. Damit entlasten wir die Domain Controller von unnötigen LDAP-Abfragen.
Wir erstellen eine zweite Umgebungsvariable DomainContains2003DCs mit dem Wert 1 und der Aktion Ersetzen.

Abbildung 4: Umgebungsvariable DomainContains2003DCs erstellen

Auf der Registerkarte Gemeinsame Optionen aktivieren wir Element entfernen, wenn es nicht mehr angewendet wird und Zielgruppenadressierung auf Elementebene.

Abbildung 5: Gemeinsame Optionen festlegen

Wichtig ist hier die Option Element entfernen, wenn es nicht mehr angewendet wird. Damit sorgen wir dafür, dass diese Umgebungsvariable nur existiert (und 1 enthält), wenn die Zielgruppenadressierung wahr ist.
Im Zielgruppenadressierungseditor erstellen wir wieder einen LDAP-Filter.

Abbildung 6: Ermitteln von 2003 DCs in der Domäne

Ist diese Abfrage wahr (wurden also Computer mit operatingSystem=Windows Server 2003* gefunden), existiert anschließend eine Umgebungsvariable DomainContains2003DCs=1. Ist die Abfrage falsch, existiert die Variable nicht (deshalb haben wir den Modus Ersetzen gewählt und Element entfernen, wenn es nicht mehr angewendet wird aktiviert).

Schritt 3: Konfigurieren von DefaultEncryptionType

Im Pfad Computerkonfiguration – Einstellungen – Windows-Einstellungen – Registrierung erstellen wir ein neues Registrierungselement. Die erforderlichen Werte finden wir im oben verknüpften Blogbeitrag.

Abbildung 7: Festlegen von DefaultEncryptionType

Damit dieser Wert nur erstellt wird, wenn 2003 DCs vorhanden sind, erstellen wir eine Zielgruppenadressierung für Umgebungsvariablen. Um DefaultEncryptionType nur auf Vista und neuer zu konfigurieren, fügen wir eine zweite Zielgruppenadressierung hinzu. Hier können wir leider nicht das verfügbare Element Betriebssystem verwenden, da dieses Element nur genau ein Betriebssystem filtern kann – wir benötigen aber einen Filter für alle Versionen ab Vista und neuer. Deshalb verwenden wir stattdessen die WMI-Abfrage Select * from Win32_OperatingSystem where BuildNumber > 6000.

Abbildung 8: Filtern von DefaultEncryptionType

Wir benötigen jetzt noch ein zweites Registrierungselement, das DefaultEncryptionType löscht, wenn keine 2003 DCs vorhanden sind. Hier wählen wir als Aktion daher Löschen.

Abbildung 9: Löschen von DefaultEncryptionType

Die Zielgruppenadressierung ist fast gleich wie die vorherige, allerdings mit der Option Ist nicht bei der Umgebungsvariablen.

Abbildung 10: Filter für Umgebungsvariable invertieren

Dieser Filter ist also wahr, wenn %DomainContains2003DCs% nicht 1 enthält oder nicht existiert.

Das war’s auch schon. Verknüpfen wir diese GPO mit unseren Clients, so ermitteln diese bei jedem Neustart und bei jeder Hintergrundaktualisierung von GPOs selbständig, ob sich in der Domäne noch 2003 DCs befinden, und konfigurieren DefaultEncryptionType entsprechend.