Segurança nos XML Web Services

Este artigo ensina como implementar essa troca de mensagens em Web Services de forma segura, utilizando a plataforma .NET.

Atualmente, uns dos assuntos mais discutidos pelos desenvolvedores refere-se à implementação de Web Services. É possível desenvolver rapidamente XML Web Services no Visual Studio .NET, seja em Visual Basic .NET, C# ou Managed C++. Essa característica possibilita integrar aplicações de missão crítica concebidas em diversas linguagens e em diferentes ambientes, num curto espaço de tempo e a um custo baixo.

Entretanto, toda a tecnologia de Web Services é baseada em protocolos usados na Internet, que são naturalmente inseguros. Os Web Services trocam dados entre si através de mensagens SOAP (Simple Object Access Protocol) transmitidas pelo protocolo HTTP ou SMTP, as quais podem ser capturadas por estranhos ao longo do processo de transmissão. Este artigo ensina como implementar essa troca de mensagens em Web Services de forma segura, utilizando a plataforma .NET.

XML Web Services: Relembrando...

Antes de falarmos sobre segurança em XML Web Services, é importante entender o conceito e a proposta. O site da Microsoft sobre Web Services traz uma definição muito interessante: “XML Web Services são fundamentais no desenvolvimento de aplicações em ambiente distribuído que utilizam a Internet. Padrões abertos, com foco na comunicação e colaboração entre pessoas e aplicações, criando um ambiente onde XML Web Services se tornem a plataforma para integração de aplicações. As aplicações serão construídas com múltiplos XML Web Services, de várias fontes, que estarão trabalhando juntos, independentemente de sua localização e de como foram implementados”.

Observando mais detalhadamente a tecnologia de Web Services, é possível notar que o grande interesse da comunidade técnica é justificado pelo potencial oferecido em termos de computação distribuída. Outro aspecto importante é que eles permitem uma Arquitetura Orientada a Serviços (SOA - Service-Oriented Architecture). Quando se utiliza Web Services para a construção dessa arquitetura, as soluções consistem em coleções de serviços independentes, auto-suficientes, identificados por URLs, com interfaces documentadas através de WSDL e que processem mensagens XML. O SOA é um complemento a abordagens orientadas a objetos (OO) e procedurais. Basicamente, os padrões utilizados na implementação de XML Web Services neste artigo são os seguintes:

Segurança: Visão Ampla

Quando desenvolvemos qualquer mecanismo de segurança em nossas aplicações, devemos sempre pensar em quatro itens:

Níveis de Segurança nos XML Web Services

Assim como existem diversas formas de criar XML Web Services no Visual Studio 2003, existem também várias maneiras de agregar segurança. Obviamente elas podem ser implementadas em separado ou em conjunto, de acordo com os objetivos do projeto. Essas soluções podem ser classificadas em níveis:

WS-Security

WS-Security é uma especificação que facilita o desenvolvimento de Web Services seguros. Em 2002, a Microsoft, a IBM e a VeriSign desenvolveram em parceria o Web Services Security (WS-Security). O objetivo era produzir um padrão que gerasse interoperabilidade entre aplicações produzidas em linguagens diferentes e ambientes heterogêneos. A Figura 1 mostra os principais itens do WS-Security:

Figura 1. Roadmap do WS-Security.

Note que a especificação WS-Security é baseada no protocolo de mensagens SOAP. Veja a seguir uma pequena descrição dos itens da Figura 1:

Arquitetura de Mensagens SOAP

A segurança no nível de mensagens é baseada no protocolo SOAP. Compreender este protocolo é essencial para desenvolver Web Services seguros. A arquitetura de uma mensagem SOAP consiste em um envelope que contém um cabeçalho (opcional) e o corpo da mensagem (mandatório). O corpo inclui os dados específicos à mensagem, e o cabeçalho apresenta informações gerais sobre a mensagem.

Como a especificação SOAP não faz restrições sobre o conteúdo do cabeçalho, ele pode ser usado para diversos tipos de informações, tais como informações de autenticação, identificação da transação ou para dados sobre a sessão iniciada. A extensibilidade das mensagens SOAP é determinada pela característica do cabeçalho.

Listagem 1. Formato de um arquivo SOAP.

WS-Security em Detalhes

Conforme mencionado anteriormente, a WS-Security facilita a utilização de vários padrões de segurança nos XML Web Services, como a infra-estrutura de chaves públicas (PKI), e de forma neutra ao método de transporte desta mensagem. Para implementar esses padrões, é usado o cabeçalho da mensagem SOAP. Por exemplo, é possível enviar no cabeçalho as credenciais do usuário, através do elemento UsernameToken, também chamado de security token. A Figura 2 mostra um exemplo deste envelope.

Figura 2. Envelope com as credenciais do usuário.

Veja na Listagem 2 o arquivo com a mensagem SOAP usando WS-Security.

Processamento de Mensagens SOAP Usando o UserNameToken

Como processar mensagens SOAP que contêm UserNameToken utilizando o Visual Studio .NET 2003? A Listagem 3 mostra um trecho em ASP.NET que executa esta tarefa.

Listagem 3. Código em C#.

   using System;
   
   using System.Collections;
   
   using System.ComponentModel;
   
   using System.Data;
   
   using System.Diagnostics;
   
   using Microsoft.Web.Services.Security;
   
   using Microsoft.Web.Services;
   
   using System.Security.Cryptography;
   
    
   
   namespace WSEUsernameToken
   
   {
   
   public class Service1 : System.Web.Services.WebService
   
   {
   
   [WebMethod]
   
   public string ExemploToken ()
   
   {
   
     SoapContext requestContext =
   
   HttpSoapContext.RequestContext;
   
     // Verifica a mensagem SOAP recebida.
   
     if (requestContext == null)
   
     {
   
   throw new
   
   ApplicationException("Não é uma mensagem SOAP ou o WSE não está instalado.");
   
     }
   
     UsernameToken Token1 =
   
   GetToken( requestContext.Security );
   
     if ( Token1 != null )
   
     {
   
   value = "Este é um exemplo de uso do UserNameToken";
   
     }
   
     return value;
   
   }
   
    
   
   private UsernameToken GetToken(Security sec )
   
   {
   
     UsernameToken value = null;
   
     if ( sec.Tokens.Count > 0 )
   
     {
   
   foreach ( SecurityToken tok in sec.Tokens )
   
   {
   
   value = tok as UsernameToken;
   
   if ( value != null )
   
   {
   
   return value;
   
   }
   
   }
   
     }
   
     return value;
   
     }
   
   }
   
   }
   

Neste trecho de código, verificamos que cada mensagem SOAP pode ter um ou mais security tokens e que os UsernameToken vão sendo retornados através de um for-each. É importante observar que o código da Listagem 3 é apenas ilustrativo e não funcionará se for copiado e colado num projeto de ASP.NET Web Services.

WSE (Web Services Enhancements)

Para implementar XML Web Services seguros usando a especificação WS-Security no .NET, é necessário instalar o WSE (Web Services Enhancements).

Com o WSE instalado, você poderá implementar no aplicativo as novas funcionalidades dos XML Web Services, as quais são constantemente atualizadas nas especificações de Web Services.

Conclusão

Este artigo abordou a segurança em nível de mensagens (SOAP). No entanto, é importante observar que o cuidado com a segurança na implementação de XML Web Services é proporcional ao nível de complexidade do projeto. Quanto mais crítico for projeto, mais atenção à segurança ele demandará!

Artigos relacionados