Tutorial de seguridad del servicio web (WS) con ejemplo SOAP

Tabla de contenido:

Anonim

¿Qué es WS Security?

WS Security es un estándar que aborda la seguridad cuando se intercambian datos como parte 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 para la seguridad de las aplicaciones web. Por lo tanto, al desarrollar aplicaciones basadas en web, siempre se recomienda asegurarse de que la aplicación esté diseñada y desarrollada teniendo en cuenta la seguridad.

En este tutorial, aprenderá:

  • Amenazas de seguridad y contramedidas
  • Estándares de seguridad de servicios web
  • Cómo crear servicios web seguros
  • Prácticas recomendadas de seguridad de servicios web

Amenazas de seguridad y contramedidas

Para comprender las amenazas de seguridad que pueden ser hostiles para una aplicación web, veamos un escenario simple 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 la web. HTTPS utiliza la capa Secure Sockets o SSL para una comunicación segura. Tanto el cliente como el servidor tendrán un certificado digital para identificarse como genuinos cuando ocurra alguna comunicación entre el cliente y el servidor.

En una comunicación HTTPS estándar entre el cliente y el servidor, se llevan a cabo los siguientes pasos

  1. El cliente envía una solicitud al servidor a través del certificado de cliente. Cuando el servidor ve el certificado del cliente, toma una nota en su sistema de caché para que sepa que la respuesta solo debe volver a este cliente.
  2. Luego, el servidor se autentica ante el cliente enviando su certificado. Esto asegura que el cliente se esté comunicando con el servidor correcto.
  3. Toda la comunicación posterior entre el cliente y el servidor está encriptada. Esto asegura que si otros usuarios intentan romper la seguridad y obtener los datos requeridos, no podrán leerlos porque estarán encriptados.

Pero el tipo de seguridad anterior no funcionará en todas las situaciones. Puede llegar un momento en el que el cliente pueda hablar con varios servidores. Un ejemplo que se muestra a continuación muestra a un cliente hablando con una base de datos y un servidor web a la vez. En tales casos, no toda la información puede pasar a través del protocolo https.

Aquí es donde SOAP entra en acción para superar tales obstáculos al tener la especificación WS Security en su lugar. 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 información que se menciona a continuación

  1. Si el mensaje dentro del cuerpo de SOAP se ha firmado con cualquier clave de seguridad, esa clave se puede definir en el elemento de encabezado.
  2. Si algún elemento dentro del cuerpo SOAP está encriptado, el encabezado contendrá las claves de encriptación necesarias para que el mensaje pueda ser desencriptado cuando llegue al destino.

En entornos de múltiples servidores, la técnica anterior de autenticación SOAP ayuda de la siguiente manera.

  • Dado que el cuerpo de SOAP está encriptado, solo podrá ser desencriptado por el servidor web que aloja el servicio web. Esto se debe a cómo está diseñado el protocolo SOAP.
  • Suponga que si el mensaje se pasa 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 realmente al servidor web como un protocolo SOAP, podrá descifrar el mensaje y enviar la respuesta adecuada al cliente.

En los temas siguientes veremos cómo se puede utilizar el estándar WS Security para SOAP.

Estándares de seguridad de servicios web

Como se discutió en la sección anterior, el estándar WS-Security gira en torno a tener la definición de seguridad incluida en el encabezado SOAP.

Las credenciales en el encabezado SOAP se administran de 2 formas.

Primero, define un elemento especial llamado UsernameToken. Se utiliza para pasar el nombre de usuario y la contraseña al servicio web.

La otra forma es usar un token binario a través de BinarySecurityToken. Se utiliza en situaciones en las que se utilizan técnicas de cifrado como Kerberos o X.509.

El siguiente diagrama muestra el flujo de cómo funciona el modelo de seguridad en WS Security

A continuación se muestran los pasos que tienen lugar en el flujo de trabajo anterior.

  1. Se puede enviar una solicitud desde el cliente del servicio web a Security Token Service. Este servicio puede ser un servicio web intermedio creado específicamente para proporcionar nombres de usuario / contraseñas o certificados al servicio web SOAP real.
  2. Luego, el token de seguridad se pasa al cliente del servicio web.
  3. El cliente del servicio web luego llamó al servicio web, pero, esta vez, asegurándose de que el token de seguridad esté incrustado en el mensaje SOAP.
  4. El servicio web luego entiende el mensaje SOAP con el token de autenticación y luego puede contactar al servicio Security Token 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. Ahora basado en el fragmento de abajo, el mensaje SOAP contendrá 2 elementos adicionales, uno es el nombre de usuario y el otro es la contraseña.

Cuando el mensaje SOAP se pasa realmente entre los clientes y el servidor, la parte del mensaje que contiene las credenciales del usuario podría parecerse a la que se muestra arriba. El nombre del elemento wsse es un elemento especial denominado definido para SOAP y significa que contiene información basada en seguridad.

Cómo crear servicios web seguros

Ahora veamos el ejemplo de seguridad del servicio web SOAP. Construiremos una seguridad de servicio web sobre el ejemplo demostrado anteriormente en el capítulo SOAP y le agregaremos una capa de seguridad.

En nuestro ejemplo, vamos a crear un servicio web simple, que se utilizará para devolver una cadena a la aplicación que llama al servicio web. Pero esta vez, cuando se invoca el servicio web, es necesario proporcionar las credenciales al servicio que llama. Sigamos los pasos a continuación para crear nuestro servicio web SOAP y agregarle la definición de seguridad.

Paso 1) El primer paso es crear una aplicación web Asp.Net vacía. Desde Visual Studio 2013, haga clic en la opción de menú Archivo-> Nuevo proyecto.

Una vez que haga clic en la opción Nuevo proyecto, Visual Studio le dará 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 la plantilla web C # para la aplicación web ASP.NET. El proyecto tiene que ser de este tipo para poder crear un proyecto de servicios web. Al elegir esta opción, Visual Studio llevará a cabo los pasos necesarios para agregar los archivos requeridos que son requeridos por cualquier aplicación basada en web.
  2. Dé un nombre para su proyecto que en nuestro caso se ha dado como " webservice.asmx " . Luego asegúrese de dar una ubicación, donde se almacenarán los archivos del proyecto.

Una vez hecho esto, verá el archivo de proyecto creado en su explorador de soluciones en Visual Studio 2013.

Paso 3) En este paso,

Vamos a agregar un archivo de servicio web a nuestro proyecto.

  1. Primero, haga clic derecho en el archivo del proyecto como se muestra a continuación
  1. Una vez que haga clic con el botón derecho en el archivo del proyecto, tendrá la oportunidad de elegir la opción "Agregar-> Servicio web (ASMX) para agregar un archivo de servicio web. Simplemente proporcione un nombre de Servicio de tutorial para el archivo de nombre del servicio web.

El paso anterior abrirá un cuadro de diálogo en el que se puede ingresar el nombre del archivo del servicio web. Entonces, en el cuadro de diálogo a continuación, ingrese el nombre de TutorialService como nombre de archivo.

Paso 4) Agregue el siguiente código a su archivo asmx de Tutorial Service. El siguiente fragmento de código se usa para agregar una clase personalizada que se usará 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 necesario.

return "This is a Guru99 Web Service";}public class AuthHeader : SoapHeader{public string UserName;public string Password;}}

Explicación del código: -

  1. Ahora estamos creando una clase separada llamada AuthHeader que es del tipo de clase SoapHeader . Siempre que desee cambiar lo que se pasa en el encabezado SOAP, es necesario crear una clase que utilice la clase SoapHeader incorporada de .Net. Al personalizar SOAPheader, ahora tenemos la capacidad de pasar un 'Nombre de usuario' y una 'Contraseña' cuando se llama al servicio web.
  2. Luego definimos variables de 'Nombre de usuario' y 'Contraseña' que son de tipo cadena. Se utilizarán para mantener los valores del nombre de usuario y la contraseña que se pasan al servicio web.

Paso 5) Como paso siguiente, se debe agregar el siguiente código al mismo archivo TutorialService.asmx . Este código realmente define la función de nuestro servicio web. Esta función devuelve una cadena "Este es un servicio web Guru99" al cliente. Pero esta vez, la cadena solo se devolverá si la aplicación cliente pasa las credenciales al servicio web.

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);}eisereturn "This is a Guru99 Web service";}

Explicación del código: -

  1. Aquí, estamos creando un objeto de la clase AuthHeader que se creó en el paso anterior. Este objeto se pasará a nuestro Guru99Webservice en el que se pueden examinar detenidamente el nombre de usuario y la contraseña.
  2. El atributo [SoapHeader] se usa ahora para especificar que cuando se llama al servicio web, es necesario que se pasen el nombre de usuario y la contraseña.
  3. En este bloque de código, en realidad estamos examinando el nombre de usuario y la contraseña pasados ​​cuando se llama al servicio web. Si el nombre de usuario es igual a "Guru99" y la contraseña es igual a "Guru99Password", el mensaje "Este es un servicio web Guru99" se pasa al cliente. De lo contrario, se enviará un error al cliente si se pasa la identificación de usuario y la contraseña incorrectas.

Si el código se ejecuta correctamente, se mostrará el siguiente resultado cuando ejecute su código en el navegador.

Producción:

La salida anterior se muestra cuando se ejecuta el programa, lo que significa que el servicio web ahora está disponible. Hagamos clic en el enlace Descripción del servicio.

A partir de la descripción del servicio, ahora podrá ver que el nombre de usuario y la contraseña son elementos del archivo WSDL. Estos parámetros deben enviarse cuando se invoca el servicio web.

Prácticas recomendadas de seguridad de servicios web

A continuación se presentan las consideraciones de seguridad que deben tenerse en cuenta al trabajar con servicios web.

  1. Gestión de registros y auditoría : utilice el registro de aplicaciones 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 si se produce alguna violación de seguridad.

  2. Flujo de llamadas al servicio web : intente anotar el flujo de llamadas en los servicios web. De forma predeterminada, una aplicación podría llamar a varias solicitudes de servicios web con tokens de autenticación que se pasan entre estos servicios web. Todas las llamadas entre servicios web deben monitorearse y registrarse.

  3. Información confidencial: no incluya información confidencial en las entradas de su registro, como contraseñas o números de tarjetas de crédito o cualquier otro tipo de información confidencial. Si hay un evento que tiene algo de esta información, debe descartarse antes de iniciar sesión.

  4. Seguimiento de las operaciones comerciales : realice un seguimiento de las operaciones comerciales importantes. Por ejemplo, instrumente su aplicación para registrar el acceso a métodos y lógica empresarial especialmente sensibles. Tomemos un ejemplo de una aplicación de compras en línea. Hay varios pasos en una aplicación típica, como elegir los artículos que se van a comprar, los artículos que se cargan en el carrito y luego la compra final. El servicio web debe realizar un seguimiento de todo este flujo de trabajo empresarial.

  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 determinado conjunto de credenciales que pueden probar esa identidad. Nunca se deben almacenar las credenciales de usuario y, por lo tanto, si se usa WS Security para llamar al servicio web, debe tenerse en cuenta que el servicio web no debe almacenar las credenciales que se envían en el encabezado SOAP. Estos deben ser descartados por el servicio web.

Resumen

  • SOAP proporciona una capa adicional denominada WS Security para proporcionar seguridad adicional cuando se realizan llamadas a servicios web.
  • WS Security se puede llamar con un nombre de usuario o contraseña simple o se puede usar con certificados binarios para autenticación
  • Hemos visto que en .Net podemos personalizar el servicio web para que se pasen un nombre de usuario y una contraseña como parte del elemento de encabezado SOAP.