Cela peut ne pas être populaire auprès de vos utilisateurs, mais je pense que la seule façon dont vous pouvez être sûr est de forcer un changement de mot de passe pour chaque connexion SQL avec CHECK_POLICY = ON
. Cela générera un ensemble de ALTER LOGIN
commandes avec des mots de passe vides, vous pouvez mettre à jour la requête en leur donnant tous un mot de passe commun ou mettre à jour manuellement chacun avec des mots de passe individuels - assurez-vous simplement qu'ils répondent à votre politique. Bien sûr, vous devez vous assurer que la stratégie de mot de passe est aussi complexe que prévu et qu'elle est activée (Panneau de configuration> Outils d'administration> Stratégie de sécurité locale> Stratégies de compte> Stratégie de mot de passe> Le mot de passe doit répondre aux exigences de complexité).
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 a écrit à ce sujet il y a quelque temps. Notez que - en raison de ce que j'ai découvert ci-dessous - vous ne pouvez pas vous fier is_policy_checked = 1
à ce que le mot de passe correspond réellement à votre politique actuelle, car la connexion aurait pu être créée avec un mot de passe haché (auquel cas le mot de passe en texte brut ne peut pas être cochée) ou alors que la stratégie de complexité locale était désactivée (ce qui conduit toujours à is_policy_checked = 1
).
Une autre approche que je pensais fonctionnerait serait d'essayer de créer une copie de chaque connexion avec leur courant password_hash
et avec CHECK_POLICY = ON
, et de noter toutes celles qui échouent. Cependant, cela ne peut pas fonctionner - même avec CHECK_POLICY = ON
, il n'effectue aucune validation d'un mot de passe déjà haché. Je vais inclure le code pour la postérité - mais, par conception, la politique ne peut tout simplement pas être vérifiée.
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;
Personnellement, je pense que c'est un bug. Si la syntaxe me permet de créer une connexion à l'aide d'un mot de passe haché et que je peux stipuler que ce mot de passe doit répondre à ma politique de complexité, cela devrait générer une erreur ou un avertissement que la politique n'a pas été, en fait, vérifiée.
MISE À JOUR : J'ai déposé un bogue contre ce comportement.