Conhecendo o WS-Security
Os mecanismos tradicionais de segurança da Web, como por exemplo o HTTPS, podem não ser suficientes para garantir os requisitos de segurança de todos os cenários de serviços da Web, podendo ser necessário garantir segurança também em nível de mensagem.
A especificação WS-Security é uma extensão para o SOAP, que define como anexar uma assinatura digital, usar criptografia e usar tokens de segurança em mensagens SOAP.
Usando o WS-Security, a segurança também existe em nível de mensagem. A mensagem SOAP possui informações relevantes aos protocolos e procedimentos para processar a segurança em nível de mensagem. No entanto, essa abordagem não está atrelada a nenhum mecanismo de transporte específico como ocorre com o HTTPS, que está diretamente atrelado à camada de transporte (por exemplo, o HTTPS depende da porta TCP 443, que está na camada de transporte, para sua comunicação). As informações de segurança estarão incluídas dentro da mensagem SOAP, sendo independente de um protocolo de transporte, como o HTTPS, justamente por estarem contidas dentro da mensagem.
É possível incluir informações de assinatura e de criptografia nos cabeçalhos da mensagem SOAP, bem como outras informações, tais como, tokens de segurança para identidade (por exemplo, um certificado X.509) que estão ligados ao conteúdo da mensagem SOAP.
A ideia basicamente é a seguinte: o cliente incluirá no cabeçalho da sua mensagem (SOAP Header) informações de segurança que se aplicam especificamente à essa mensagem. Quando recebida pelo servidor, este realizará uma validação para verificar se aquela mensagem está de acordo com uma política de segurança específica.
Aplicando recursos da especificação WS-Security, o cabeçalho (SOAP Header) de segurança é inserido sob o envelope (SOAP Envelope), quando o corpo (SOAP Body)é assinado e criptografado. Veja a imagem que ilustra a utilização do WS-Security:
As especificações do WS-Security
O WS-Security compreende várias especificações diferentes que resolvem problemas diferentes.
WS-Security Core Especification 1.1
Também conhecida como SOAP Message Security, tem o propósito de resolver os problemas relacionados à integridade e confidencialidade das mensagens trocadas. Outra finalidade importante desta especificação é como lidar com ataques de acesso a web services usando mecanismos de timestamp nas mensagens, para evitar que vários acessos simultâneos sejam feitos ao web services com o objetivo de derrubar a infraestrutura de hardware e software que hospeda o mesmo.
Username Token Profile 1.1
A ideia dessa especificação é padronizar a forma como os consumidores de um web service se identificam aos provedores do serviço. Para isso, propõe a utilização de um token de usuário, composto por um username e opcionalmente de uma senha.
X.509 Token Profile 1.1
Aborda o mesmo assunto do Username Token Profile 1.1, porém se diferencia pois utiliza certificados X.509, ao invés de usar credenciais no SOAP Header parar fazer o processo de autenticação. Esses certificados são basicamente uma chave pública composta por um conjunto de atributos que identificam alguém ou algum componente. Lembrando que essa especificação é adequada principalmente para casos em que a mensagem foi cifrada.
SAML Token Profile 1.1
Utilização do SAML, que é um mecanismo de comunicação segura, baseado em XML, para troca de informações de identidades entre organizações. Esse protocolo elimina a necessidade de se manter múltiplas credenciais de autenticações, e seu mais importante caso de uso é habilitar Sigle Sign-On (SSO) na Internet.
A grande vantagem desta especificação é que expressões de segurança podem ser criadas para avaliar como o conteúdo das mensagens deverão ser lidos, uma vez que outros processos de segurança poderão ter sido aplicados na mensagem, como cifragem e assinatura digital.
Kerberos Token Profile 1.1
Kerberos é um protocolo que permite comunicações individuais seguras e identificadas, em uma rede insegura. Para isso o Massachusetts Institute of Technology (MIT) disponibiliza um pacote de aplicativos que implementam esse protocolo.
Devido ao crescimento e popularidade desse protocolo em ambientes de segurança corporativos, esta especificação veio endereçar como realizar processos de autenticação quando a “credencial” enviada na mensagem SOAP é na verdade um ticket Kerberos, em conjunto com a cifragem e assinatura digital da mensagem.
Exemplo prático
Os namespaces deste exemplo serão omitidos para facilitar a leitura, mas após o exemplo você poderá ver o valor de cada prefixo que foi utilizado no XML.
Neste exemplo podemos ver a utilização do Timestamp de acordo com a WS-Security Core Especification 1.1, e também a utilização de um Username e Password conforme especificado na Username Token Profile 1.1.
<soapenv:Envelope xmlns:say="..." xmlns:soapenv="...">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="..." xmlns:wsu="...">
<wsu:Timestamp wsu:Id="TS-1471A42CFC0BCA31CB15226082678852">
<wsu:Created>2018-04-01T18:44:27.885Z</wsu:Created>
<wsu:Expires>2018-04-01T18:45:27.885Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken wsu:Id="UsernameToken-1471A42CFC0BCA31CB15226082647321">
<wsse:Username>myUser</wsse:Username>
<wsse:Password Type="...">myPass</wsse:Password>
<wsse:Nonce EncodingType="...">WgCFCHJb3Y2uW5n/KYTSOQ==</wsse:Nonce>
<wsu:Created>2018-04-01T18:44:24.504Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<say:sayHello>
<yourName>John</yourName>
</say:sayHello>
</soapenv:Body>
</soapenv:Envelope>
Namespaces utilizados:
xmlns:say="http://www.example.org/SayHello/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"
Referências:
http://www.univale.com.br/unisite/mundo-j/artigos/37SOApratica.pdf
https://www.ibm.com/support/knowledgecenter/pt-br/SSKM8N_8.0.0/com.ibm.etools.mft.doc/ac55630_.htm
https://www.ibm.com/developerworks/br/webservices/tutorials/ws-understand-web-services4/
https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss