Smartcard-Anmeldung

Früher musste ein Anwender nur seinen NT4-Usernamen und Kennwort eingeben, wenn nicht gleich "Autologin" aktiviert war. Ich hoffe, dass das heute niemand mehr macht und in der Cloud mit der Erreichbarkeit der Dienste von Überall ist eine sichere Anmeldung schon Pflicht. Microsoft fordert sogar zu MFA auf, d.h. dass neben dem Kennwort auch noch eine SMS, ein Einmalkey, die Authenticator App oder biometrische Informationen (Bild, Fingerabdruck) oder ein FIDO2-Key dazu kommen. Das gilt aber erst einmal nur für "Cloud"-Dienst und ausgewählte lokale Dienste, die mit OAUTH umgehen können, wie z.B. Hybrid Modern Authentication (HMA) oder mittlerweile auch PRTG. OnPremises gibt es zwar auch schon länger "Windows Hello for Business" aber in nicht wenigen Firmen ist auch eine klassische Smartcard ein Thema.

Konto per Smartcard absichern

Auf den Prozess des Smartcard-Rollouts gehe ich nicht weiter ein aber damit ein Anwender sich nicht mehr mit Benutzername/Kennwort anmeldet, gibt es eine gesonderte Einstellungen bei Benutzer im Active Directory.

Durch das Setzen des Werts ändern sich bei mir folgende Felder im AD (Erfasst durch GET-ADChanges)

Action,Identity,Field,Value
Modify,CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE,useraccountcontrol,262656
Modify,CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE,ntpwdhistory,
Modify,CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE,dbcspwd,
Modify,CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE,lmpwdhistory,
Modify,CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE,unicodepwd,
Modify,CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE,supplementalcredentials,

Es wird also nicht nur "useraccountcontol" gesetzt. Durch das Setzen von "SMARTCARD_REQUIRED" wird zeitgleich auch das DONT_EXPIRE_PASSWORD-Flag gesetzt, damit das Kennwort nicht aufläuft. Der Benutzer kennt es ja nicht. Zudem wird das Kennwort auf einen zufälligen Wert gesetzt, damit der Anwender sich nicht mehr anmelden kann.

Auch wenn es hier nicht offen sichtbar wird, sollte ein SmartCard-User auch einen geeigneten UPN haben.

Kennwort absichern

Die Einschränkung bezieht sich aber nur auf "Interaktive Logons". Der Anwender könnte natürlich immer noch eine "Anmeldung als Service" o.ä. mit dem bekannten Kennwort durchführen. Daher kann es eine Option sein, auch das normale Kennwort des Anwenders zu ändern, so dass dieser es gar nicht mehr kennt. Es ist aber ein Kennwort und es könnte durch einen Abgriff der NTDS.DIT im Rahmen eines Angriffs über Hashwerte/Rainbow-Tables auch durch Angreifer ermittelt und der Zugang missbraucht werden.

Daher ist auch hier regelmäßiger Wechsel wünschenswert. Dies gilt umso mehr, da der Anwender mit Smartcard sein eigentliches Kennwort gar nicht mehr ändert und ohne Vorkehrungen es durchaus angreifbar wäre. Bei einer Anmeldung per NTLM wird vom Kennwort ein Hashwert gebildet, der nur mit einer Kennwortänderung ungültig wird. Nur weil sich der Anwender nicht mehr "interaktiv" ohne Kennwort anmelden kann, so können

Über die Kennwortrichtlinien kann ich schon für die interaktive Anmeldung entsprechende Anforderungen an Komplexität, Dauer, Länge, etc. stellen. Wenn der Benutzer aber sich eh nur per Smartcard anmeldet, bekommt er den Dialog nicht. Seit Windows 2016 kann aber Windows selbst das Kennwort anhand der Kennwortrichtlinie ändern. Hierfür gibt es mit dem Property "msDS-ExpirePasswordsOnSmartCardOnlyAccounts" auf jeder AD-Domain eine elegante Funktion, diesen Kennwortwechsel zu automatisieren ohne eigene Skripte einsetzen zu müssen:

Der Standardwert ist "False" aber kann einfach auf "True" gesetzt werden. Auch per AD-PowerShell kann der Wert einfach gesetzt und gelesen werden.

Set-ADDomain `
   -Identity uclabor.de `
   -PublicKeyRequiredPasswordRolling $true

PS C:\> Get-ADDomain | ft name,PublicKeyRequiredPasswordRolling

name    PublicKeyRequiredPasswordRolling
----    --------------------------------
UCLABOR                             True

Damit übernimmt dann der Domain Controller die Aufgabe die Kennworte der Benutzer gemäß der Kennwortrichtlinie zu ändern. Die Einstellung gibt es auch als Dialog im "Active Directory Administrative Center":

 Für Smartcard-Benutzer kann ich daher eine eigene Richtlinie anlegen, welche dann die Kennworte nicht erst alle Monate ändert.

Kennwort Richtlinien

Seit Windows 2016 muss ich die Kennwort-Richtlinie nicht mehr pro Domain steuern, sondern kann dies feiner abstimmen. Über die neuen "Password Settings" kann ich für die Benutzer oder OUs dann eine Richtlinie anlegen, die z.B. einen täglichen Kennwortwechsel anfordert.

Wenn Sie wirklich jeden Tag ein neues Kennwort erfordern, dann sollten Sie diese Richtlinien nur auf die Personen anwenden, die sich per Smartcard anmelden müssen und nicht auf Dienstkonten o.ä. Damit ist aber sichergestellt, dass die Anwenderkennworte selbst beim Abgriff der Hashwerte meist schon geändert sind, ehe ein Angreifer ein zum Hashwert passendes Kennwort gefunden hat. Per PowerShell kann ich auch Werte <1 Tag angeben:

# Neue Policy anlegen
New-ADFineGrainedPasswordPolicy `
   -Name:"SmartcardUser-Policy” `
   -Precedence:1 `
   -MaxPasswordAge:"00.00:05:00" `
   -MinPasswordAge:"00.00:00:00" `
   -ComplexityEnabled:$true `
   -LockoutDuration:”00:30:00" `
   -LockoutObservationWindow:"00:30:00" `
   -LockoutThreshold:0 `
   -MinPasswordLength:120 `
   -PasswordHistoryCount:24 `
   -ReversibleEncryptionEnabled:$false

# An Benutzer zuweisen
Add-ADFineGrainedPasswordPolicySubject `
   -Identity " CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE" `
   -Subjects "CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE"

Technisch werden dabei folgende Einträge im AD gemacht:

Action,Identity,Field,Value
NewOrMove,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,parentguid,9f e7 fb c9 33 5f 71 46 b2 ca 9c 9d 56 b8 9b 2e
NewOrMove,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,parentdn,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-minimumpasswordlength,120
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-passwordreversibleencryptionenabled,False
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-minimumpasswordage,0
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,ntsecuritydescriptor,System.Byte[]
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-lockoutobservationwindow,-18000000000
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,objectcategory,CN=ms-DS-Password-Settings,CN=Schema,CN=Configuration,DC=UCLABOR,DC=DE
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-passwordcomplexityenabled,True
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-passwordsettingsprecedence,1
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-maximumpasswordage,-3000000000
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,whencreated,04/14/2022 16:46:10
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-lockoutduration,-18000000000
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-lockoutthreshold,0
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,objectclass,top msDS-PasswordSettings
Modify,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-passwordhistorylength,24
Add,CN=SmartcardUser-Policy,CN=Password Settings Container,CN=System,DC=UCLABOR,DC=DE,msds-psoappliesto,CN=Smardcardonly-User,OU=FCTest,OU=Accounts,DC=UCLABOR,DC=DE

Die letzte Zeile ist die Zuweisung an den Benutzer:

Password-Änderung

Ich habe dann einige Zeit gewartet, bis und in welchem Intervallen der DC das Kennwort ändert. Leider habe ich aber keine einzige Änderung gesehen. Erst wenn ich mich per Smartcard anmelde und das Kennwort zu alt ist, dann scheint das auf dem DC die entsprechende Aktion zu triggern. Das Kennwort wird nur aktualisiert, wenn ich mich anmelden. So steht es auch in der GUI des "Active Directory Administration Center"

Umgekehrt bedeutet das, dass das Kennwort eines inaktiven Benutzers auch nicht geändert wird, selbst wenn die Kennwortrichtlinie eine sehr häufige Änderung vorschreibt.

Vielleicht ist es dann doch wieder besser, per geplantem Task alle Benutzer zu ermitteln, bei denen "

ADSync

Die Aktivierung eines Benutzers zur Smartcard-Anmeldung ändert zwar lokal das Feld UserAccountContol und einige andere Einträge, die aber hinsichtlich ADSync keine weitere Auswirkungen haben. Ich habe beim "Delta Import" zwar gesehen, dass ADSync eine Änderung gelesen aber beim nachfolgenden Export nichts in die Cloud übertragen hat.

Eine Suche in den ADSync Rules oder auch im Metaverse hat aber keinen Treffer auf "UserAccountContol" oder ein ähnliches Feld ergeben. Der Cloud ist diese Einstellungen hier erst einmal egal.

Wenn Sie aber schon Smartcard-Anmeldungen o.ä. aktiviert haben und sich im ADSync Wizard z.B. per Smartcard anmelden müssen, dann hilft ihnen folgende Information

To use authentication support for non-password scenarios such as federated accounts, smartcards and MFA scenarios, you can provide the switch /InteractiveAuth when starting the wizard. Using this switch will bypass the Wizard's authentication user interface and use the MSAL library's UI to handle the authentication.
Quelle Custom installation of Azure Active Directory Connect https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-install-custom

Virtuelle Smartcard

Nicht jeder wird einen Smartcard-Leser im Computer haben und dann noch eine Smartcard. Es gibt mittlerweile auch Smartcards als USB-Stick, die quasi Leser und Karte kombiniert haben. Mit einem TPM-Chip können Sie aber auch eine virtuelle Smartcard auf dem Computer mit dem Programm tpmvscmgr.exe einrichten. Das funktioniert sogar in einer VM, wenn es z.B. eine HyperV Gen2 Umgebung ist und sie TPM in den Einstellungen der VM aktiviert haben.

TpmVscMgr create /Name Test /pin Prompt /adminkey random /generate

Entfernen geht in dem Fall auch wieder schnell mit:

TpmVscMgr destroy /instance root\smartcardreader\0000

Danach sollten sie im Gerätemanager die virtuelle Smartcard auch finden:

Wenn Sie dann eine PKI mit einem entsprechenden Template haben, können Sie das Zertifikat über die MMC für Computer oder, sofern installiert, das Webenrollment auf http://<pkiurl>/certsrv/ anfordern.

Wenn der Rollout korrekt gelaufen ist, sollten Sie das Zertifikat in ihrem Zertifikatsspeicher finden.

Leider können Sie bei der Nutzung des TPM nicht einfach die Smartcard "rausziehen" um die sichere Ablage zu prüfen. Bei einer Anmeldung an einem Server z.B. per RDP können Sie aber sehen, dass das Zertifikat nun aus dem Sicherheitsschlüssel kommt und sie die PIN eingeben müssen:

Achtung:
Die Ablage der Smartcard im TPM-Chip ist nur so sicher wie die Zugriffskontrolle auf die Windows Instanz und den Chip. Wählen Sie eine "gute" PIN und nicht grade 12345678 und der Schutz der Festplatte mittels Bitlocker sollte auch selbstverständlich sein. Es gibt aber in dem Fall keine physikalische Trennung von Smartcard und PIN-Eingabe über eine andere Tastatur.

Im dem Zuge kommt nun auch "Windows Hello for Business" ins Blickfeld, welche mit virtuellen Smartcards harmoniert, um die PIN-Eingabe zu vereinfachen.

Windows Hello for Business is an alternative sign-in method for Windows 10 devices. It uses Active Directory or an Azure Active Directory (Azure AD) account to replace a password, smart card, or virtual smart card.
Quelle: Windows Hello for Business settings in Configuration Manager  https://docs.microsoft.com/en-us/mem/configmgr/protect/deploy-use/windows-hello-for-business-settings

Beginning with Windows 10, version 1709, Windows Hello for Business used as a smart card (smart card emulation that is enabled by default) provides the same user experience of default smart card PIN caching. Each process requesting a private key operation will prompt the user for the PIN on first use. Subsequent private key operations won't prompt the user for the PIN. The smart card emulation feature of Windows Hello for Business verifies the PIN and then discards the PIN in exchange for a ticket. The process doesn't receive the PIN, but rather the ticket that grants them private key operations. Windows 10 doesn't provide any Group Policy settings to adjust this caching.
Quelle: https://docs.microsoft.com/en-us/windows/security/identity-protection/hello-for-business/hello-faq#how-does-pin-caching-work-with-windows-hello-for-business

Cloud-Anmeldung

Wenn der Benutzer aber sein Kennwort nicht mehr kennt, weil es ein Skript regelmäßig oder der Domain Controller bei der Anmeldung ändert, dann kann ADSync mit Password Hash Sync (PHS) zwar ein Kennwort synchronisieren, aber der Anwender kann damit nichts anfangen. Er kann sich ja nicht anmelden. Auch Pass Through Authentifizierung (PTA) hilft nicht weiter, da auch hier die Cloud die Credentials erwartet und durch den lokalen DC verifizieren lässt.

Nach meinem Kenntnisstand kann Microsoft 365 und Office 365 nicht direkt eine Anmeldung per Smartcard unterstützen. Aber das ist auch nicht erforderlich, denn mit "Modern Auth/Oauth/SAML" kann die Cloud einen entsprechend kompatiblen Client ja zu einem OAUHT/SAML-Server schicken, der dann die Anmeldung per Smartcard ausführt und dann ein Ticket ausstellt, welches von der Cloud akzeptiert wird. Genau genommen muss der Client auch "nur" ein Primary Refresh Token" oder TGT bekommen, um sich in der Folge weitere Zugriffstokens zu besorgen.

Nach meinem Kenntnisstand kann ein Client sich per Smartcard nur mit einem selbst betriebenen ADFS-Service authentifizieren.

Aktuell habe ich noch keine Information vorliegen, wie sich ein Client an der Cloud allein über den EVOSTS-Service (login.microsoftonline.com) per Smartcard anmelden kann.

Weitere Links