Tutorial de seguridad de servicios web (WS) con ejemplo SOAP

¿Qué es la seguridad de WS?

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 crear 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 que se produzca una amenaza a la seguridad de las aplicaciones web. Por lo tanto, al desarrollar aplicaciones basadas en web, siempre se recomienda asegurarse de que la aplicación se diseñe y desarrolle teniendo en cuenta la seguridad.

Amenazas a la seguridad y contramedidas

Para comprender las amenazas a la seguridad que pueden ser hostiles a 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 dispondrán de un certificado digital para identificarse como genuino cuando se produzca cualquier comunicación entre el cliente y el servidor.

Amenazas a la seguridad y contramedidas

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 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 otros usuarios intentan romper la seguridad y obtener los datos necesarios, no podrán leerlos porque estarían cifrados.

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. El siguiente ejemplo 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 por el protocolo https.

Amenazas a la seguridad y contramedidas

Aquí es donde SOAP entra en acción para superar dichos obstáculos al contar con la especificación de seguridad WS. 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 SOAP se ha firmado con alguna clave de seguridad, esa clave se puede definir en el elemento del encabezado.
  2. Si algún elemento dentro del cuerpo SOAP está cifrado, el encabezado contendrá las claves de cifrado necesarias para que el mensaje pueda descifrarse cuando llegue al destino.

En entornos de múltiples servidores, la técnica de autenticación SOAP anterior 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 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.
  • Sólo cuando la solicitud llegue realmente al servidor web como protocolo SOAP, podrá descifrar el mensaje y enviar la respuesta adecuada al cliente.

Veremos en los temas siguientes cómo se puede utilizar el estándar de seguridad WS para JABÓN.

Estándares de seguridad de servicios web

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

Las credenciales en el encabezado SOAP se administran de dos maneras.

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

La otra forma es utilizar un token binario a través de BinarySecurityToken. Esto 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.

Estándares de seguridad de servicios web

A continuación se detallan los pasos que se llevan a cabo en el flujo de trabajo anterior.

  1. Se puede enviar una solicitud desde el cliente del servicio web al servicio de token 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 real.
  2. Luego, el token de seguridad se pasa al cliente del servicio web.
  3. Luego, el cliente del servicio web llamó 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. Ahora, según el siguiente fragmento, el mensaje SOAP contendrá 2 elementos adicionales, uno será el nombre de usuario y el otro 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 pasa realmente entre los clientes y el servidor, la parte del mensaje que contiene las credenciales del usuario podría verse como 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 construir servicios web seguros

Ahora veamos un ejemplo de seguridad del servicio web SOAP. Construiremos un servicio web de seguridad sobre el ejemplo mostrado 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, las credenciales deben proporcionarse 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 un vacío. asp.net Aplicación web. Desde Visual Studio 2013, haga clic en la opción de menú Archivo->Nuevo proyecto.

Cree 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 aplicación web ASP.NET. El proyecto debe 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 necesarios para cualquier aplicación basada en web.
  2. Dale un nombre a tu proyecto que en nuestro caso se ha dado como “servicio web.asmx.Luego asegúrese de proporcionar una ubicación donde se almacenarán los archivos del proyecto.

Cree servicios web seguros

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

Cree servicios web seguros

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

Cree servicios web seguros

  1. Una vez que haga clic 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 Tutorial para el archivo de nombre del servicio web.

    Cree servicios web seguros

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

Cree 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 servicios web seguros

		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 Encabezado de autenticación que es de tipo 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 el encabezado SOAP, 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 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 en realidad define la función de nuestro servicio web. Esta función devuelve una cadena "Este es un servicio web de Guru99" al cliente. Pero esta vez, la cadena sólo se devolverá si la aplicación cliente pasa las credenciales al servicio web.

Cree servicios web seguros

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);
		}
		eise
		return "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 será pasado a nuestro Servicio web Guru99 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, 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", entonces se pasa al cliente el mensaje "Este es un servicio web de Guru99". 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á la siguiente salida cuando ejecute el código en el navegador.

Salida:

Cree servicios web seguros

El resultado anterior se muestra cuando se ejecuta el programa, lo que significa que el servicio web ahora está disponible. Hagamos clic en el Servicio Descriptenlace iónico.

Cree 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 presentan las consideraciones de seguridad que se deben tener en cuenta al trabajar con servicios web

1. Auditoría y gestión de registros – 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 – Intenta anotar el flujo de las llamadas en los servicios web. De forma predeterminada, una aplicación podría llamar a múltiples solicitudes de servicios web con tokens de autenticación pasados ​​entre estos servicios web. Todas las llamadas entre servicios web deben monitorearse y registrarse.

3. Información sensible – No incluya información confidencial en sus entradas de registro, como contraseñas, números de tarjetas de crédito o cualquier otro tipo de información confidencial. Si hay un evento que contenga alguna de estas informaciones, debe descartarse antes de registrarlo.

4. Seguimiento del negocio OperaSupuestos de Alcance – Realice un seguimiento de las operaciones comerciales importantes. Por ejemplo, equipe su aplicación para registrar el acceso a métodos y lógica comercial especialmente sensibles. Tomemos como ejemplo una aplicación de compras en línea. Existen varios pasos en una aplicación típica, como la elección de los artículos que se van a comprar, los artículos cargados en el carrito y luego la compra final. Todo este flujo de trabajo comercial debe ser monitoreado por el servicio web.

5. Autenticación adecuada – La autenticación es el mecanismo por el cual los clientes pueden establecer su identidad en el servicio web utilizando un determinado conjunto de credenciales que pueden probar esa identidad. Nunca se deben almacenar las credenciales del usuario y, por lo tanto, si se utiliza WS Security para llamar al servicio web, se debe tener 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.

Resum

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