Ejemplo de seguridad de servicios web (WS) con SOAP

โšก Resumen inteligente

La seguridad de los servicios web (WS-Security) es un estรกndar que protege los datos intercambiados durante una llamada a un servicio web SOAP. Este recurso explica las amenazas y contramedidas de seguridad, los estรกndares de WS-Security, cรณmo crear un servicio web seguro con credenciales y las mejores prรกcticas de seguridad para servicios web.

  • ๐Ÿ” Estรกndar bรกsico: WS-Security aรฑade una capa de seguridad a SOAP, definiendo cรณmo viajan las credenciales y las claves de cifrado dentro del encabezado SOAP.
  • ๐ŸŒ Lรญmites de HTTPS: HTTPS/SSL protege el trรกfico punto a punto, pero en flujos multiservidor solo WS-Security mantiene el mensaje protegido de extremo a extremo.
  • ๐ŸŽซ Tokens de credenciales: Las credenciales se transmiten mediante un UsernameToken para el nombre de usuario y la contraseรฑa, o un BinarySecurityToken para los certificados Kerberos o X.509.
  • ๐Ÿ› ๏ธ Ejemplo de compilaciรณn segura: Un servicio web .Net ASMX agrega una clase AuthHeader para que el encabezado SOAP incluya un nombre de usuario y una contraseรฑa para la autenticaciรณn.
  • ๐Ÿ“‹ Mejores Prรกcticas: Auditar y registrar solicitudes, tracPara operaciones comerciales, autentique correctamente y nunca almacene ni registre credenciales confidenciales.

Seguridad del servicio web WS

ยฟQuรฉ es la seguridad de WS?

WS Security es un estรกndar que aborda la seguridad en el intercambio de datos dentro de un servicio web. Esta es una caracterรญstica clave de SOAP que lo hace muy popular para la creaciรณn de servicios web.

La seguridad es una caracterรญstica importante en cualquier aplicaciรณn web. Dado que casi todas las aplicaciones web estรกn expuestas a Internet, siempre existe la posibilidad de una amenaza a la seguridad de las aplicaciones web. Por lo tanto, cuando se desarrollaping En el caso de las aplicaciones web, siempre se recomienda asegurarse de que la aplicaciรณn estรฉ diseรฑada y desarrollada teniendo en cuenta la seguridad.

Amenazas a la seguridad y contramedidas

Para comprender las amenazas de seguridad que pueden resultar perjudiciales para una aplicaciรณn web, analicemos un escenario sencillo de una aplicaciรณn web y veamos cรณmo funciona en tรฉrminos de seguridad.

Una de las medidas de seguridad disponibles para HTTP es el protocolo HTTPS. HTTPS es la forma segura de comunicaciรณn entre el cliente y el servidor a travรฉs de internet. HTTPS utiliza el protocolo SSL (Secure Sockets Layer) para garantizar la seguridad de la comunicaciรณn. Tanto el cliente como el servidor disponen de un certificado digital que los identifica como legรญtimos durante cualquier comunicaciรณn entre ellos.

Amenazas de seguridad y contramedidas HTTPS

En una comunicaciรณn HTTPS estรกndar entre el cliente y el servidor, se producen los siguientes pasos:

  1. El cliente envรญa una solicitud al servidor a travรฉs del certificado del cliente. Cuando el servidor ve el certificado del cliente, toma nota en su sistema de cachรฉ para saber que la respuesta solo debe regresar a este cliente.
  2. Luego, el servidor se autentica ante el cliente enviando su certificado. Esto garantiza que el cliente se estรฉ comunicando con el servidor correcto.
  3. Toda la comunicaciรณn posterior entre el cliente y el servidor estรก cifrada. Esto garantiza que, si algรบn otro usuario intenta vulnerar la seguridad y obtener los datos necesarios, no podrรก leerlos, ya que estarรกn cifrados.

Sin embargo, este tipo de seguridad no funciona en todas las situaciones. Puede darse el caso de que el cliente necesite comunicarse con varios servidores. El ejemplo que se muestra a continuaciรณn ilustra cรณmo un cliente se comunica simultรกneamente con una base de datos y un servidor web. En tales casos, no toda la informaciรณn puede transmitirse a travรฉs del protocolo HTTPS.

Amenazas de seguridad y contramedidas en mรบltiples servidores

Aquรญ es donde SOAP entra en acciรณn para superar dichos obstรกculos mediante la especificaciรณn WS Security. Con esta especificaciรณn, todos los datos relacionados con la seguridad se definen en el elemento de encabezado SOAP. El elemento de encabezado puede contener la siguiente informaciรณn:

  1. Si el mensaje dentro del cuerpo SOAP se ha firmado con alguna clave de seguridad, esa clave se puede definir en el elemento del encabezado.
  2. Si algรบn elemento del cuerpo SOAP estรก cifrado, el encabezado contendrรก las claves de cifrado necesarias para que el mensaje pueda descifrarse al llegar a su destino.

En un entorno de mรบltiples servidores, la tรฉcnica de autenticaciรณn SOAP descrita anteriormente ayuda de la siguiente manera:

  • Dado que el cuerpo SOAP estรก cifrado, solo podrรก descifrarlo el servidor web que aloja el servicio web. Esto se debe a cรณmo estรก diseรฑado el protocolo SOAP.
  • Supongamos que el mensaje se envรญa al servidor de la base de datos en una solicitud HTTP; no se puede descifrar porque la base de datos no tiene los mecanismos adecuados para hacerlo.
  • Solo cuando la solicitud llegue al servidor web como un protocolo SOAP, este podrรก descifrar el mensaje y enviar la respuesta adecuada al cliente.

En los siguientes temas veremos cรณmo se puede utilizar el estรกndar WS Security para JABร“N.

Estรกndares de seguridad de servicios web

Como se explicรณ en la secciรณn anterior, el estรกndar WS-Security se basa en incluir la definiciรณn de seguridad en el encabezado SOAP. Las credenciales en el encabezado SOAP se gestionan de dos maneras.

En primer lugar, define un elemento especial llamado UsernameToken. Este se utiliza para pasar el nombre de usuario y la contraseรฑa al servicio web. La otra opciรณn es usar un token binario mediante BinarySecurityToken. Esto se utiliza en situaciones donde se emplean tรฉcnicas de cifrado como Kerberos o X.509.

El siguiente diagrama muestra el flujo de funcionamiento del modelo de seguridad en WS Security.

Flujo de trabajo de los estรกndares de seguridad de servicios web

A continuaciรณn se detallan los pasos que tienen lugar en el flujo de trabajo descrito anteriormente:

  1. Se puede enviar una solicitud desde el cliente del servicio web al Servicio de Tokens de Seguridad. Este servicio puede ser un servicio web intermedio diseรฑado especรญficamente para proporcionar nombres de usuario, contraseรฑas o certificados al servicio web SOAP principal.
  2. Luego, el token de seguridad se pasa al cliente del servicio web.
  3. El cliente del servicio web llama entonces al servicio web, pero esta vez asegurรกndose de que el token de seguridad estรฉ incrustado en el mensaje SOAP.
  4. Luego, el servicio web comprende el mensaje SOAP con el token de autenticaciรณn y luego puede comunicarse con el servicio del token de seguridad para ver si el token de seguridad es autรฉntico o no.

El siguiente fragmento muestra el formato de la parte de autenticaciรณn, que forma parte del documento WSDL. Segรบn este fragmento, el mensaje SOAP contendrรก dos elementos adicionales: el nombre de usuario y la contraseรฑa.

<xs:element name="UsernameToken">
   <xs:complexType>
      <xs:sequence>
         <xs:element ref="Username"/>
         <xs:element ref="Password" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="Id" type="xs:ID"/>
   </xs:complexType>
</xs:element>

Cuando el mensaje SOAP se transmite entre los clientes y el servidor, la parte del mensaje que contiene las credenciales del usuario podrรญa tener un aspecto similar al que se muestra arriba. El elemento wsse es un nombre de elemento especial definido para SOAP e indica que contiene informaciรณn de seguridad.

Cรณmo construir servicios web seguros

Ahora veamos un ejemplo de seguridad para servicios web SOAP. Implementaremos la seguridad de un servicio web a partir del ejemplo mostrado anteriormente en el capรญtulo sobre SOAP y le aรฑadiremos una capa de seguridad.

En nuestro ejemplo, crearemos un servicio web sencillo que devolverรก una cadena de texto a la aplicaciรณn que lo invoque. Sin embargo, en este caso, al invocar el servicio web, serรก necesario proporcionar las credenciales al servicio que realiza la llamada. Sigamos los pasos que se indican a continuaciรณn para crear nuestro servicio web SOAP y aรฑadirle la definiciรณn de seguridad.

Paso 1) El primer paso es crear un vacรญo. asp.net Aplicaciรณn web. Desde Visual Studio 2013, haga clic en la opciรณn de menรบ Archivo->Nuevo proyecto.

Nuevo proyecto: Crear servicios web seguros

Una vez que haga clic en la opciรณn Nuevo proyecto, Visual Studio le mostrarรก otro cuadro de diรกlogo para elegir el tipo de proyecto y proporcionar los detalles necesarios del proyecto. Esto se explica en el siguiente paso.

Paso 2) En este paso,

  1. Asegรบrese de elegir primero el C# Plantilla web para aplicaciones web ASP.NET. El proyecto debe ser de este tipo para crear un proyecto de servicios web. Al seleccionar esta opciรณn, Visual Studio realizarรก los pasos necesarios para agregar los archivos requeridos por cualquier aplicaciรณn web.
  2. Dale un nombre a tu proyecto que en nuestro caso se ha dado como โ€œservicio web.asmxโ€. A continuaciรณn, asegรบrese de indicar la ubicaciรณn donde se almacenarรกn los archivos del proyecto.

Detalles del proyecto de creaciรณn de servicios web seguros

Una vez finalizado el proceso, verรก el archivo del proyecto creado en el explorador de soluciones de Visual Studio 2013.

Explorador de soluciones para crear servicios web seguros

Paso 3) En este paso, vamos a agregar un archivo de servicio web a nuestro proyecto.

  1. Primero, haga clic con el botรณn derecho en el archivo del proyecto, como se muestra a continuaciรณn.

Crear proyectos de servicios web seguros (clic derecho)

  1. Una vez que haga clic con el botรณn derecho en el archivo del proyecto, tendrรก la opciรณn de seleccionar "Agregar -> Servicio web (ASMX)" para aรฑadir un archivo de servicio web. Simplemente indique "Servicio de tutorial" como nombre del archivo de servicio web.

Cree servicios web seguros y agregue un servicio web.

El paso anterior abrirรก un cuadro de diรกlogo donde podrรก introducir el nombre del archivo del servicio web. En el siguiente cuadro de diรกlogo, introduzca TutorialService como nombre del archivo.

Diรกlogo para crear nombres de servicios web seguros

Paso 4) Agregue el siguiente cรณdigo a su archivo asmx del servicio Tutorial. El fragmento de cรณdigo que aparece a continuaciรณn se utiliza para agregar una clase personalizada que se utilizarรก para cambiar el encabezado SOAP cuando se genere el mensaje SOAP. Dado que ahora queremos agregar credenciales de seguridad al encabezado SOAP, este paso es obligatorio.

Cree cรณdigo AuthHeader para servicios web seguros

      return "This is a Guru99 Web Service";
   }

   public class AuthHeader : SoapHeader
   {
      public string UserName;
      public string Password;
   }
}

Code Explicaciรณn:

  1. Ahora estamos creando una clase separada llamada Encabezado de autenticaciรณn que es de tipo Clase SoapHeaderSiempre que se desee modificar la informaciรณn que se incluye en el encabezado SOAP, es necesario crear una clase que utilice la clase SoapHeader integrada de .NET. Al personalizar el encabezado SOAP, ahora podemos incluir un nombre de usuario y una contraseรฑa al llamar al servicio web.
  2. Luego definimos variables de 'Nombre de usuario' y 'Contraseรฑa' que son de tipo cadena. Se utilizarรกn para contener los valores del nombre de usuario y la contraseรฑa que se pasan al servicio web.

Paso 5) Como siguiente paso, se debe agregar el siguiente cรณdigo al mismo Archivo TutorialService.asmx. Este cรณdigo define la funciรณn de nuestro servicio web. Esta funciรณn devuelve una cadena "Esto es un Guru99 Servicio webโ€ al cliente. Pero esta vez, la cadena solo se devolverรก si la aplicaciรณn cliente pasa las credenciales al servicio web.

Tutorial para crear servicios web seguros (cรณdigo fuente)

public class TutorialService : System.Web.Services.WebService
{
   public AuthHeader Credentials;

   [SoapHeader("Credentials")]

   [WebMethod]
   public string Guru99WebService()
   {

      if (Credentials.UserName.ToLower() != "Guru99" ||
      Credentials.Password.ToLower() != "Guru99Password")
      {
         throw new SoapException("Unauthorized",
         SoapException.ClientFaultCode);
      }
      else
      return "This is a Guru99 Web service";
   }

Code Explicaciรณn:

  1. Aquรญ, estamos creando un objeto de la clase AuthHeader que se creรณ en el paso anterior. Este objeto serรก pasado a nuestro Guru99Servicios web en el que se pueden examinar de cerca el nombre de usuario y la contraseรฑa.
  2. El atributo [SoapHeader] se usa ahora para especificar que cuando se llama al servicio web, se debe pasar el nombre de usuario y la contraseรฑa.
  3. En este bloque de cรณdigo, estamos examinando el nombre de usuario y la contraseรฑa que se pasan cuando se llama al servicio web. Si el nombre de usuario es igual a โ€œGuru99โ€ y la contraseรฑa es igual a โ€œGuru99Passwordโ€, luego el mensaje de โ€œEsto es un GuruSe pasa el servicio web 99 al cliente. De lo contrario, se enviarรก un error al cliente si se introducen un ID de usuario y una contraseรฑa incorrectos.

Si el cรณdigo se ejecuta correctamente, se mostrarรก la siguiente salida cuando ejecute el cรณdigo en el navegador.

Salida:

Generar resultados de servicios web seguros

La salida anterior se muestra al ejecutar el programa, lo que significa que el servicio web ya estรก disponible. Hagamos clic en el servicio. Descriptenlace iรณnico.

Descripciรณn del servicio de creaciรณn de servicios web seguros

Desde la descripciรณn del servicio, ahora podrรก ver que el nombre de usuario y la contraseรฑa son elementos del WSDL archivo. Estos parรกmetros deben enviarse cuando se invoca el servicio web.

Mejores prรกcticas de seguridad de servicios web

A continuaciรณn se detallan las consideraciones de seguridad que deben tenerse en cuenta al trabajar con servicios web:

  1. Auditorรญa y gestiรณn de registros โ€“ Utilice el registro de la aplicaciรณn para registrar todas las solicitudes que llegan a los servicios web. Esto proporciona un informe detallado sobre quiรฉn ha invocado el servicio web y puede ayudar en el anรกlisis de impacto en caso de que se produzca alguna brecha de seguridad.
  2. Flujo de llamadas al servicio web โ€“ Intente observar el flujo de llamadas en los servicios web. Por defecto, una aplicaciรณn puede realizar mรบltiples solicitudes a servicios web, intercambiando tokens de autenticaciรณn entre ellos. Es necesario supervisar y registrar todas las llamadas entre servicios web.
  3. Informaciรณn sensible No incluyas informaciรณn sensible en tus registros, como contraseรฑas, nรบmeros de tarjetas de crรฉdito ni ningรบn otro dato confidencial. Si algรบn evento contiene este tipo de informaciรณn, debe eliminarse antes de registrarlo.
  4. TracNegocios k OperaSupuestos de Alcance โ€“ Track operaciones comerciales importantes. Por ejemplo, instrumente su aplicaciรณn para registrar el acceso a mรฉtodos y lรณgica de negocio particularmente sensibles. Tomemos como ejemplo una tienda en lรญnea.ping aplicaciรณn. Hay varios pasos en una aplicaciรณn tรญpica, como elegir los artรญculos a comprar, cargar los artรญculos en el carrito y luego la compra final. Todo este flujo de trabajo empresarial debe ser tracpedido por el servicio web.
  5. Autenticaciรณn adecuada La autenticaciรณn es el mecanismo mediante el cual los clientes pueden establecer su identidad con el servicio web utilizando un conjunto de credenciales que la acrediten. Nunca se deben almacenar las credenciales del usuario; por lo tanto, si se utiliza WS Security para llamar al servicio web, es importante tener en cuenta que este no debe almacenar las credenciales enviadas en el encabezado SOAP. El servicio web debe descartarlas.

Preguntas Frecuentes

La IA puede monitorizar el trรกfico de servicios web en tiempo real, detectar patrones de solicitud inusuales e identificar posibles ataques como la inyecciรณn de cรณdigo o el abuso de tokens. Tambiรฉn puede analizar las configuraciones WSDL y SOAP en busca de autenticaciรณn dรฉbil o cifrado faltante.

Sรญ. Los modelos de aprendizaje automรกtico entrenados con trรกfico normal pueden detectar anomalรญas como el relleno de credenciales, encabezados SOAP mal formados o ataques de repeticiรณn. Aun asรญ, los equipos de seguridad deben revisar las alertas antes de bloquear las solicitudes para evitar interrumpir el servicio a clientes legรญtimos.

HTTPS cifra la conexiรณn entre dos puntos, por lo que los datos quedan expuestos una vez que llegan a un servidor intermedio. WS-Security protege el propio mensaje SOAP, manteniendoping Ofrecรญa protecciรณn de extremo a extremo incluso cuando pasaba por varios servidores.

Un UsernameToken es un elemento WS-Security que se coloca en el encabezado SOAP y que contiene un nombre de usuario y, opcionalmente, una contraseรฑa. Permite que un servicio web autentique al solicitante antes de procesar la solicitud.

Resumir este post con: