Recientemente he entrado en un entorno donde muchos inicios de sesión de bases de datos no tienen enforce_password_policy
habilitado el indicador.
Una próxima auditoría requiere la verificación de las contraseñas de estos inicios de sesión.
Utilicé la siguiente consulta para obtener una lista de inicios de sesión y si los indicadores están activados o desactivados.
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
Sin embargo, esto no me dice si las contraseñas realmente se adhieren a la política de contraseñas, ya que el indicador solo es relevante al crear un usuario.
¿Existe alguna forma conocida de probar el cumplimiento de las políticas de contraseña para los usuarios existentes ?
No tengo acceso a las contraseñas antiguas, y preferiría un método que no las requiera.
PWDCOMPARE()
, realmente no he encontrado mucho, ¡a pesar de todo, gracias por el esfuerzo!Respuestas:
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 deALTER 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).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 ais_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 conCHECK_POLICY = ON
, y tomar nota de cada uno que falla. Sin embargo, esto no puede funcionar , incluso conCHECK_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.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.
fuente
select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;
dio varios resultados positivos. Así que tendré que hacer esto para todos los inicios de sesión, no solo para aquellos conis_policy_checked
apagado.No hay forma de que pueda obtener esta precisión del 100%. Aunque puede usar
PWDCOMPARE
para verificar una lista de contraseñas débiles (puede agregar a la lista de contraseñas débiles y hacer una comparación).He escrito un script similar que hace la comparación y te da los resultados. Lo he publicado en github .
EDITAR:
Ahora puede tener una lista de contraseñas débiles en un csv y luego usar dbatools
Test-DbaLoginPassword
con-Dictionary
switch (especifica una lista de contraseñas para incluir en la prueba de contraseñas débiles).fuente
La política de contraseña por inicio de sesión de SQL es solo una marca de activación o desactivación. Si se marca el indicador de Política de contraseña, se aplicará la Política de contraseña de Windows del sistema operativo.
Consulte la documentación de CREATE LOGIN para obtener detalles sobre lo que sucede cuando CHECK_POLICY y CHECK_EXPIRATION están configurados.
Puede ver la configuración por usuario de SQL marcando las columnas is_policy_checked y is_expiration_checked en sys.sql_logins
algo como a continuación:
Para inicios de sesión de autenticación de SQL Server:
select * from sys.server_principals where type in ('U','G')
- le mostrará los inicios de sesión y grupos que pueden acceder a un servidor SQL a través de la autenticación de Windows.fuente