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:

  • XML (Extensible Markup Language): o XML é base sobre o qual são construídos os XML Web Services. O XML provê a descrição, o armazenamento e o formato de transmissão de dados. O XML é um padrão simples, independente de plataforma e amplamente disseminado;
  • SOAP (Simple Object Access Protocol): o SOAP é um protocolo simples baseado em XML e usado para troca de informações estruturadas na web. O SOAP define ainda como acessar serviços, objetos e servidores através da Internet;
  • WSDL (Web Service Description Language): O WSDL atua como uma espécie de gramática para os Web Services, descrevendo como usar os métodos, parâmetros e valores de retorno. Assim como o SOAP, o WSDL também é baseado em XML.

Segurança: Visão Ampla

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

  • Autenticação — Verifica a identidade de um dado usuário, averiguando se ele é realmente quem diz ser;
  • Autorização — Determina que somente usuários com privilégios (autorizados) possam acessar determinadas aplicações ou serviços;
  • Integridade — Verifica a integridade das mensagens, observando se elas foram alteradas durante a transmissão. Nesse caso, podemos usar diversos mecanismos de criptografia de chave assimétrica ou simétrica, disponíveis na plataforma .NET;
  • Privacidade — Devemos assegurar que as mensagens não sejam abertas por pessoas não autorizadas, seja durante a transmissão ou o armazenamento.

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:

  • Nível de Segurança baseado em plataforma e em transporte – O canal de transporte entre dois Web Services (cliente e servidor) é usado para implementar segurança ponto-a-ponto. Neste nível, devem ser usados os mecanismos de segurança do próprio sistema operacional Microsoft Windows, como, por exemplo, a autenticação do Microsoft IIS (Basic, Digest, Integrated NTLM ou Kerberos e autenticação baseada em certificados digitais padrão X.509), o SSL (Secure Sockets Layer), o IPSec (Internet Protocol Security) e os recursos próprios do ASP.NET para autenticação e autorização;
  • Nível de Segurança baseado na aplicação – Neste caso, os mecanismos de segurança são construídos na própria aplicação. Estes podem ser as credenciais de usuários ou as licenças (tickets) passadas dentro do cabeçalho da mensagem SOAP ou através de criptografia de mensagens (por meio do namespace System.Security);
  • Nível de segurança baseado em mensagens – Este é o método mais flexível e poderoso de segurança em XML Web Services. Ele é baseado na especificação WS-Security, que faz parte de uma iniciativa da Microsoft denominada GXA (Global XML Web Services Architecture). Somente esta especificação possibilita implementar arquiteturas seguras em ambientes heterogêneos, usando múltiplas tecnologias de criptografia e sem se preocupar com os mecanismos de transporte. Neste nível, é possível implementar a segurança end-to-end, que permite que as mensagens passem por várias aplicações intermediárias sem correrem o risco de violação.

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:

Roadmap 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:

  • WS-Policy – Permite que os Web Services especifiquem quais os requisitos de segurança necessários para que você os acesse. Em geral, são usados certificados digitais X.509;
  • WS-Trust – Define como devem ser estabelecidas as relações de confiança. Essas relações podem ser diretas ou através de brokers/negociadores;
  • WS-Privacy – Explica quais itens devem ser incluídos dentro das descrições do WS-Policy;
  • WS-SecureConversation – Descreve como deve ser o canal de comunicação entre Web Services para que haja confiabilidade na transmissão de mensagens. Em geral, usa-se o protocolo SSL;
  • WS-Federation – Descreve uma camada integradora de requisitos WS-Policy e as relações de confiança do WS-Trust;
  • WS-Authorization – Identifica quais itens devem ser verificados no processo de autorização e autenticação de Web Services.

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.

Formato de um arquivo SOAP
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.

Envelope com as credenciais do usuário
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á!