Question Activer la sécurité du transport strict HTTP (HSTS) dans IIS 7


Quel est le meilleur moyen d'allumer HTTP Strict Transport Security sur un serveur Web IIS 7?

Puis-je utiliser l'interface graphique et ajouter l'en-tête de réponse HTTP approprié ou devrais-je utiliser appcmd et si oui, quels commutateurs?


69
2017-08-13 21:23


origine


Cela dépend en grande partie Comment vous générez le contenu servi par IIS (par exemple. vous pouvez définir l'en-tête dans les pages PHP ou ASP.NET à partir de votre application). Pouvez-vous nous en dire plus sur votre cas d'utilisation? - voretaq7


Réponses:


IIS a la possibilité d'ajouter des en-têtes personnalisés aux réponses. Cela semblerait être le moyen le plus facile de s'y prendre.

Selon la documentation sur IIS.net vous pouvez ajouter ces en-têtes via le gestionnaire IIS:

  • Dans le volet Connexions, accédez au site, à l'application ou au répertoire pour lequel vous souhaitez définir un en-tête HTTP personnalisé.
  • Dans le volet Accueil, double-cliquez sur En-têtes de réponse HTTP.
  • Dans le volet En-têtes de réponse HTTP, cliquez sur Ajouter ... dans le volet Actions.
  • Dans la boîte de dialogue Ajouter un en-tête de réponse HTTP personnalisé, définissez le nom et la valeur de votre en-tête personnalisé, puis cliquez sur OK.

17
2017-08-13 21:37



Il est également possible de le faire dans le fichier Web.config, ce que vous préférez peut-être. J'ai posté les détails comme une nouvelle réponse, car ils seraient très difficiles à lire sans le formatage du code source qui n'est pas disponible dans les commentaires. - Owen Blacker
Selon les fabricants de Module IIS de sécurité du transport strict HTTP, le simple ajout de l'en-tête personnalisé n'est pas conforme à la spécification préliminaire (RFC 6797). Vous auriez réellement besoin d'installer ce module IIS. - Chris
@ Chris Ils ont (un peu) tort. Pas à propos de la spécification - ils sont absolument corrects là-bas - mais à propos du fait qu’il n’existe pas de moyen "simple" de se conformer à ce module: il suffit de créer 2 sites, un pour SSL (avec l’en-tête) et un pour non-SSL ( sans en-tête). Certainement le module est un peu plus élégant, mais ce n'est pas nécessaire (et pas du tout garanti si votre site est uniquement https et que vous ne fournissez pas de réponses HTTP simples). - voretaq7
@Chris Vous devez cependant ajouter une réponse référençant ce module - upvotes gratuits! (Je n'étais pas au courant de son existence et pour beaucoup de gens, c'est probablement une option plus facile / meilleure que l'en-tête personnalisé) - voretaq7


Cela nous permet de gérer à la fois la redirection HTTP et l'ajout de l'en-tête Strict-Transport-Security aux réponses HTTPS avec un seul site IIS (le module URL Rewrite doit être installé):

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

102
2017-09-18 17:05



Merci, c'est la meilleure réponse! Ajoute également l'en-tête aux fichiers HTML statiques, contrairement à l'approche programmatique. Et n'ajoute pas à HTTP, se conformant ainsi à la norme. - Jeow Li Huan
Lorsque j'ajoute ceci à ma section <system.webServer> de web.config, l'erreur 500 s'affiche sur mes pages asp.net. Il ne semble pas y avoir d’enfant <rewrite> pour ce noeud (msdn.microsoft.com/en-us/library/ms689429.aspx). - Mathemats
@Mathemats Avez-vous URL Rewrite installé dans IIS? - Doug Wilson
Non, après d'autres recherches, j'ai découvert que la balise de réécriture est fournie par l'extension (d'oh). Toutes les réponses que je pourrais trouver ne mentionnent pas l'extension en tant que dépendance, vous pourriez peut-être ajouter une ligne à votre réponse en disant que vous en avez besoin. - Mathemats
hstspreload.org veut que l'utilisateur ajoute `; includeSubDomains; précharge` après la valeur maximale. options. La ligne complète sera: <action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" /> pour obtenir un passer sur hstspreload.org - JP Hellemons


Pour compléter voretaq7Vous pouvez également le faire en utilisant le fichier Web.config (NB: à utiliser uniquement pour les sites SSL, car il ajoutera l'en-tête des réponses HTTP et HTTPS, ce qui correspond à la spécification RFC 6797. explication ci-dessous) - ajoutez un bloc comme suit:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000"/>
        </customHeaders>
    </httpProtocol>
</system.webServer>

De toute évidence, vous avez peut-être déjà un system.webServer bloquer dans votre Web.config, alors ajoutez ceci à cela, si c'est le cas. Nous préférons gérer les éléments dans le fichier Web.config plutôt que dans l'interface graphique, car cela signifie que les modifications de configuration peuvent être validées dans notre référentiel Git.

Si vous souhaitez gérer la redirection HTTP vers SSL, procédez comme suit: Greg Askew mentionné, vous trouverez peut-être plus facile de le faire avec un site Web distinct dans IIS. C’est ainsi que nous traitons l’exigence de SSL pour certains sites clients. Ce site contient uniquement une redirection HTTP et certaines divulgation d'information correctifs, tous dans le Web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <httpRuntime requestValidationMode="2.0" enableVersionHeader="false" />
  </system.web>
  <system.webServer>
    <httpRedirect enabled="true" destination="https://www.domain.co.uk/"
      httpResponseStatus="Permanent" />
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
    <rewrite>
      <outboundRules>
        <rule name="Remove RESPONSE_Server">
          <match serverVariable="RESPONSE_Server" pattern=".+" />
          <action type="Rewrite" value="" />
        </rule>
      </outboundRules>
    </rewrite>
  </system.webServer>
</configuration>

Ceci est notre solution préférée pour plusieurs raisons: nous pouvons facilement enregistrer le trafic redirigé séparément (comme il se trouve dans un journal IIS différent), cela n'implique pas plus de code dans Global.asax.cs (nous n'avons aucun code ce qui est un peu plus pratique pour un site Umbraco) et, ce qui est important, cela signifie que toute la configuration est toujours conservée dans notre repo GIT.

Édité pour ajouter: Pour être clair, afin de se conformer à RFC 6797, la Strict-Transport-Security en-tête personnalisé NE DOIT PAS être ajouté aux demandes faites par HTTP non crypté. Pour être conforme à RFC6797, vous DEVEZ avoir deux sites dans IIS, comme je l’ai décrit après le premier bloc de code. Comme Chris souligne que la RFC 6797 comprend:

Un hôte HSTS NE DOIT PAS inclure le champ d'en-tête STS dans les réponses HTTP acheminées via un transport non sécurisé.

donc envoyer le Strict-Transport-Security l'en-tête du client en réponse à une demande non-SSL ne serait pas conforme à la spécification.


36
2018-03-20 15:06



Pour ajouter à la réponse Owen Blacker, pour IIS, j'utilise URLScan 3.1 et le supprime globalement du SERVEUR de la réponse en définissant RemoveServerHeader = 1, le reste des paramètres doit obligatoirement figurer dans le fichier web.config de chaque site. Je préfère ceci à la suppression de la valeur. - KeyOfJ
URLScan est une solution très courante et, à mon avis, meilleure que celle que je suggère. Mais ce n’est pas toujours la solution la plus pratique: o) - Owen Blacker
Il est important de noter que l'ajout de cela à un site avec HTTPS et HTTP activé (afin qu'il puisse rediriger) va CASSER le site! Vous obtiendrez un 500 sans information, même avec CustomErrors Mode = "Off", sans erreur dans les journaux. - Chris Moschini
@ChrisMoschini J'aurais dû être plus clair sur le fait que la première ligne de Web.config devrait être destinée à un site exclusivement SSL. - Owen Blacker
Pourquoi Strict-Transport-Security n'est-il pas autorisé en non-SSL? Ce serait un indicateur pour le navigateur de passer à https. Un bogue dans la spécification, ou y a-t-il une raison spécifique? - Lenne


J'utiliserais l'exemple du lien Wikipedia que vous avez référencé et effectuerais l'activité dans global.asax pour le site. Cela permet de rediriger la demande vers une URL https, et puis insérez l'en-tête dans la réponse.

Cela est dû au fait que l'en-tête HSTS doit être ignoré s'il ne fait pas partie d'une réponse https.

protected void Application_BeginRequest()
{
    switch (Request.Url.Scheme)
    {
        case "https":
            Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
            break;
        case "http":
            var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location", path);
            break;
    }
}

8
2017-08-13 23:40





Cela semble être un moyen assez sûr de le faire. Ajoutez ce code dans le fichier Global.asax - l'événement Application_BeginRequest est déclenché en premier dans le cycle de vie de la demande Asp.net: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs.110).aspx

Selon la spécification, les demandes http ne doivent pas répondre avec l'en-tête - ce code l'ajoute donc uniquement aux demandes https. Max-age est un nombre de secondes, et c'est généralement une bonne idée de mettre une valeur importante ici (IE - 31536000 indique que le site ne fonctionnera avec SSL que pendant les 365 prochains jours)

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  switch (Request.Url.Scheme)
  {
    case "https":
      Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
      break;
    case "http":
      var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", path);
      break;
  }
}

3
2018-03-20 03:20





Selon les fabricants du module HTTP Strict Transport Security IIS, le simple ajout de l'en-tête personnalisé n'est pas conforme à la spécification provisoire (RFC 6797).

Vous auriez réellement besoin d’installer ce Module IIS activer HSTS sur IIS 7.

Mise à jour 26 octobre 2014: Grâce au commentaire ci-dessous, j'ai relu la page du module et plus particulièrement la partie qui justifie l'utilisation du module par l'ajout d'en-têtes personnalisés.

Un hôte HSTS NE DOIT PAS inclure le champ d'en-tête STS dans les réponses HTTP acheminées via un transport non sécurisé.

Si vous veillez à ajouter les en-têtes uniquement dans HTTPS et PAS dans HTTP, vous n'avez pas besoin de ce module et vous pouvez utiliser la réponse de Doug Wilson. N'utilisez pas la réponse d'Owen Blacker car il n'a pas la condition https.


1
2018-03-03 21:14



Ainsi, certaines des autres réponses qui envoient uniquement l'en-tête aux demandes HTTPS résolvent-elles également ce problème? Ou bien votre module fait-il quelque chose de différent / extra que les autres solutions ne font pas? - slolife
@slolife j'ai mis à jour ma réponse. Vous pouvez utiliser le code dans la réponse de Doug Wilson. Vous n'avez pas besoin de ce module. Je vois maintenant que cela est également discuté dans les commentaires de la réponse acceptée. Je ne suis pas au courant que ce module fasse quelque chose de différent / extra que les autres solutions ne le font pas. Mais je n’ai pas fait de vérification exhaustive de la code source non plus. - Chris
J'aurais dû être plus clair sur le fait que le premier Web.config devrait être implémenté dans un site exclusivement SSL. Je vais modifier ma réponse pour clarifier cela. - Owen Blacker


À l'aide de l'exemple fourni par Doug Wilson, j'ai créé les deux fonctions PowerShell suivantes pour ajouter des règles de réécriture d'URL pour la redirection vers HTTPS et pour l'ajout d'en-têtes HSTS.

Celles-ci ont été testées sur Windows 2012 et Windows 2012 R2.

Tout ce que vous avez à faire est de fournir le nom du site. Vous pouvez éventuellement donner un nom différent aux règles si vous n'aimez pas les valeurs par défaut.

Une chose à noter est que, d'après mes tests, les variables serveur doivent être ajoutées à la liste des autorisations avant de figurer dans les en-têtes de réponse. Les fonctions le font pour vous.

MODIFIER: Voir la référence sur Url Rewrite pour les en-têtes HTTP ici: http://www.iis.net/learn/extensions/url-rewrite-module/setting-http-request-headers-and-iis-server-variables

Function Add-HTTPSRedirectRewriteRule()
{
    <#
        .SYNOPSIS
        This function is used to create a URL Rewrite Rule that redirects HTTP requests to HTTPS using a 301
        RuleName is optional and will default to "Redirect to HTTPS"

        .SYNTAX
        Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com"

        .EXAMPLES
        Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com"

        Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com" -RuleName "my rule name"

    #>


    [cmdletbinding(positionalbinding=$false)]
    Param
    (
        [parameter(mandatory=$true)][String] [ValidateNotNullOrEmpty()] $WebsiteName,
        [parameter(mandatory=$false)][String] $RuleName="Redirect to HTTPS"
    )

        Write-Verbose -Message "Creating the Url Rewrite rule ""$RuleName"" in website ""$WebsiteName"""
        Remove-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/rules" -name "." -AtElement @{name="$RuleName"}  -ErrorAction SilentlyContinue
        Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules" -name "." -value @{name="$RuleName";stopProcessing='True'}
        Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/match" -name "url" -value "(.*)"
        Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/conditions" -name "." -value @{input='{HTTPS}';pattern='off'}
        Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/action" -name "type" -value "Redirect"
        Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/action" -name "url" -value "https://{HTTP_HOST}/{R:1}"
}

Function Add-HSTSHeaderRewriteRule()
{
    <#
        .SYNOPSIS
        This function is used to create a URL Rewrite Rule that sets an HTTP Response Header for Strict-Transport-Security
        when the protocol requested is HTTPS

        RuleName is optional and will default to "Add Strict-Transport-Security header when request is HTTPS"

        .SYNTAX
        Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com"

        .EXAMPLES
        Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com"

        Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com" -RuleName "my rule name"

    #>

    [cmdletbinding(positionalbinding=$false)]
    Param
    (
        [parameter(mandatory=$true)][String] [ValidateNotNullOrEmpty()] $WebsiteName,
        [parameter(mandatory=$false)][String]$RuleName="Add Strict-Transport-Security header when request is HTTPS"
    )

    $serverVariable = "RESPONSE_Strict_Transport_Security"

    Write-Verbose -Message "Creating the HSTS Header rule ""$RuleName"" in website ""$WebsiteName"""

    Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/allowedServerVariables" -name "." -AtElement @{name="$serverVariable"} -ErrorAction SilentlyContinue
    Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName"  -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name="$serverVariable"}

    Remove-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -name "." -filter "system.webServer/rewrite/outboundRules" -AtElement @{name="$RuleName"} -ErrorAction SilentlyContinue

    Add-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules" -name "." -value @{name="$RuleName"}
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/match" -name "serverVariable" -value $serverVariable
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/match" -name "pattern" -value ".*"
    Add-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/conditions" -name "." -value @{input='{HTTPS}';pattern='on'}
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/action" -name "type" -value "Rewrite"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/action" -name "value" -value "max-age=31536000"

}

1
2018-02-04 16:51





Cela peut être fait en ajoutant le bloc suivant dans Web.Config:                                 

Nous devons configurer sur IIS qui a la capacité de personnaliser les en-têtes pour répondre:

  • Accédez au Gestionnaire des services Internet (IIS).
  • Configurez les en-têtes de réponse ajoutés à la réponse du serveur.
  • Ajoutez maintenant votre nom d’en-tête personnalisé et votre valeur personnalisée (le nom et la valeur de l’en-tête personnalisé doivent être identiques à ceux de Web.Config). Vous pouvez trouver sur Blog

0
2017-12-15 13:39