Verificación de la política de contraseña en usuarios existentes


11

Recientemente he entrado en un entorno donde muchos inicios de sesión de bases de datos no tienen enforce_password_policyhabilitado 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.


1
¿Qué conferencia? Días de SQL Server? BICC? Hice una búsqueda rápida, parece que no hay una función nativa que le dará rápidamente un resultado. Es posible utilizar una herramienta de terceros.
Stijn Wynants

SQL Server días. También he realizado algunas búsquedas rápidas, y aparte de algunas herramientas que solo hacen ataques de diccionario usando PWDCOMPARE(), realmente no he encontrado mucho, ¡a pesar de todo, gracias por el esfuerzo!
Reaces

Puede validar la política en el próximo inicio de sesión y forzar un reinicio para todos los usuarios que no inician sesión antes de la auditoría. Menos molestia para el usuario en comparación con restablecer todas las contraseñas.
CodesInChaos

@CodesInChaos ¿Cómo se valida la política durante un evento de inicio de sesión?
Aaron Bertrand

1
He publicado un blog sobre este tema , y los animo a todos a votar y comentar sobre el elemento Connect .
Aaron Bertrand

Respuestas:


15

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 LOGINcomandos 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 = 1que 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_hashy 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.


Otra complicación es que estoy bastante seguro de que el administrador anterior acaba de verificar esta política después de poner contraseñas fáciles de recordar. 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 con is_policy_checkedapagado.
Reaces

@Reaces posiblemente. O su política de contraseñas en Windows podría ser débil o deshabilitada, por lo que tratar de hacer cumplir la política no ayuda.
Aaron Bertrand

Intenté crear el mismo usuario en un segundo servidor y obtuve un error de validación de contraseña. Así que supongo que la verificación de complejidad funciona. Sin embargo, me gusta la idea de recrear copias de los usuarios. ¡Me pondré a trabajar creando un script que haga exactamente eso! EDITAR: en realidad podría usar sp_help_revlogin para hacer el trabajo pesado.
Reaces

"no realiza ninguna validación de una contraseña ya cifrada" ¿Cómo haría eso? Si solo conoce el hash y no la contraseña simple, no puede verificar la complejidad de la contraseña. Podrías adivinar la contraseña, pero eso sería muy costoso para un hash de contraseña decente, ya que el objetivo de un hash de contraseña es evitar la recuperación de la contraseña de texto sin formato.
CodesInChaos

@CodesInChaos Lo sé, ese es mi punto ... Dije "no" pero también podría haber escrito "no podría" ...
Aaron Bertrand

4

No hay forma de que pueda obtener esta precisión del 100%. Aunque puede usar PWDCOMPAREpara 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-DbaLoginPasswordcon -Dictionaryswitch (especifica una lista de contraseñas para incluir en la prueba de contraseñas débiles).


Me gustaría mucho usar su script si alguna vez tengo que hacer una auditoría de la contraseña de un usuario en particular. Sin embargo, sin saber qué va a hacer el auditor, prefiero asegurarme de que todo cumpla con las políticas y confiar en quienes crean las políticas. Gracias sin embargo! +1
Reaces

0

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:

SELECT name,
create_date,
modify_date,
LOGINPROPERTY(name, 'DaysUntilExpiration') DaysUntilExpiration,
LOGINPROPERTY(name, 'PasswordLastSetTime') PasswordLastSetTime,
LOGINPROPERTY(name, 'IsExpired') IsExpired,
LOGINPROPERTY(name, 'IsMustChange') IsMustChange
From sys.sql_logins ;

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.


Actualicé un poco mi pregunta, ya que estaba usando una consulta similar. Mi principal problema es que necesito asegurarle a mi jefe que las contraseñas cumplen con las políticas, sin embargo, al no saber las contraseñas, no sé cómo podría hacerlo.
Reaces
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.