Überprüfen der Kennwortrichtlinie für vorhandene Benutzer

11

Ich bin kürzlich in eine Umgebung gekommen, in der für viele Datenbankanmeldungen das enforce_password_policyFlag nicht aktiviert ist.
Für eine bevorstehende Prüfung müssen die Kennwörter dieser Anmeldungen überprüft werden.

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.

Reagiert
quelle
1
Welche Konferenz? SQL Server Tage? BICC? Bei einer schnellen Suche scheint es keine native Funktion zu geben, die Ihnen schnell ein Ergebnis liefert. Möglicherweise kann ein Tool eines Drittanbieters verwendet werden.
Stijn Wynants
SQL Server Tage. Ich habe auch einige schnelle Suchvorgänge durchgeführt, und abgesehen von einigen Tools, die nur Wörterbuchangriffe ausführen, habe PWDCOMPARE()ich nicht wirklich viel gefunden, unabhängig davon, danke für die Mühe!
Reagiert am
Sie können die Richtlinie bei der nächsten Anmeldung überprüfen und einen Reset für alle Benutzer erzwingen, die sich vor der Überwachung nicht anmelden. Weniger Ärger der Benutzer im Vergleich zum Zurücksetzen aller Passwörter.
CodesInChaos
@CodesInChaos Wie validieren Sie die Richtlinie während eines Anmeldeereignisses?
Aaron Bertrand
1
Ich habe über dieses Problem gebloggt - und ich ermutige Sie alle, das Connect-Element zu verbessern und zu kommentieren .
Aaron Bertrand

Antworten:

15

Dies mag bei Ihren Benutzern nicht beliebt sein, aber ich glaube, der einzige Weg, den Sie sicher wissen können, besteht darin , eine Kennwortänderung für jede SQL-Anmeldung mit zu erzwingenCHECK_POLICY = ON . Dadurch wird eine Reihe von ALTER LOGINBefehlen 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 vor einiger Zeit darüber geschrieben. Beachten Sie, dass Sie sich aufgrund der folgenden Informationen nicht darauf verlassen können is_policy_checked = 1, dass das Kennwort tatsächlich Ihrer aktuellen Richtlinie entspricht, da die Anmeldung möglicherweise mit einem Hash-Kennwort erstellt wurde (in diesem Fall kann das Nur-Text-Kennwort nicht verwendet werden) aktiviert) oder während die lokale Komplexitätsrichtlinie deaktiviert war (was immer noch dazu führt is_policy_checked = 1).

Ein anderer Ansatz, von dem ich dachte, dass er funktionieren würde, wäre zu versuchen, eine Kopie jedes Logins mit seinem aktuellen password_hashund mit zu erstellen und jeden Fehler zu CHECK_POLICY = ONnotieren, der fehlschlägt. Dies kann jedoch nicht funktionieren - auch wenn CHECK_POLICY = ONkeine Überprüfung eines bereits gehashten Passworts durchgeführt wird. 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.

Aaron Bertrand
quelle
Eine weitere Komplikation ist, dass ich mir ziemlich sicher bin, dass der vorherige Administrator diese Richtlinie gerade überprüft hat, nachdem er leicht zu merkende Passwörter eingegeben hat. select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;gab mehrere positive Ergebnisse. Also muss ich das für alle Logins tun , nicht nur für diejenigen mit is_policy_checkeddeaktiviertem Login.
Reagiert am
@Reaces Möglicherweise. Oder Ihre Kennwortrichtlinie in Windows ist möglicherweise schwach oder deaktiviert. Daher hilft es nicht, die Richtlinie durchzusetzen.
Aaron Bertrand
Ich habe gerade versucht, denselben Benutzer auf einem zweiten Server zu erstellen, und eine Kennwortüberprüfung ist fehlgeschlagen. Ich denke also, dass die Komplexitätsprüfung funktioniert. Ich mag die Idee, Kopien der Benutzer neu zu erstellen! Ich werde mich an die Arbeit machen und ein Skript erstellen, das genau das tut! EDIT: Eigentlich könnte ich einfach sp_help_revlogin verwenden , um das schwere Heben zu erledigen.
Reagiert am
"Es führt keine Überprüfung eines bereits gehashten Passworts durch." Wie würde es das tun? Wenn Sie nur den Hash und nicht das einfache Passwort kennen, können Sie die Komplexität des Passworts nicht überprüfen. Sie könnten das Passwort erraten, aber das wäre für einen anständigen Passwort-Hash sehr teuer, da der springende Punkt eines Passwort-Hash die Wiederherstellung des Klartext-Passworts verhindert.
CodesInChaos
@CodesInChaos Ich weiß, das ist mein Punkt ... Ich sagte "nicht", hätte aber auch "unmöglich" schreiben können ...
Aaron Bertrand
4

Es gibt keine Möglichkeit, dass Sie dies 100% genau bekommen. Sie können jedoch PWDCOMPAREeine Liste mit schwachen Passwörtern verwenden (Sie können die Liste der schwachen Passwörter ergänzen 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-DbaLoginPasswordmit -DictionarySchalter verwenden (Gibt eine Liste von Passwörtern an, die in den Test für schwache Passwörter einbezogen werden sollen .)

Kin Shah
quelle
Ich würde Ihr Skript sehr gerne verwenden, wenn ich jemals selbst das Passwort eines bestimmten Benutzers überprüfen muss. Da ich jedoch nicht weiß, was der Prüfer tun wird, möchte ich lieber sicherstellen, dass alles den Richtlinien entspricht, und mich auf diejenigen verlassen, die die Richtlinien erstellen. Trotzdem danke! +1
Reagiert am
0

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.

KASQLDBA
quelle
Meine Frage wurde etwas aktualisiert, da ich bereits eine ähnliche Abfrage verwendet habe. Mein Hauptproblem ist, dass ich meinem Chef versichern muss, dass die Passwörter den Richtlinien entsprechen, aber die Passwörter nicht kennen, von denen ich nicht weiß, wie ich sie könnte.
Reagiert am