Puede que esto no sea popular entre sus usuarios, pero creo que la única forma de saberlo con certeza es forzando un cambio de contraseña para cada inicio de sesión SQL CHECK_POLICY = ON
. Esto generará un conjunto de ALTER LOGIN
comandos con contraseñas en blanco, puede actualizar la consulta dándoles a todos una contraseña común o actualizar manualmente cada una con contraseñas individuales, solo asegúrese de que cumplan con su política. Por supuesto, debe asegurarse de que la política de contraseñas sea tan compleja como espera y que esté habilitada (Panel de control> Herramientas administrativas> Política de seguridad local> Políticas de cuenta> Política de contraseña> La contraseña debe cumplir con los requisitos de complejidad).
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 escribió sobre esto hace un tiempo. Tenga en cuenta que, debido a lo que descubrí a continuación, no puede confiar en is_policy_checked = 1
que la contraseña realmente cumpla con su política actual, ya que el inicio de sesión podría haberse creado con una contraseña cifrada (en cuyo caso, la contraseña de texto sin formato no puede ser marcado) o mientras la política de complejidad local estaba deshabilitada (lo que todavía conduce a is_policy_checked = 1
).
Otro enfoque que pensé que funcionaría sería tratar de crear una copia de cada inicio de sesión con su actual password_hash
y con CHECK_POLICY = ON
, y tomar nota de cada uno que falla. Sin embargo, esto no puede funcionar , incluso con CHECK_POLICY = ON
, no realiza ninguna validación de una contraseña ya hash. Incluiré el código para la posteridad, pero, por diseño, la política simplemente no se puede verificar.
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, creo que esto es un error. Si la sintaxis me permite crear un inicio de sesión con una contraseña cifrada, y puedo estipular que esa contraseña debe cumplir con mi política de complejidad, debería generar un error o advertencia de que la política no fue verificada.
ACTUALIZACIÓN : presenté un error contra este comportamiento.