Compartilhar via


Suporte ao HSTS (HTTP Strict Transport Security) do IIS 10.0 versão 1709

por Yanbing Shi

No IIS 10.0 versão 1709, o administrador tem a opção de habilitar o redirecionamento HSTS e HTTP para HTTPS no nível do site.

Compatibilidade

Versão Observações
IIS 10.0 versão 1709 Os recursos descritos neste artigo foram introduzidos no IIS 10.0 versão 1709
IIS 10.0 e versões anteriores Não havia suporte para os recursos descritos neste artigo antes do IIS 10.0 versão 1709

Segurança de Transporte Estrita de HTTP (HSTS)

O protocolo HSTS (HTTP Strict Transport Security), especificado no RFC 6797, permite que um site se declare como um host seguro e informe aos navegadores que ele deve ser contatado apenas por meio de conexões HTTPS. O HSTS é um aprimoramento de segurança de aceitação que impõe o HTTPS e reduz significativamente a capacidade de ataques do tipo man-in-the-middle para interceptar solicitações e respostas entre servidores e clientes.

Ele impõe o uso do HTTPS por meio de uma política que exige suporte de servidores Web e navegadores. Um host Web habilitado para HSTS pode incluir um cabeçalho de resposta HTTP especial “STS” (Strict-Transport-Security), acompanhado de uma diretiva “max-age” em uma resposta HTTPS para solicitar que o navegador use o HTTPS para comunicação adicional. O navegador recebe o cabeçalho e memoriza a política HSTS para o número de segundos especificado pela diretiva “max-age”. Nesse período, se um usuário tentar visitar o mesmo site, mas digitar http:// ou omitir o esquema, o navegador automaticamente transformará o link não seguro no seguro (https://) e fará uma conexão HTTPS com o servidor. Depois que uma resposta é recebida por meio de HTTPS, o navegador também impede que o usuário “clique” em qualquer aviso de segurança (por exemplo, um aviso sobre um certificado de servidor inválido). Para aproveitar o HSTS, o navegador precisa ver o cabeçalho HSTS pelo menos uma vez. Para proteger o usuário na primeira conexão com um determinado domínio, o HSTS tem um mecanismo separado para pré-carregar uma lista de domínios registrados para o navegador pronto para uso.

Desafios na habilitação do HSTS antes do IIS 10.0 versão 1709

Antes do IIS 10.0 versão 1709, habilitar o HSTS em um servidor IIS exigia uma configuração complexa.

Duas soluções para habilitar o HSTS antes do IIS 10.0 versão 1709 são fornecidas para um exemplo de cenário: o administrador da Web deseja habilitar o HSTS para um domínio contoso.com que aceita conexões HTTP e HTTPS e redirecionar todo o tráfego HTTP para HTTPS. O redirecionamento nesse cenário não é seguro por natureza, mas ainda é um padrão seguido por muitos sites que dão suporte a HTTPS. O motivo fundamental para ainda ouvir o HTTP é que o site não tem controle sobre como os visitantes podem tentar conectá-lo: via HTTPS ou apenas via HTTP sem formatação. Habilitar o HSTS reduz consideravelmente o número de redirecionamentos HTTP para HTTPS não seguros, com a condição de que o navegador veja o cabeçalho STS durante a primeira conexão HTTPS bem-sucedida (por meio de visita direta ou redirecionamento).

Solução 1: Módulo de Redirecionamento HTTP + cabeçalhos personalizados

O redirecionamento de todo o tráfego HTTP para HTTPS pode ser feito com o Módulo de Redirecionamento HTTP com dois sites separados, um para HTTP e outro para HTTPS, a fim de evitar um loop de redirecionamento infinito.

<sites>
    <site name="Contoso-http" id="1" serverAutoStart="true">
        <application path="/" applicationPool="Contoso-http">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-http" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:contoso.com" />
        </bindings>
    </site>
    <site name="Contoso-https" id="2" serverAutoStart="true">
        <application path="/" applicationPool="Contoso-https">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-https" />
        </application>
        <bindings>
            <binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
        </bindings>
    </site>
    <siteDefaults>
        <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
        <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
    </siteDefaults>
    <applicationDefaults applicationPool="DefaultAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

Uma regra de redirecionamento é configurada no web.config do site HTTP para rotear todo o tráfego para o site HTTPS e, posteriormente, fornece o conteúdo.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="https://contoso.com" httpResponseStatus="Permanent" />
    </system.webServer>
</configuration>

O cabeçalho STS pode ser adicionado por meio de cabeçalhos personalizados, configurando o web.config do site HTTPS.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

Solução 2: Módulo de Reescrita de URL

Uma solução alternativa é instalar o Módulo de Reescrita de URL e configurar regras de reescrita para um site individual com associações HTTP e HTTPS. O redirecionamento HTTP para HTTPS pode ser especificado por uma regra de entrada, ao mesmo tempo em que a adição do cabeçalho STS às respostas HTTPS pode ser obtida por uma regra de saída.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add the STS header in HTTPS responses">
                    <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

Suporte ao HSTS nativo do IIS 10.0 versão 1709

Com o lançamento do IIS 10.0 versão 1709, o HSTS já tem suporte nativo. A configuração para habilitar o HSTS foi consideravelmente simplificada: o HSTS pode ser habilitado no nível do site, configurando os atributos do elemento <hsts> em cada elemento <site>. Encontre mais detalhes na referência de configuração do HSTS Configurações do HSTS para um site <HSTS>.

O exemplo de cenário pode ser simplesmente alcançado com a configuração dos atributos enabled, max-age e redirectHttpToHttps do elemento <hsts> do site usando os cmdlets do PowerShell do IISAdministration seguindo o tutorial.

Import-Module IISAdministration
Reset-IISServerManager -Confirm:$false
Start-IISCommitDelay

$sitesCollection = Get-IISConfigSection -SectionPath "system.applicationHost/sites" | Get-IISConfigCollection
$siteElement = Get-IISConfigCollectionElement -ConfigCollection $sitesCollection -ConfigAttribute @{"name"="Contoso"}
$hstsElement = Get-IISConfigElement -ConfigElement $siteElement -ChildElementName "hsts"
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "enabled" -AttributeValue $true
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "max-age" -AttributeValue 31536000
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "redirectHttpToHttps" -AttributeValue $true

Stop-IISCommitDelay
Remove-Module IISAdministration

As configurações do HSTS para o site são mostradas abaixo:

<site name="Contoso" id="1">
    <application path="/" applicationPool="Contoso">
        <virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:80:contoso.com" />
        <binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
    </bindings>
    <hsts enabled="true" max-age="31536000" redirectHttpToHttps="true" />
</site>

O suporte nativo do HSTS também pode ser usado junto com o Módulo de Redirecionamento HTTP em cenários mais complexos.

Por exemplo, um site de contoso.com redireciona todo o tráfego para o subdomínio www.contoso.com e os dois sites aceitam conexões HTTP e HTTPS. Esse será um cenário típico se for preferível que o site tenha um só endereço canônico. Recomendamos que o HSTS seja habilitado para o domínio raiz e o subdomínio, pois os usuários podem visitar diretamente um deles via HTTP ou HTTPS. Habilitar o atributo includeSubDomains do elemento <hsts> do domínio raiz aprimora ainda mais a cobertura da política do HSTS para todos os respectivos subdomínios.

<sites>
    <site name="Contoso" id="1">
        <application path="/" applicationPool="Contoso">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:contoso.com" />
            <binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
        </bindings>
        <hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />
    </site>
    <site name="Contoso-www" id="2">
        <application path="/" applicationPool="Contoso-www">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-www" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:www.contoso.com" />
            <binding protocol="https" bindingInformation="*:443:www.contoso.com" sslFlags="0" />
        </bindings>
        <hsts enabled="true" max-age="31536000" redirectHttpToHttps="true" />
    </site>
    <siteDefaults>
        <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
        <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
    </siteDefaults>
    <applicationDefaults applicationPool="DefaultAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

Além disso, o redirecionamento do domínio raiz para o subdomínio pode ser configurado por meio do elemento <httpRedirect> do web.config do site de domínio raiz. Com essa configuração, uma solicitação HTTP para contoso.com primeiro será redirecionada para HTTPS e, em seguida, a solicitação HTTPS para o mesmo site será redirecionada para www.contoso.com, com o cabeçalho STS adicionado na resposta.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="https://www.contoso.com" httpResponseStatus="Permanent" />
    </system.webServer>
</configuration>

Os exemplos de configurações acima também se aplicam ao cenário de redirecionamento do tráfego de um site de origem para um site de destino que não é um subdomínio do site de origem, com uma pequena modificação de configuração de desabilitação de includeSubDomains no site de origem.