Autenticación de Windows integrada con protección ampliada
Se han realizado mejoras que afectan al modo en que las clases HttpWebRequest, HttpListener, SmtpClient, SslStream, NegotiateStream y clases relacionadas del espacio de nombres System.Net y espacios de nombres relacionados controlan la autenticación integrada de Windows. Se ha agregado compatibilidad para que la protección ampliada mejore la seguridad.
Estos cambios pueden afectar a las aplicaciones que usan estas clases para realizar solicitudes web y recibir respuestas donde se emplea la autenticación integrada de Windows. Este cambio también puede afectar a los servidores web y a las aplicaciones cliente configurados para usar autenticación integrada de Windows.
Estos cambios también pueden afectar a las aplicaciones que usan estas clases para realizar otros tipos de solicitudes y recibir respuestas donde se emplea la autenticación integrada de Windows.
Los cambios para admitir la protección ampliada solo están disponibles para las aplicaciones en Windows 7 y Windows Server 2008 R2. Las características de protección ampliada no están disponibles en versiones anteriores de Windows.
Información general
El diseño de la autenticación integrada de Windows permite que algunas respuestas de desafío de credenciales sean universales, lo que significa que se pueden volver a usar o reenviar. Las respuestas de desafío deben crearse como mínimo con información específica del destino y, preferiblemente, también con información específica del canal. Después, los servicios pueden proporcionar protección ampliada para asegurarse de que las respuestas de desafío de credenciales contengan información específica de servicio, como un nombre de entidad de seguridad de servicio (SPN). Con esta información en los intercambios de credenciales, los servicios pueden mejorar la protección contra el uso malintencionado de respuestas de desafío de credenciales que podrían haberse usado de forma inapropiada.
El diseño de protección ampliada es una mejora en los protocolos de autenticación diseñada para mitigar los ataques de retransmisión de autenticación. Está basada en el concepto de información de enlace de canal y servicio.
Los objetivos generales son los siguientes:
Si el cliente está actualizado para admitir la protección ampliada, las aplicaciones deben proporcionar información de enlace de canal y servicio a todos los protocolos de autenticación admitidos. La información de enlace de canal solo se puede proporcionar cuando hay un canal (TLS) con el que enlazar. Siempre se debe proporcionar información de enlace de servicio.
Los servidores actualizados que están configurados correctamente podrían comprobar la información de enlace de canal y servicio presente en el token de autenticación de cliente y rechazar el intento de autenticación si los enlaces de canal no coinciden. En función del escenario de implementación, los servidores podrían comprobar el enlace de canal, el enlace de servicio o ambos.
Los servidores actualizados tienen la capacidad de aceptar o rechazar solicitudes de cliente de nivel inferior que no contienen la información de enlace de canal basada en la directiva.
La información que usa la protección ampliada está formada por uno de los elementos siguientes o por ambos:
Un token de enlace de canal o CBT.
Información de enlace de servicio en forma de nombre de entidad de seguridad de servicio o SPN.
La información de enlace de servicio es una indicación de la intención del cliente de autenticarse en un punto de conexión de servicio determinado. Se comunica del cliente al servidor con las propiedades siguientes:
El valor de SPN debe estar disponible para el servidor que realiza la autenticación de cliente en forma de texto no cifrado.
El valor de SPN es público.
El SPN se debe proteger criptográficamente durante el tránsito para que un ataque de tipo "Man in the middle" no pueda insertar, quitar o modificar su valor.
Un CBT es una propiedad del canal seguro exterior (por ejemplo, TLS) usado para relacionarlo (enlazarlo) con una conversación mediante un canal interno autenticado por el cliente. El CBT debe tener las propiedades siguientes (también definidas en la especificación RFC 5056 de IETF):
Cuando existe un canal externo, el valor del CBT debe ser una propiedad que identifique el canal externo o el punto de conexión del servidor, al que lleguen por separado la parte de cliente y la parte de servidor de una conversación.
El valor del CBT enviado por el cliente no debe poder verse afectado por un atacante.
No hay ninguna garantía de la confidencialidad del valor del CBT. Pero esto no significa que otro elemento diferente del servidor que realiza la autenticación pueda examinar siempre el valor de la información de enlace de servicio y de enlace de canal, ya que el protocolo que transporta el CBT podría llevar a cabo su cifrado.
La integridad del CBT se debe proteger criptográficamente durante el tránsito para que un atacante no pueda insertar, quitar o modificar su valor.
El enlace de canal lo lleva a cabo el cliente que realiza la transferencia del SPN y del CBT al servidor en un modo a prueba de manipulaciones. El servidor valida la información de enlace de canal según su directiva y rechaza los intentos de autenticación de los que no se considera el destino deseado. De esta manera, los dos canales se enlazan criptográficamente.
Para mantener la compatibilidad con los clientes y las aplicaciones existentes, puede configurarse un servidor de modo que permita los intentos de autenticación de los clientes que todavía no admiten la protección ampliada. Esto se conoce como una configuración "parcialmente protegida", en contraposición a una configuración "completamente protegida".
Varios componentes de los espacios de nombres System.Net y System.Net.Security realizan la autenticación integrada de Windows en nombre de una aplicación que llama. En esta sección se describen los cambios en los componentes de System.Net para agregar protección ampliada al uso de la autenticación integrada de Windows.
La protección ampliada es actualmente compatible con Windows 7. Se proporciona un mecanismo para que una aplicación pueda determinar si el sistema operativo admite la protección ampliada.
Cambios para admitir la protección ampliada
El proceso de autenticación usado con la autenticación integrada de Windows, según el protocolo de autenticación usado, suele incluir un desafío emitido por el equipo de destino y enviado de vuelta al equipo cliente. La protección ampliada agrega nuevas características a este proceso de autenticación.
El espacio de nombres System.Security.Authentication.ExtendedProtection proporciona compatibilidad con la autenticación mediante la protección ampliada de las aplicaciones. La clase ChannelBinding de este espacio de nombres representa un enlace de canal. La clase ExtendedProtectionPolicy de este espacio de nombres representa la directiva de protección ampliada usada por el servidor para validar las conexiones de cliente entrantes. Se usan otros miembros de clase con la protección ampliada.
Para las aplicaciones de servidor, entre estas clases se incluyen las siguientes:
Una clase ExtendedProtectionPolicy que tiene los siguientes elementos:
Una propiedad OSSupportsExtendedProtection que indica si el sistema operativo admite la autenticación integrada de Windows con la protección ampliada.
Valor PolicyEnforcement que indica cuándo debe exigirse la directiva de protección extendida.
Un valor ProtectionScenario que indica el escenario de implementación. Esto influye en la manera en que se comprueba la protección ampliada.
Una clase ServiceNameCollection opcional que contiene la lista personalizada de SPN que se usa para comparar con el SPN proporcionado por el cliente como destino previsto de la autenticación.
Una clase ChannelBinding opcional que contiene un enlace de canal personalizado para usarlo para la validación. Este escenario no es habitual.
El espacio de nombres System.Security.Authentication.ExtendedProtection.Configuration proporciona compatibilidad con la configuración de la autenticación mediante la protección ampliada de las aplicaciones.
Se ha realizado una serie de cambios en las características para admitir la protección ampliada en el espacio de nombres System.Net existente. Estos cambios incluyen:
Una nueva clase TransportContext agregada al espacio de nombres System.Net que representa un contexto de transporte.
Nuevos métodos de sobrecarga EndGetRequestStream y GetRequestStream en la clase HttpWebRequest que permiten recuperar la clase TransportContext para admitir la protección ampliada para las aplicaciones cliente.
Adiciones a las clases HttpListener y HttpListenerRequest para admitir aplicaciones de servidor.
Se ha realizado un cambio en las características para admitir la protección ampliada para las aplicaciones de cliente SMTP en el espacio de nombres System.Net.Mail existente:
- Una propiedad TargetName en la clase SmtpClient que representa el SPN que se va a usar para la autenticación cuando se emplea la protección ampliada para aplicaciones de cliente SMTP.
Se ha realizado una serie de cambios en las características para admitir la protección ampliada en el espacio de nombres System.Net.Security existente. Estos cambios incluyen:
Nuevos métodos de sobrecarga BeginAuthenticateAsClient y AuthenticateAsClient en la clase NegotiateStream que permiten pasar un CBT para admitir la protección ampliada para las aplicaciones cliente.
Nuevos métodos de sobrecarga BeginAuthenticateAsServer y AuthenticateAsServer en la clase NegotiateStream que permiten pasar una clase ExtendedProtectionPolicy para admitir la protección ampliada para las aplicaciones de servidor.
Una nueva propiedad TransportContext en la clase SslStream para admitir la protección ampliada para las aplicaciones cliente y servidor.
Se ha agregado una propiedad SmtpNetworkElement para admitir la configuración de la protección ampliada para los clientes SMTP en el espacio de nombres System.Net.Security.
Protección ampliada para aplicaciones cliente
La compatibilidad con la protección ampliada tiene lugar de manera automática en la mayoría de las aplicaciones cliente. Las clases HttpWebRequest y SmtpClient admiten la protección ampliada siempre que la versión de Windows subyacente admita la protección ampliada. Una instancia HttpWebRequest envía un SPN construido a partir del Uri. De forma predeterminada, una instancia SmtpClient envía un SPN construido a partir del nombre de host del servidor de correo SMTP.
Para una autenticación personalizada, las aplicaciones cliente pueden usar los métodos HttpWebRequest.EndGetRequestStream(IAsyncResult, TransportContext) o HttpWebRequest.GetRequestStream(TransportContext) en la clase HttpWebRequest que permiten recuperar la clase TransportContext y el CBT mediante el método GetChannelBinding.
El SPN que se va a usar para la autenticación integrada de Windows enviado por una instancia HttpWebRequest a un servicio determinado se puede invalidar mediante el establecimiento de la propiedad CustomTargetNameDictionary.
Se puede usar la propiedad TargetName para establecer un SPN personalizado que se usará para la autenticación integrada de Windows para la conexión de SMTP.
Protección ampliada para aplicaciones de servidor
HttpListener proporciona automáticamente mecanismos para validar los enlaces de servicio al realizar la autenticación HTTP.
El escenario más seguro consiste en habilitar la protección ampliada para prefijos HTTPS://
. En este caso, establezca HttpListener.ExtendedProtectionPolicy en ExtendedProtectionPolicy con PolicyEnforcement establecido en WhenSupported o Always, y ProtectionScenario establecido en TransportSelected. Un valor de WhenSupported coloca HttpListener en modo parcialmente protegido, mientras que Always se corresponde con el modo completamente protegido.
En esta configuración, cuando se realiza una solicitud al servidor a través de un canal seguro externo, se consulta el canal externo para un enlace de canal. Este enlace de canal se pasa a las llamadas SSPI de autenticación, que validan que el enlace de canal del blob de autenticación coincida. Existen tres resultados posibles:
El sistema operativo subyacente del servidor no admite la protección ampliada. La solicitud no se expondrá a la aplicación y se devolverá al cliente una respuesta No autorizado (401). Se registrará un mensaje en el origen de seguimiento HttpListener con el motivo del error.
Se produce un error en la llamada SSPI y se indica que el cliente ha especificado un enlace de canal que no coincidía con el valor esperado recuperado del canal externo o bien que el cliente no ha proporcionado un enlace de canal al configurar para Always la directiva de protección ampliada en el servidor. En ambos casos, la solicitud no se expondrá a la aplicación y se devolverá al cliente una respuesta No autorizado (401). Se registrará un mensaje en el origen de seguimiento HttpListener con el motivo del error.
El cliente especifica el enlace de canal correcto o se le permite conectarse sin especificar un enlace de canal, puesto que la directiva de protección ampliada en el servidor está configurada con WhenSupported. La solicitud se devuelve a la aplicación para su procesamiento. No se realiza automáticamente la comprobación del nombre del servicio. Una aplicación puede decidir realizar su propia validación del nombre del servicio mediante la propiedad ServiceName, pero en estos casos es redundante.
Si una aplicación realiza sus propias llamadas SSPI para realizar la autenticación basada en los blobs que se pasan dentro del cuerpo de una solicitud HTTP y quiere admitir el enlace de canal, deberá recuperar el enlace de canal esperado del canal seguro externo mediante HttpListener con el fin de pasarlo a la función nativa AcceptSecurityContext de Win32. Para ello, use la propiedad TransportContext y llame al método GetChannelBinding para recuperar el CBT. Solo se admiten enlaces de punto de conexión. Si se especifica cualquier otro Endpoint, se iniciará una NotSupportedException. Si el sistema operativo subyacente admite el enlace de canal, el método GetChannelBinding devolverá un ChannelBindingSafeHandle que encapsula un puntero en un enlace de canal adecuado para pasar a una función AcceptSecurityContext como miembro pvBuffer de una estructura SecBuffer pasada en el parámetro pInput
. La propiedad Size contiene la longitud, en bytes, del enlace de canal. Si el sistema operativo subyacente no admite enlaces de canal, la función devolverá null
.
Otro escenario posible es habilitar la protección ampliada para prefijos HTTP://
cuando no se usan servidores proxy. En este caso, establezca HttpListener.ExtendedProtectionPolicy en ExtendedProtectionPolicy con PolicyEnforcement establecido en WhenSupported o Always, y ProtectionScenario establecido en TransportSelected. Un valor de WhenSupported coloca HttpListener en modo parcialmente protegido, mientras que Always se corresponde con el modo completamente protegido.
Se crea una lista predeterminada de nombres de servicio permitidos en función de los prefijos que se han registrado con HttpListener. Esta lista predeterminada se puede examinar mediante la propiedad DefaultServiceNames. Si esta lista no es exhaustiva, una aplicación puede especificar una colección personalizada de nombres de servicio en el constructor para la clase ExtendedProtectionPolicy, que se usará en lugar de la lista predeterminada de nombres de servicio.
En esta configuración, cuando se realiza una solicitud al servidor sin un canal seguro externo, la autenticación se realiza normalmente sin llevar a cabo una comprobación del enlace de canal. Si la autenticación se realiza correctamente, se consulta el contexto para obtener el nombre de servicio que ha proporcionado el cliente y se valida con respecto a la lista de nombres de servicio aceptables. Existen cuatro resultados posibles:
El sistema operativo subyacente del servidor no admite la protección ampliada. La solicitud no se expondrá a la aplicación y se devolverá al cliente una respuesta No autorizado (401). Se registrará un mensaje en el origen de seguimiento HttpListener con el motivo del error.
El sistema operativo subyacente del cliente no admite la protección ampliada. En la configuración WhenSupported, el intento de autenticación se realizará correctamente y la solicitud se devolverá a la aplicación. En la configuración Always, se producirá un error en el intento de autenticación. La solicitud no se expondrá a la aplicación y se devolverá al cliente una respuesta No autorizado (401). Se registrará un mensaje en el origen de seguimiento HttpListener con el motivo del error.
El sistema operativo subyacente del cliente admite la protección ampliada, pero la aplicación no ha especificado un enlace de servicio. La solicitud no se expondrá a la aplicación y se devolverá al cliente una respuesta No autorizado (401). Se registrará un mensaje en el origen de seguimiento HttpListener con el motivo del error.
El cliente ha especificado un enlace de servicio. El enlace de servicio se compara con la lista de enlaces de servicio permitidos. Si coincide, la solicitud se devuelve a la aplicación. En caso contrario, la solicitud no se expondrá a la aplicación y se devolverá automáticamente al cliente una respuesta No autorizado (401). Se registrará un mensaje en el origen de seguimiento HttpListener con el motivo del error.
Si este método simple en el que se usa una lista permitida de nombres de servicio válidos resulta insuficiente, la aplicación puede proporcionar su propia validación del nombre del servicio consultando la propiedad ServiceName. En los casos 1 y 2 anteriores, la propiedad devolverá null
. En el caso 3, devolverá una cadena vacía. En el caso 4, se devolverá el nombre del servicio especificado por el cliente.
Estas características de protección ampliada también las pueden usar las aplicaciones de servidor para la autenticación con otros tipos de solicitudes y cuando se usan servidores proxy de confianza.