Supporto di IIS 10.0 versione 1709 HTTP Strict Transport Security (HSTS)

di Yanbing Shi

In IIS 10.0 versione 1709, l'amministratore ha la possibilità di abilitare il reindirizzamento da HSTS e HTTP a HTTPS a livello di sito.

Compatibilità

Versione Note
IIS 10.0 versione 1709 Le funzionalità descritte in questo articolo sono state introdotte in IIS 10.0 versione 1709
IIS 10.0 e versioni precedenti Le funzionalità descritte in questo articolo non sono supportate prima di IIS 10.0 versione 1709

Protocollo HTTP Strict Transport Security (HSTS)

HTTP Strict Transport Security (HSTS), specificato in RFC 6797, consente a un sito Web di dichiararsi come host sicuro e di informare i browser che devono essere contattati solo tramite connessioni HTTPS. HSTS è un miglioramento della sicurezza di consenso esplicito che applica HTTPS e riduce significativamente la capacità di attacchi man-in-the-middle per intercettare richieste e risposte tra server e client.

HSTS applica l'uso di HTTPS tramite un criterio che richiede il supporto da server Web e browser. Un host Web abilitato per HSTS può includere una speciale intestazione di risposta HTTP "Strict-Transport-Security" (STS) insieme a una direttiva "max-age" in una risposta HTTPS per richiedere al browser di usare HTTPS per ulteriori comunicazioni. Il browser riceve l'intestazione e memorizza i criteri HSTS per il numero di secondi specificato dalla direttiva "max-age". Entro questo periodo, se un utente tenta di visitare lo stesso sito Web, ma digita http:// o omette lo schema, il browser trasformerà automaticamente il collegamento non sicuro a quello sicuro (https://) e stabilire una connessione HTTPS al server. Una volta ricevuta una risposta tramite HTTPS, il browser impedisce inoltre all'utente di fare clic su qualsiasi avviso di sicurezza, ad esempio un avviso relativo a un certificato server non valido. Per sfruttare i vantaggi di HSTS, il browser deve visualizzare almeno una volta l'intestazione HSTS. Per proteggere l'utente nella prima connessione a un determinato dominio, HSTS dispone di un meccanismo separato per precaricare un elenco di domini registrati nel browser predefinito.

Problemi relativi all'abilitazione di HSTS prima di IIS 10.0 versione 1709

Prima di IIS 10.0 versione 1709, l'abilitazione di HSTS in un server IIS richiede una configurazione complessa.

Per uno scenario di esempio vengono fornite due soluzioni per abilitare HSTS prima di IIS 10.0 versione 1709: l'amministratore Web vuole abilitare HSTS per un dominio contoso.com che accetta connessioni HTTP e HTTPS e reindirizzare tutto il traffico HTTP a HTTPS. Il reindirizzamento in questo scenario non è sicuro per natura, ma è comunque un modello seguito da molti siti Web che supportano HTTPS. Il motivo fondamentale per cui è ancora in ascolto HTTP è che il sito Web non ha alcun controllo sul modo in cui i visitatori possono provare a connetterlo, tramite HTTPS o semplicemente HTTP normale. L'abilitazione di HSTS riduce notevolmente il numero di reindirizzamenti HTTP a HTTPS non sicuri in condizione che il browser visualizzi l'intestazione STS durante la prima connessione HTTPS riuscita (tramite visita diretta o tramite reindirizzamento).

Soluzione 1: Modulo di reindirizzamento HTTP e intestazioni personalizzate

Il reindirizzamento di tutto il traffico HTTP a HTTPS può essere ottenuto usando il modulo di reindirizzamento HTTP con due siti Web separati, uno per HTTP e l'altro per HTTPS, per evitare un ciclo di reindirizzamento 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>

Una regola di reindirizzamento viene configurata nella web.config del sito HTTP per instradare tutto il traffico al sito HTTPS e in seguito gestisce effettivamente il contenuto.

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

L'intestazione STS può essere aggiunta tramite intestazioni personalizzate configurando il web.config del sito 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>

Soluzione 2: Modulo di riscrittura URL

Una soluzione alternativa consiste nell'installare il modulo di riscrittura URL e configurare le regole di riscrittura per un singolo sito Web con associazioni HTTP e HTTPS. Il reindirizzamento DA HTTP a HTTPS può essere specificato da una regola in ingresso durante l'aggiunta dell'intestazione STS alle risposte HTTPS tramite una regola in uscita.

<?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>

Supporto HSTS nativo di IIS 10.0 versione 1709

Con il rilascio di IIS 10.0 versione 1709, HSTS è ora supportato in modo nativo. La configurazione per l'abilitazione di HSTS è notevolmente semplificata. È possibile abilitare HSTS a livello di sito configurando gli attributi dell'elemento <hsts> in ogni <site> elemento. Altri dettagli sono disponibili nel riferimento alla configurazione delle impostazioni HSTS HSTS per un HSTS> sito <Web.

Lo scenario di esempio può essere ottenuto semplicemente configurando gli enabledattributi , max-agee redirectHttpToHttps dell'elemento <hsts> del sito Web usando i cmdlet di PowerShell IISAdministration seguendo l'esercitazione.

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

Di seguito sono riportate le configurazioni HSTS per il sito Web:

<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>

Il supporto nativo di HSTS può essere usato anche insieme al modulo di reindirizzamento HTTP per scenari più complessi.

Ad esempio, un sito Web contoso.com reindirizza tutto il traffico al sottodominio www.contoso.come entrambi i siti Web accettano connessioni HTTP e HTTPS. Si tratta di uno scenario tipico se il sito Web è preferibile avere un singolo indirizzo canonico. È consigliabile abilitare HSTS sia per il dominio radice che per il sottodominio, perché gli utenti possono visitare direttamente uno tramite HTTP o HTTPS. L'abilitazione includeSubDomains dell'attributo dell'elemento <hsts> del dominio radice migliora ulteriormente la copertura dei criteri HSTS a tutti i relativi sottodomini.

<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>

Inoltre, il reindirizzamento dal dominio radice al sottodominio può essere configurato tramite l'elemento <httpRedirect> nel web.config del sito di dominio radice. Con tale configurazione, una richiesta HTTP a contoso.com verrà prima reindirizzata a HTTPS e quindi la richiesta HTTPS allo stesso sito verrà reindirizzata a www.contoso.com con l'intestazione STS aggiunta nella risposta.

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

Le configurazioni di esempio precedenti si applicano anche allo scenario di reindirizzamento del traffico da un sito di origine a un sito di destinazione che non è un sottodominio del sito di origine, con una modifica secondaria della configurazione della disabilitazione includeSubDomains per il sito di origine.