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.