it-swarm.com.de

Überprüfen der Kennwortrichtlinie für vorhandene Benutzer

Ich bin kürzlich in eine Umgebung gekommen, in der für viele Datenbankanmeldungen das Flag enforce_password_policy Nicht aktiviert ist.
Eine bevorstehende Prüfung erfordert die Überprüfung der Passwörter dieser Anmeldungen.

Ich habe die folgende Abfrage verwendet, um eine Liste der Anmeldungen zu erhalten und um festzustellen, ob die Flags aktiviert oder deaktiviert sind.

select 
    @@SERVERNAME as servername, 
    name, 
    IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN,
    type_desc,
    create_date,
    is_policy_checked,
    is_disabled,
    password_hash,
    PWDCOMPARE(name, password_hash) as UsernameAsPassword
FROM sys.sql_logins

Dies sagt mir jedoch nicht, ob die Kennwörter tatsächlich der Kennwortrichtlinie entsprechen, da das Flag nur beim Erstellen eines Benutzers relevant ist.

Gibt es eine bekannte Möglichkeit, vorhandene Benutzer auf die Einhaltung von Kennwortrichtlinien zu testen?
Ich habe keinen Zugriff auf die alten Passwörter und würde eine Methode bevorzugen, die sie nicht erfordert.

11
Reaces

Dies mag bei Ihren Benutzern nicht beliebt sein, aber ich glaube, der einzige Weg, den Sie sicher wissen können, ist erzwingen eine Kennwortänderung für jede SQL-Anmeldung mit CHECK_POLICY = ON. Dadurch wird eine Reihe von ALTER LOGIN - Befehlen mit leeren Kennwörtern generiert. Sie können die Abfrage aktualisieren, indem Sie allen ein gemeinsames Kennwort geben, oder jedes manuell mit einzelnen Kennwörtern aktualisieren. Stellen Sie einfach sicher, dass sie Ihren Richtlinien entsprechen. Natürlich müssen Sie sicherstellen, dass die Kennwortrichtlinie so komplex ist, wie Sie es erwarten, und dass sie aktiviert ist (Systemsteuerung> Verwaltung> Lokale Sicherheitsrichtlinie> Kontorichtlinien> Kennwortrichtlinie> Kennwort muss die Komplexitätsanforderungen erfüllen).

SELECT N'ALTER LOGIN ' + QUOTENAME(name) 
  + N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;' 
  FROM sys.sql_logins 
  --WHERE is_policy_checked = 0;

Steve Jones hat darüber geschrieben vor einiger Zeit. Beachten Sie, dass Sie sich aufgrund der folgenden Informationen nicht auf is_policy_checked = 1 Verlassen können, um zu bedeuten, dass das Kennwort tatsächlich Ihrer aktuellen Richtlinie entspricht, da die Anmeldung möglicherweise mit einem Hash-Kennwort (in diesem Fall der Ebene) erstellt wurde Das Textkennwort kann nicht überprüft werden) oder während die lokale Komplexitätsrichtlinie deaktiviert wurde (was immer noch zu is_policy_checked = 1 führt).

Ein anderer Ansatz, von dem ich dachte, dass er funktionieren würde, wäre zu versuchen, eine Kopie Von jedem Login mit ihrem aktuellen password_hash Und mit CHECK_POLICY = ON Zu erstellen und jeden zu notieren eine, die fehlschlägt. Dies kann jedoch nicht funktionieren - selbst mit CHECK_POLICY = ON Wird keine Überprüfung eines bereits gehashten Passworts durchgeführt. Ich werde den Code für die Nachwelt einfügen - aber die Richtlinie kann von Natur aus einfach nicht überprüft werden.

SELECT N'BEGIN TRY
  CREATE LOGIN ' + QUOTENAME(N'copy_of_' + name) 
    + N' WITH PASSWORD = ' 
    + CONVERT(NVARCHAR(255), password_hash, 1)
    + ' HASHED, CHECK_POLICY = ON;
  DROP LOGIN ' + QUOTENAME(N'copy_of_' + name) + ';
END TRY
BEGIN CATCH
  IF ERROR_NUMBER() = 15118
    PRINT N''' + REPLACE(name, '''', '''''') 
      + N' was not complex enough.'';
END CATCH'
FROM sys.sql_logins;

Persönlich denke ich, dass dies ein Fehler ist. Wenn die Syntax es mir ermöglicht, eine Anmeldung mit einem Hash-Kennwort zu erstellen, und ich festlegen kann, dass dieses Kennwort meiner Komplexitätsrichtlinie entsprechen muss, sollte ein Fehler oder eine Warnung generiert werden, dass die Richtlinie tatsächlich nicht überprüft wurde.

[~ # ~] Update [~ # ~] : Ich habe einen Fehler gegen dieses Verhalten eingereicht.

15
Aaron Bertrand

Es gibt keine Möglichkeit, dass Sie dies 100% genau bekommen. Sie können jedoch PWDCOMPARE verwenden, um eine Liste schwacher Kennwörter zu überprüfen (Sie können der Liste schwacher Kennwörter hinzufügen und einen Vergleich durchführen).

Ich habe ein ähnliches Skript geschrieben, das den Vergleich durchführt und Ihnen die Ergebnisse liefert. Ich habe es auf github gepostet.

BEARBEITEN:

Jetzt können Sie eine Liste schwacher Passwörter in einer CSV haben und dann dbatools Test-DbaLoginPassword mit -Dictionary switch (Gibt eine Liste von Kennwörtern an, die in den Test für schwache Kennwörter aufgenommen werden sollen.)

4
Kin Shah

Die Kennwortrichtlinie pro SQL-Anmeldung ist nur ein Flag für Ein oder Aus. Wenn das Kennwort Kennwortrichtlinie aktiviert ist, wird die Windows-Kennwortrichtlinie des Betriebssystems erzwungen.

In der Dokumentation zu CREATE LOGIN finden Sie Einzelheiten dazu, was passiert, wenn CHECK_POLICY und CHECK_EXPIRATION festgelegt sind.

Sie können die Einstellungen pro SQL-Benutzer anzeigen, indem Sie die Spalten is_policy_checked und is_expiration_checked in sys.sql_logins überprüfen

so etwas wie unten:

SELECT name,
create_date,
modify_date,
LOGINPROPERTY(name, 'DaysUntilExpiration') DaysUntilExpiration,
LOGINPROPERTY(name, 'PasswordLastSetTime') PasswordLastSetTime,
LOGINPROPERTY(name, 'IsExpired') IsExpired,
LOGINPROPERTY(name, 'IsMustChange') IsMustChange
From sys.sql_logins ;

Für SQL Server-Authentifizierungsanmeldungen:

select * from sys.server_principals where type in ('U','G') - zeigt Ihnen die Anmeldungen und Gruppen, die über die Windows-Authentifizierung auf einen SQL Server zugreifen können.

0
KASQLDBA