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: