UserAccountControl: Sicherheitseinstellungen für AD-Konten prüfen und ändern


    Tags: , ,

    Account LockoutDas Attribut User­Account­Control im Active Direc­tory enthält mehrere kritische Konto­­ein­­stellungen. Das be­trifft etwa das Ablauf­­datum von Pass­wörtern oder die Dele­gierung. Ein AD-Audit sollte dieses Attribut regel­mäßig prüfen. Das lässt sich mit Power­­Shell erle­digen, und für das Ändern der Flags gibt es ein eigenes Cmdlet.

    Bei UserAccountControl handelt es sich um einen Integer-Wert, und jedes seiner Bits dient als Flag für eine der Einstellungen.

    So bedeutet zum Beispiel der Wert 2, dass das Konto deaktiviert wurde, oder 32 steht dafür, dass es kein Passwort benötigt. Eine vollständige Übersicht bietet die folgende Tabelle aus Microsofts Dokumentation.

    Flag Wert Beschreibung
    SCRIPT 1 The logon script will be run.
    ACCOUNTDISABLE 2 The user account is disabled.
    Undeclared 4 This flag is undeclared.
    HOMEDIR_REQUIRED 8 The home folder is required.
    LOCKOUT 16  
    PASSWD_NOTREQD 32 No password is required.
    PASSWD_CANT_CHANGE 64 The user cannot change the password. This is a permission on the user's object.
    ENCRYPTED_TEXT_
    PWD_ALLOWED
    128 Indicates whether Active Directory will store the password in the reversible encryption format.
    TEMP_DUPLICATE_ACCOUNT 256 This is an account for users whose primary account is in another domain. This account provides user access to this domain, but not to any domain that trusts this domain.
    NORMAL_ACCOUNT 512 This is a default account type that represents a typical user.
    INTERDOMAIN_TRUST_ACCOUNT 2048 This is a permit to trust an account for a system domain that trusts other domains.
    WORKSTATION_TRUST_ACCOUNT 4096 This is a computer account for a computer that is running Microsoft Windows NT 4.0 Workstation, Microsoft Windows NT 4.0 Server, Microsoft Windows 2000 Professional, or Windows 2000 Server and is a member of this domain.
    SERVER_TRUST_ACCOUNT 8192 This is a computer account for a domain controller that is a member of this domain.
    DONT_EXPIRE_PASSWORD 65536 Represents the password, which should never expire on the account.
    MNS_LOGON_ACCOUNT 131072 This is an MNS logon account.
    SMARTCARD_REQUIRED 262144 When this flag is set, it forces the user to log on by using a smart card.
    TRUSTED_FOR_DELEGATION 524288 When this flag is set, the service account (the user or computer account) under which a service runs is trusted for Kerberos delegation. Any such service can impersonate a client requesting the service.
    NOT_DELEGATED 1048576 When this flag is set, the security context of the user is not delegated to a service even if the service account is set as trusted for Kerberos delegation.
    Can be set using "Account is sensitive and cannot be delegated" checkbox.
    USE_DES_KEY_ONLY 2097152 Restrict this principal to use only Data Encryption Standard (DES) encryption types for keys.
    DONT_REQ_PREAUTH 4194304 This account does not require Kerberos pre-authentication for logging on.
    PASSWORD_EXPIRED 8388608 The user's password has expired.
    TRUSTED_TO_AUTH
    _FOR_DELEGATION
    16777216 The account is enabled for delegation. This is a security-sensitive setting. Accounts that have this option enabled should be tightly controlled. This setting lets a service that runs under the account assume a client's identity and authenticate as that user to other remote servers on the network.
    PARTIAL_SECRETS_ACCOUNT 67108864 The account is a read-only domain controller (RODC). This is a security-sensitive setting. Removing this setting from an RODC compromises security on that server.

    Wenn man die Liste durchsieht, dann stellt sich heraus, dass einige Einstellungen sicherheits­relevant sind. Das gilt etwa für die Option, dass ein Konto kein Passwort benötigt oder dafür eine symmetrische Verschlüsselung zulässt, ob Kerberos-Delegierung genutzt werden darf oder ob es sich mit einer Smartcard anmelden muss.

    PowerShell bietet mit zwar mit Set-ADAccountControl ein Cmdlet, mit dem man diese Flags ändern kann, aber kein Gegenstück zum Auslesen und Aufschlüsseln des Attributs. Man kann dessen Wert jedoch aus AD-Benutzer und -Computer auslesen oder dafür zum Beispiel Get-ADUser ausführen.

    Wert des Attributs userAccountControl aus dem AD-Benutzer und -Computer entnehmen

    Wenn man für diese Aufgabe PowerShell bevorzugt, dann sieht das entsprechende Kommando so aus:

    Get-ADUser <user> -properties UserAccountControl |
    select UserAccountControl

    Attributwert aufschlüsseln

    Als Ergebnis erhält man dann den Dezimalwert des Attributs, den man dann selbst interpretieren muss. Eine Möglichkeit besteht darin, diesen in eine binäre Zahl zu konvertieren und anschließend jede ihrer Stellen abzuklappern, um nachzusehen, ob sie auf 1 gesetzt ist. Trifft das zu, dann gibt man das dazugehörige Flag aus.

    Das obige Script konvertiert die binäre Repräsentation des Attributwerts in ein Character-Array und dreht dessen Reihenfolge um, weil die Überprüfung mit der niedrigsten Stelle, also von hinten beginnen muss.

    Konten mit bestimmtem Flag finden

    Mit diesem Script kann man alle Flags für einzelne Konten ausgeben. In der Praxis wird man hingegen oft wissen wollen, welche Konten ein bestimmtes Flag gesetzt haben.

    In einigen Fällen muss man dafür nicht den Wert von UserAccountControl aufdröseln, weil PowerShell dafür einfachere Methoden zur Verfügung stellt. Das gilt zum Beispiel für:

    Will man aber etwa herausfinden, welche Accounts das Speichern der Passwörter in einem entschlüssel­baren Format zulassen, dann könnte man folgende Abfrage nutzen:

    Get-ADUser -Filter * -Properties UserAccountControl |
    Where { $_.UserAccountControl -band 128} | Select name

    Dieser Aufruf nutzt ein Bit-weises and, um festzustellen, ob das Flag ENCRYPTED_TEXT_PWD_ALLOWED gesetzt ist. Wie man aus der Tabelle entnehmen kann, repräsentiert es die achte Stelle der binären Zahl (2 ^ 7 = 128, Zählung startet bei Bit 0). Wenn man auf sie eine -band-Operation mit dem Wert 128 anwendet und das Ergebnis $true ist, dann weiß man, dass das Flag gesetzt ist.

    Nach dem gleichen Muster kann man die Werte für die anderen Flags in diese Abfrage einsetzen:

    Get-ADComputer -Filter * -Properties UserAccountControl |
    Where { $_.UserAccountControl -band 524288 } | Select name

    Dieses Beispiel würde Computer-Konten ermitteln, denen bei der Kerberos-Delegierung vertraut wird.

    Flags ändern

    Hat man Konten ermittelt, die ungünstig konfiguriert sind, dann kann man das Attribut UserAccountControl relativ einfach mit dem bereits erwähnten Cmdlet Set-ADAccountControl ändern.

    Das PowerShell-Cmdlet kann den Wert für die Flags von UserAccountControl über eigene Parameter setzen.

    Es bietet einen eigenen Parameter für jedes Flag, den man nach Bedarf auf $true oder $false setzen kann.

    Für einzelne Konten kann man einige Einstellungen  von UserAccountControl interaktiv mit Hilfe von Active Directory-Benutzer und -Computer konfigurieren.

    Kontoeinstellungen in AD-Benutzer und -Computer ändern

    Zusammenfassung

    Das Attribut UserAccountControl enthält mehrere sicherheits­relevante Einstellungen für AD-Konten. Diese sind als Bits eines Integer-Werts implementiert. Leider bietet PowerShell kein Cmdlet, mit dem sich das Attribut aufschlüsseln lässt.

    Daher muss man UserAccountControl über Get-ADUser oder Get-ADComputer ermitteln und dann über eine Bit-Operation auf die einzelnen Flags abfragen.

    Findet man unerwünschte Einstellungen, dann kann man diese hingegen sehr einfach mit Set-ADAccountControl ändern.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut

    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links