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.
ยฟ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.
En una comunicaciรณn HTTPS estรกndar entre el cliente y el servidor, se producen los siguientes pasos:
- 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.
- Luego, el servidor se autentica ante el cliente enviando su certificado. Esto garantiza que el cliente se estรฉ comunicando con el servidor correcto.
- 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.
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:
- 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.
- 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.
A continuaciรณn se detallan los pasos que tienen lugar en el flujo de trabajo descrito anteriormente:
- 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.
- Luego, el token de seguridad se pasa al cliente del servicio web.
- 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.
- 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.
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,
- 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.
- 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.
Una vez finalizado el proceso, verรก el archivo del proyecto creado en el explorador de soluciones de Visual Studio 2013.
Paso 3) En este paso, vamos a agregar un archivo de servicio web a nuestro proyecto.
- Primero, haga clic con el botรณn derecho en el archivo del proyecto, como se muestra a continuaciรณn.
- 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.
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.
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.
return "This is a Guru99 Web Service"; } public class AuthHeader : SoapHeader { public string UserName; public string Password; } }
Code Explicaciรณn:
- 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.
- 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.
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:
- 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.
- 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.
- 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:
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.
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:
- 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.
- 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.
- 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.
- 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.
- 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.














