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 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 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_hash
und mit zu erstellen und jeden Fehler zu CHECK_POLICY = ON
notieren, der fehlschlägt. Dies kann jedoch nicht funktionieren - auch wenn CHECK_POLICY = ON
keine Ü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.