terça-feira, 2 de junho de 2015

SharePoint: Boas práticas na implementação do protocolo HTTPS


O planejamento de suporte de navegadores é importante na implementação do SharePoint, principalmente para páginas públicas. Uma parte importantíssima dessa implementação é a encriptação por meio de certificados digitais para garantir aos visitantes, usuários e clientes uma troca segura de informações, sem riscos dos dados trafegados serem interceptados ou alterados por terceiros.



O SharePoint suporta atualmente, com algumas pequenas limitações, todos os navegadores principais como Chrome, Internet Explorer, Firefox, Safari e dispositivos móveis. Aparentemente todos os navegadores suportam a utilização do protocolo de comunicação HTTPS, porém existem particularidades no uso dos protocolos de encriptação. 




O Firefox, por exemplo, suporta, mas não aceita por padrão os protocolos de encriptação SSL (1.0, 2.0 e 3.0) e TLS (1.0 e 1.1). O único protocolo de fato aceito pelo navegador é o TLS 1.2, conforme a seguinte imagem (Firefox na versão 38):



Firefox: About:Config - TLS Fallback desabilitado


O conhecimento desse detalhe é importante porque o TLS na versão 1.2 não é habilitado por padrão em todas as versões do servidor Windows e também existem proxies reversos que não suportam o TLS 1.2.




A abertura das páginas com TLS 1.2 não habilitado ou não suportado na infraestrutura pelo Firefox gera a mensagem "Secure Connection Failed: The Connection to the server was reset while the page was loading". 



"Secure Connection Failed: The Connection to the server was reset while the page was loading"



Isto é uma situação complicada para uma página web, já que o Firefox é um dos navegadores mais populares:

Fonte Wikipedia: Fatia de uso de navigadores.


Veremos agora em detalhe o que acontece na negociação do protocolo de encriptação entre cliente e servidor.



1.   O cliente encaminha um "CLIENT HELLO" para o servidor no IP e a porta obtidos durante o handshake:

struct {
          ProtocolVersion client_version;
          Random random;
          SessionID session_id;
          CipherSuite cipher_suites<2..2^16-1>;
          CompressionMethod compression_methods<1..2^8-1>;
          Extension client_hello_extension_list<0..2^16-1>;
      } ClientHello;


Um exemplo do "Client Hello", requisitando o 
protocolo TLS 1.2, capturado pela ferramenta Fiddler:

CONNECT URL:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: URL:443

A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below.

Version: 3.3 (TLS/1.2)
Random: E8 DA B9 55 D0 3E 7D 3E 48 86 89 EA CF 59 3E AB 60 D3 B0 F4 E1 37 C4 50 D5 E7 69 56 7B 89 B4 CA
"Time": 30/07/2015 05:06:00
SessionID: empty
Extensions:
            server_name            NAME
            renegotiation_info  00
            elliptic_curves          secp256r1 [0x17], secp384r1 [0x18], secp521r1 [0x19]
            ec_point_formats    uncompressed [0x0]
            SessionTicket          empty
            NextProtocolNego   empty
            ALPN             h2-16, h2-15, h2-14, h2, spdy/3.1, http/1.1
            status_request         OCSP - Implicit Responder
            signature_algs         sha256_rsa, sha384_rsa, sha1_rsa, sha256_ecdsa, sha384_ecdsa, sha1_ecdsa, sha256_dsa, sha1_dsa
Ciphers:
            [C02B]           TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
            [C02F]            TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
            [C00A]           TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
            [C009]            TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
            [C013]            TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
            [C014]            TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
            [0033] TLS_DHE_RSA_WITH_AES_128_SHA
            [0039] TLS_DHE_RSA_WITH_AES_256_SHA
            [002F] TLS_RSA_AES_128_SHA
            [0035] TLS_RSA_AES_256_SHA
            [000A]            SSL_RSA_WITH_3DES_EDE_SHA

2.   Vou considerar o IIS com a entidade SERVER para este cenário. Ao receber o "CLIENT HELLO", o servidor tem acesso às seguintes informações: 
·           Endereço IP
·           Número da porta (443)
·           A versão do protocolo solicitado, por exemplo TLS 1.2
·           A lista dos "Cipher Suites"
·           O ID da sessão etc.

O servidor irá agora tentar determinar se há um ponto de extremidade (end point) com o IP e a porta. No caso do IIS o driver TCPIP.SYS move o pacote para a camada HTTP.SYS se a página solicitada existe.

3.   O servidor responderá ao cliente com “SERVER HELLO” definido no protocolo mencionado no passo anterior (RFC 3546), se as informações recebidas forem corretas.

struct {
          ProtocolVersion server_version;
          Random random;
          SessionID session_id;
          CipherSuite cipher_suite;
          CompressionMethod compression_method;
          Extension server_hello_extension_list<0..2^16-1>;

      } ServerHello;



Os antecessores do TLS, SSL, não garantem mais a segurança prometida: A Google descobriu na última versão 3.0 do SSL a vulnerabilidade "Poodle" e partir desses fatos podemos derivar a boa prática de desabilitar todos os protocolos do SSL e a utilização do TLS como obrigação.

Segue um script de exemplo para habilitar TLS 1.2 no servidor Windows na versão 2008 R2:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2"
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server"
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "Enabled" -value 1 -PropertyType "DWord"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "DisabledByDefault" -value 0 -PropertyType "DWord"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "Enabled" -value 1 -PropertyType "DWord"
new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "DisabledByDefault" -value 0 -PropertyType "DWord"

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
A empresa Qualys oferece um serviço online gratuito para avaliar a página:


Fontes:

Transport Layer Security

Support for SSL/TLS protocols on Windows

Cipher Suites in Schannel

Cipher suite

Como restringir o uso de determinados algoritmos criptográficos e protocolos no Schannel.dll

TLS/SSL support history of web browsers

Web Browser

Nenhum comentário:

Postar um comentário