Questo potrebbe non essere popolare tra i tuoi utenti, ma credo che l'unico modo che puoi sapere con certezza sia forzare una modifica della password per ogni accesso SQL con CHECK_POLICY = ON
. Questo genererà una serie di ALTER LOGIN
comandi con password vuote, puoi aggiornare la query dando loro una password comune o aggiornare manualmente ognuno con password individuali - assicurati solo che rispettino la tua politica. Ovviamente devi essere sicuro che la politica della password sia complessa come ti aspetti e che sia abilitata (Pannello di controllo> Strumenti di amministrazione> Politica di sicurezza locale> Politiche dell'account> Politica della password> La password deve soddisfare i requisiti di complessità).
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 ne ha scritto qualche tempo fa. Tieni presente che, a causa di ciò che ho scoperto di seguito, non puoi fare affidamento sul fatto is_policy_checked = 1
che la password soddisfi effettivamente la tua politica attuale, poiché l'accesso potrebbe essere stato creato con una password con hash (nel qual caso la password in testo normale non può essere selezionato) o mentre la politica di complessità locale era disabilitata (il che porta ancora a is_policy_checked = 1
).
Un altro approccio che pensavo avrebbe funzionato sarebbe stato quello di provare a creare una copia di ogni login con il loro attuale password_hash
e con CHECK_POLICY = ON
, e prendere nota di tutti quelli che falliscono. Tuttavia, questo non può funzionare - anche con CHECK_POLICY = ON
, non esegue alcuna convalida di una password già con hash. Includerò il codice per i posteri - ma, in base alla progettazione, la politica semplicemente non può essere verificata.
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;
Personalmente, penso che questo sia un bug. Se la sintassi mi consente di creare un account di accesso utilizzando una password con hash e posso stabilire che tale password deve soddisfare la mia politica di complessità, dovrebbe generare un errore o un avviso che la politica non è stata effettivamente verificata.
AGGIORNAMENTO : ho presentato un bug per questo comportamento.