Segurança de aplicativos distribuídos

A segurança do Windows Communication Foundation (WCF) é dividida em três áreas funcionais principais: segurança de transferência, controle de acesso e auditoria. A segurança de transferência fornece integridade, confidencialidade e autenticação. A segurança de transferência é fornecida por um dos seguintes: segurança de transporte, segurança de mensagens ou TransportWithMessageCredential.

Para obter uma visão geral da segurança de mensagens do WCF, consulte Visão geral de segurança. Para obter mais informações sobre as outras duas partes da segurança do WCF, consulte Autorização e auditoria.

Cenários de segurança de transferência

Os cenários comuns que empregam a segurança de transferência WCF incluem o seguinte:

  • Transferência segura usando o Windows. Um cliente WCF e um serviço são implantados em um domínio do Windows (ou em uma floresta do Windows). As mensagens contêm dados pessoais, portanto, os requisitos incluem autenticação mútua do cliente e do serviço, integridade da mensagem e confidencialidade da mensagem. Além disso, é necessária a prova de que uma determinada transação ocorreu, por exemplo, o destinatário da mensagem deve gravar as informações da assinatura.

  • Transferência segura usando UserName e HTTPS. Um cliente e um serviço WCF precisam ser desenvolvidos para funcionar na Internet. As credenciais do cliente são autenticadas em um banco de dados de pares de nome de usuário/senha. O serviço é implantado em um endereço HTTPS usando um certificado SSL (Secure Sockets Layer) confiável. Como as mensagens viajam pela Internet, o cliente e o serviço precisam ser mutuamente autenticados, e a confidencialidade e a integridade das mensagens devem ser preservadas durante a transferência.

  • Transferência segura usando certificados. Um cliente e um serviço WCF precisam ser desenvolvidos para funcionar na Internet pública. O cliente e o serviço têm certificados que podem ser usados para proteger as mensagens. O cliente e o serviço usam a Internet para se comunicar entre si e realizar transações de alto valor que exigem integridade, confidencialidade e autenticação mútua da mensagem.

Integridade, confidencialidade e autenticação

Três funções — integridade, confidencialidade e autenticação — são chamadas juntas de segurança de transferência. A segurança de transferência fornece as funções que ajudam a mitigar as ameaças a um aplicativo distribuído. A tabela a seguir descreve brevemente as três funções que compõem a segurança de transferência.

Function Description
Integridade Integridade é a garantia de que os dados são completos e precisos, especialmente depois de terem percorrido de um ponto a outro e, possivelmente, terem sido lidos por muitos atores. A integridade deve ser mantida para evitar a adulteração dos dados, e geralmente é alcançada pela assinatura digital de uma mensagem.
Confidencialidade A confidencialidade é a garantia de que uma mensagem não foi lida por ninguém além do leitor pretendido. Por exemplo, um número de cartão de crédito deve ser mantido confidencial à medida que é enviado pela Internet. A confidencialidade é frequentemente assegurada pela encriptação dos dados utilizando um esquema de chave pública/chave privada.
Autenticação A autenticação é a verificação de uma identidade reivindicada. Por exemplo, ao usar uma conta bancária, é imperativo que apenas o proprietário real da conta tenha permissão para retirar fundos. A autenticação pode ser fornecida por vários meios. Um método comum é o sistema de usuário/senha. Um segundo é o uso de um certificado X.509 que é fornecido por terceiros.

Modos de Segurança

WCF tem vários modos de segurança de transferência, que são descritos na tabela a seguir.

Modo Description
None Nenhuma segurança é fornecida na camada de transporte ou na camada de mensagem. Nenhuma das associações predefinidas usa esse modo por padrão, exceto o <elemento basicHttpBinding> ou, ao usar código, a BasicHttpBinding classe.
Transporte Usa um transporte seguro, como HTTPS, para integridade, confidencialidade e autenticação mútua.
Mensagem Usa a segurança de mensagens SOAP para integridade, confidencialidade e autenticação mútua. As mensagens SOAP são protegidas de acordo com os padrões WS-Security.
Modo misto Usa segurança de transporte para integridade, confidencialidade e autenticação do servidor. Usa segurança de mensagem (WS-Security e outros padrões) para autenticação de cliente.

(Esta enumeração para este modo é TransportWithMessageCredential.)
Ambos Executa proteção e autenticação em ambos os níveis. Esse modo está disponível somente no elemento netMsmqBinding>.<

Credenciais e Segurança de Transferência

Uma credencial são dados que são apresentados para estabelecer uma identidade ou recursos reivindicados. A apresentação de uma credencial envolve a apresentação dos dados e da prova de posse dos dados. O WCF oferece suporte a uma variedade de tipos de credenciais nos níveis de segurança de transporte e mensagem. Você pode especificar um tipo de credencial para uma associação WCF.

Em muitos países ou regiões, uma carteira de motorista é um exemplo de credencial. Uma licença contém dados que representam a identidade e as capacidades de uma pessoa. Contém prova da posse sob a forma da imagem do possuidor. A licença é emitida por uma autoridade confiável, geralmente um departamento de licenciamento governamental. A licença é selada e pode conter um holograma, mostrando que não foi adulterada ou falsificada.

Como exemplo, considere dois tipos de credenciais suportadas no WCF: nome de usuário e credenciais de certificado (X.509).

Para a credencial de nome de usuário, o nome de usuário representa a identidade reivindicada e a senha apresenta a prova de posse. A autoridade confiável, neste caso, é o sistema que valida o nome de usuário e a senha.

Na credencial do certificado, o nome da entidade, o nome alternativo da entidade ou campos específicos dentro do certificado podem ser usados para representar a identidade e/ou os recursos reivindicados. A prova de posse dos dados na credencial é estabelecida usando a chave privada associada para gerar uma assinatura.

Para obter mais informações sobre como programar a segurança de transferência e especificar credenciais, consulte Ligações e Comportamentos de segurança e segurança.

Tipos de credenciais de cliente de transporte

A tabela a seguir mostra os valores possíveis usados ao criar um aplicativo que usa segurança de transferência. Você pode usar esses valores em qualquer código ou configurações de vinculação.

Definição Descrição
None Especifica que o cliente não precisa apresentar nenhuma credencial. Isto traduz-se num cliente anónimo.
Básica Especifica a autenticação básica. Para obter mais informações, consulte RFC2617, "Autenticação HTTP: autenticação básica e digest".
Resumo Especifica a autenticação digest. Para obter mais informações, consulte RFC2617, "Autenticação HTTP: autenticação básica e digest".
Ntlm Especifica a autenticação do Windows usando negociação SSPI em um domínio do Windows.

A negociação SSPI resulta no uso do protocolo Kerberos ou NT LanMan (NTLM).
Windows Especifica a autenticação do Windows usando SSPI em um domínio do Windows. SSPI seleciona do protocolo Kerberos ou NTLM como serviço de autenticação.

SSPI tenta o protocolo Kerberos primeiro; se isso falhar, ele usa NTLM.
Certificado Executa a autenticação do cliente usando um certificado, normalmente X.509.

Tipos de credenciais de cliente de mensagem

A tabela a seguir mostra os valores possíveis usados ao criar um aplicativo que usa segurança de mensagem. Você pode usar esses valores em qualquer código ou configurações de vinculação.

Definição Descrição
None Permite que o serviço interaja com clientes anônimos.
Windows Permite que trocas de mensagens SOAP ocorram no contexto autenticado de uma credencial do Windows. Usa o mecanismo de negociação SSPI para escolher entre o protocolo Kerberos ou NTLM como um serviço de autenticação.
Username Permite que o serviço exija que o cliente seja autenticado com uma credencial de nome de usuário. Observe que o WCF não permite nenhuma operação criptográfica com o nome de usuário, como gerar uma assinatura ou criptografar dados. Como tal, o WCF impõe que o transporte seja protegido ao usar credenciais de nome de usuário.
Certificado Permite que o serviço exija que o cliente seja autenticado usando um certificado.
Espaço CardSpace Permite que o serviço exija que o cliente seja autenticado usando um CardSpace.

Credenciais de programação

Para cada um dos tipos de credenciais de cliente, o modelo de programação WCF permite especificar os valores de credenciais e validadores de credenciais usando comportamentos de serviço e comportamentos de canal.

A segurança do WCF tem dois tipos de credenciais: comportamentos de credenciais de serviço e comportamentos de credenciais de canal. Os comportamentos de credenciais no WCF especificam os dados reais, ou seja, as credenciais usadas para atender aos requisitos de segurança expressos por meio de associações. No WCF, uma classe de cliente é o componente de tempo de execução que converte entre invocação de operação e mensagens. Todos os clientes herdam da ClientBase<TChannel> classe. A ClientCredentials propriedade na classe base permite especificar vários valores de credenciais de cliente.

No WCF, comportamentos de serviço são atributos aplicados à classe que implementa um contrato de serviço (interface) para controlar programaticamente o serviço. A ServiceCredentials classe permite que você especifique certificados para credenciais de serviço e configurações de validação de cliente para vários tipos de credenciais de cliente.

Modelo de Negociação para Segurança de Mensagens

O modo de segurança de mensagem permite que você execute a segurança de transferência para que a credencial de serviço seja configurada no cliente fora da banda. Por exemplo, se estiver a utilizar um certificado armazenado no arquivo de certificados do Windows, tem de utilizar uma ferramenta como um snap-in da Consola de Gestão da Microsoft (MMC).

O modo de segurança de mensagem também permite que você execute a segurança de transferência para que a credencial de serviço seja trocada com o cliente como parte de uma negociação inicial. Para habilitar a negociação, defina a NegotiateServiceCredential propriedade como true.

Consulte também