Proveedores de Credenciales en Windows

Windows Técnico

Sindicación

Proximos HOLs

Loading...

Como ya indicamos en el post de apertura de este BLOG, WindowsTecnico iba a estar orientado a Windows7 pero no de forma exclusiva marcándonos como objetivo ofrecer una visión más general orientada a entornos Microsoft.

En esta línea de operación es donde se encuentran los "Credential Providers" (proveedores de credenciales), nacidos en Windows Vista y continuados en Windows Server 2008, Windows Server 2008 R2 y Windows 7.

Los proveedores de credenciales son la nueva forma de llamar a la tecnología mejorada que ofrece la misma funcionalidad principal que el antiguo GINA o MSGINA de Windows 2000, XP y 2003.

¿Qué es GINA?

GINA (Graphic Identification and Authentication) era una DLL cargada por el proceso WINLOGON encargada de gestionar el inicio de sesión interactivo de los usuarios, junto con el aspecto gráfico de dicho inicio de sesión.

En un entorno de operación normal no es necesario modificar el GINA cargado por WINLOGON, pero hay en ciertos escenarios donde es obligatorio, como por ejemplo para el inicio de sesión interactivo a través de Tarjetas Inteligentes (SMARTCARDS) o el reconocimiento biométrico (algo de moda en los portátiles actuales).

El proceso de instalación de un nuevo GINA era generalmente realizado por las aplicaciones de instalación que entre otras cosas registraban la nueva DLL en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon mediante una clave llamada "GinaDLL" cuyo valor debía ser el nombre de la DLL correspondiente al sistema GINA, como por ejemplo "msgina.dll" (los errores generados por GINA generalmente requieren modificar dicha clave del registro para solucionar el problema).

Imagen 1 - GINA de software de terceros

¿Por qué Microsoft ha decidido eliminar GINA?

Eliminar la compatibilidad con GINA está suponiendo un quebradero de cabeza para muchas empresas ya que NO EXISTE COMPATIBILIDAD HACIA ATRÁS, esto significa que las empresas están obligadas a sustituir sus antiguos sistemas GINA por los más modernos CREDENTIAL PROVIDERS. Esta no es la manera común de operar por parte de Microsoft, que es conocida entre otras cosas por ofrecer una gran compatibilidad con desarrolladores de otras empresas, sin embargo existen poderosas razones para esta decisión, veamos algunas de ellas:

  • El proceso de inicio de sesión (winlogon.exe) ha sido modificado en Windows Vista y posteriores para hacerlo más ligero y estable, delegando ciertas tareas que tradicionalmente ejercía (como la aplicación de políticas de grupo) a otros procesos y servicios, los Proveedores de Credenciales no son una excepción.
  • Quizás el factor que más ha influenciado a la hora de eliminar MSGINA de Windows es que no permitía un "encadenamiento GINA", es decir, no admitía fácilmente una autenticación multifactor, algo solicitado por muchas empresas (por ejemplo para sumar una autenticación biométrica a otra que requiera tarjetas inteligentes) ya que solo podía haber un GINA activo por sistema.
  • La consolidación de elementos gráficos es el tercer factor de importancia de cara a la eliminación del sistema GINA dado que hoy en día nos encontramos en un entorno donde la modificación del inicio de sesión interactivo es cada vez más habitual y su gestión es más compleja.

En los Proveedores de Credenciales los programadores dejan el aspecto gráfico de inicio de sesión en manos del sistema operativo gracias al proceso LogonUI mediante los parámetros adecuados, esto ofrece la ventaja adicional de que los usuarios finales se acostumbrarán a un entorno gráfico de inicio de sesión simplificado y único.

A parte de las tres razones citadas anteriormente tendríamos que mencionar que los Proveedores de Credenciales son mucho más estables. Una mala instalación o un mal comportamiento de un GINA daba como resultado un "Pantallazo azul" o BSOD (Blue Screen of Death) que aparecía incluso en el modo a prueba de fallos. Los proveedores de credenciales no dan este problema ya que si el sistema no es capaz de cargar el proveedor oportuno siempre tendremos la posibilidad de entrar en el sistema de modo tradicional con el proveedor de credenciales predeterminado (usuario y contraseña).

Vamos a la práctica:

Este artículo va a quedar algo más largo de lo habitual en este blog, pero tiene su razón de ser, si os cansáis ya sabéis que siempre podéis echar mano de la nevera y coger una cervecita... (Los programas estilo LOQUENDO también ayudan para los más vaguetes xDD).

Esta practica la podéis realizar sobre Windows Vista, Windows Server 2008 o Windows 7 indistintamente.

Microsoft ofrece el código fuente de algunos ejemplos de Credencial Providers con el objetivo de servir de plantilla para programadores o empresas interesadas (cocientes quizás de lo difícil que resultaba programar un GINA en su momento). Podéis descargar estos ejemplos en el siguiente enlace:

http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=b1b3cbd1-2d3a-4fac-982f-289f4f4b9300

Para compilarlos requeriréis el SDK de Windows Server 2008.

Los ejemplos ya vienen con los proyectos de Visual Studio creados para compilarlos sin modificaciones, no obstante este articulo va enfocado a profesionales IT, de manera que si no sois Developers (como me ocurre a mi) y no tenéis un Visual Studio a mano no pasa nada, solo es necesario usar el Comando VCBUILD.exe del SDK de Windows Server 2008, o bien para los más vaguetes (los del LOQUENDO de antes), podéis descargaros las DLLs ya compiladas al final de este artículo.

Los ejemplos que vienen en el paquete son:

  • SampleCredentialProvider

Proveedor básico (basado en el proveedor predeterminado del sistema)

  • SampleCredUICredentialProvider

Ejemplo de Credential Provider que hace uso del componente CREDUI.dll (Credential Manager User Interface) para poder usarlo en conexiones que usen el servicio "Administrador de Credenciales". Utilizado por ejemplo para hacer uso del Credential Provider con conexiones remotas RDP.

  • SampleAllControlsCredentialProvider.

Proveedor que muestra todos los controles gráficos disponibles.

  • SampleHardwareEventCredentialProvider

Proveedor que permite inicio de sesión tras un determinado evento (como pulsar un botón o pasar el dedo por un lector de huella dactilar).

  • SampleWrapExistingCredentialProvider

Encapsula funcionalidad adicional para un Credential Provider ya existente (en el ejemplo es un menú desplegable). Se evita de esta manera la necesidad de desarrollar un Credential Provider completamente nuevo.

 

Si optáis por una compilación manual los pasos serian los siguientes:

  1. Instalar el SDK de Windows Server 2008.
  2. Descomprimir la carpeta con el código fuente de los Proveedores de Credenciales. Cada ejemplo de Credential Provider tiene sus fuentes en una carpeta propia (ver imagen inferior).
  3. Imagen 2 - Carpetas con el código fuente de cada ejemplo

  4. Abir el "cmd del SDK de Windows Server 2008" (tendréis un acceso directo en vuestro menú de inicio) y escribir "vcbuild". El objetivo de este comando son los ficheros de extensión *.vcproj que se encuentran dentro de las carpetas correspondientes a cada ejemplo. La sintaxis sería la siguiente:
  5. > vcbuild [proyecto *.vcproj]

    Imagen 3 - vcbuild /upgrade

    Se mostrará un error indicando que es necesario actualizar el proyecto mediante el parámetro "upgrade", de manera que el comando quedaría de la siguiente manera:

     

    > vcbuild /upgrade [proyecto *.vcproj]

    Tras lo cual debemos lanzar el mismo comando pero sin el parámetro

    > vcbuild [proyecto *.vcproj]

    ¡Ya tenemos compilado nuestro proyecto!

    Deberéis realizar este mismo paso para cada ejemplo que deseéis compilar.

  6. Una vez se haya completado el comando veréis una DLL en la carpeta "DEBUG" dentro de la carpeta de las fuentes de cada ejemplo, ese es el Credential Provider compilado (ver imagen inferior).
  7. Imagen 4 - DLL compilada

     

     

  8. Debéis copiar esa DLL a c:\Windows\system32 y ejecutar el fichero .reg que viene incluido en la carpeta principal del ejemplo para realizar las modificaciones oportunas en el registro de Windows.
  9. Imagen 5 - Fichero *.reg

     

  10. Reiniciar
  11.  

     

     

Los que uséis las versiones ya compiladas que he colgado más abajo solo tenéis que realizar los pasos 5 y 6.

Cada DLL registrada es un Credential Provider diferente, podéis tener hasta un máximo de 10 incluyendo el predeterminado del sistema (una mejora importante con respecto a GINA del que solo se podía tener uno).

Imagen 6 - Varios Proveedores de Credenciales en la misma ventana de inicio

 

La documentación ofrecida en el paquete de fuentes también es interesante si queréis extenderos en esta materia más allá de este artículo.

Recodad que estas pruebas siempre son mejores en máquina virtual. Os recomiendo que os descarguéis el "ligero" (comparado con VMWARE) Virtual PC 2007 SP1 de Microsoft en el siguiente enlace:

http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=28c97d22-6eb8-4a09-a7f7-f6c7a1f000b5

Algo de arquitectura:

Habéis visto en la práctica que es un Credencial Provider, pero realmente ¿que hay por debajo? Vamos con la teoría...

Windows Vista incorporaba un nuevo sistema de seguridad que es el aislamiento de la sesión 0, uno de los elementos que conforma el sistema "Windows Service Hardening" (endurecimiento de servicios de Windows). Este elemento aísla la sesión en la que se inician los servicios (sesión 0) del entorno de usuario (sesión 1 y superiores) diferenciándose de otros sistemas anteriores donde la sesión 0 era compartida entre servicios y el primer usuario en iniciarse de manera interactiva, algo que suponía un problema potencial de seguridad.

En Windows Vista y posteriores no es posible autenticarse interactivamente en la sesión 0 (algo que tiene importantes repercusiones administrativas), lo que significa que no existe un proceso WINLOGON para dicha sesión. El resto de las sesiones (al igual que Windows XP) disfruta de un proceso WINLOGON propio y por tanto un Credential Provider que las controla, sin embargo el proceso que finalmente autentica al usuario es el conocido LSASS (Local Security Authority Subsystem) que se inicia junto con el resto de servicios en la sesión 0 y es encargado (entre otras cosas) de generar los tokens de acceso. De esta manera podemos definir que los "Proveedores de Credenciales" se comunican con el proceso LSASS a través de WINLOGON mientras que los antiguos GINA se cargaban en el propio espacio de WINLOGON.

Imagen 7 - Antigua arquitectura GINA

 

Imagen 8 - Arquitectura actual de los Credential Providers

 

En las imágenes superiores podéis comprobar el esquema de arquitectura de GINA y de los CREDENTIAL PROVIDERS, y además podréis observar un elemento llamado LOGONUI. LOGONUI.exe es el nuevo sistema encargado de procesar el entorno gráfico de inicio de sesión de manera que dispongamos de un modelo de inicio de sesión unificado y simple (a diferencia de GINA). Los ejemplos que hemos compilado muestran las capacidades de LOGONUI para dibujar los diferentes elementos de los que podemos hacer uso (menús desplegables, cuadros de texto, botones etc.).

Imagen 9 - Proceso LOGONUI haciendo uso de una DLL de Credential Provider (obtenido mediante Process Explorer de Sysinternals)

 

 

 

 

 

 

 

 

 

Imagen 10 - Ejemplo de Credential Provider que muestra todos los elementos gráficos disponibles mediante LOGONUI

 

   

Imagen 11 - Ejemplo de Credential Provider que reacciona ante un evento

 

A parte de LOGONUI, los Credencial Providers tienen la posibilidad de compatibilizarse con el Servicio "Credential Manager" a través del componente CREDUI.dll (Credential Manager User Interface), de manera que pueda usarse el Credential Provider deseado en entornos de RUNAS (ejecutar como) o cuando realizamos conexiones remotas mediante el cliente de escritorio remoto de Windows. En la imagen inferior podéis comprobar un ejemplo realizado mediante la función "Ejecutar como un usuario diferente" de Windows 7 que aparece cuando abrís el menú contextual sobre una aplicación a la vez que pulsáis la tecla SHIFT.

Imagen 12 - Menú "Ejecutar como un usuario diferente"

 

Imagen 13 - Uso de CREDUI.dll por un Crential Provider

 

Sin duda los CREDENTIAL PROVIDERS son un de los elementos más destacados que aparecieron con Windows Vista y que mejoran aun más en Windows 7 gracias al "Windows Biometric Framework", un sistema unificado para reconocimiento biométrico con el que los proveedores de credenciales pueden comunicarse, aunque eso es para otro artículo...

Para información más detallada y orientada a desarrolladores sobre los Proveedores de Credenciales podéis echar un vistazo al siguiente enlace: http://msdn.microsoft.com/es-es/magazine/cc163489.aspx

Toca pegarle el último lingotazo a la cerveza. Hasta la próxima.

Si quieres aprender mucho más sobre los secretos de lo sistemas Microsoft Windows, te recomendamos leer el libro de Sergio de los Santos "Máxima Seguridad en Windows: Secretos Técnicos" y, por último, te recordamos que si te ha gustado el artículo puedes suscribirte al Canal RSS de Windows Técnico para estar al día de las novedades e información técnica de interés.


Enviado feb 06 2009, 03:46 por Juan Francisco Arrabe

Comentarios

Leandro Tubia escrito re: Proveedores de Credenciales
en 03-17-2011 16:06

que útil que me ha sido !, Comenzaré a desarrollar una Credential Provider para un proyecto y voy contantando los issues que encuentre.

Añadir un comentario

(requerido)  
(opcional)
(requerido)  
Recordarme
If you can't read this number refresh your screen
Enter the numbers above: