80 votes

Activer HTTP Strict Transport Security (HSTS) dans IIS 7

Quelle est la meilleure façon d'allumer Sécurité du transport HTTP Strict sur un serveur web IIS 7 ?

Puis-je simplement passer par l'interface graphique et ajouter le bon en-tête de réponse HTTP ou dois-je utiliser appcmd et si oui, quels commutateurs ?

123voto

Doug Wilson Points 1283

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}{REQUEST_URI}"
                        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; includeSubDomains; preload" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

40voto

Owen Blacker Points 631

Pour compléter voretaq7 Vous pouvez également le faire en utilisant le fichier Web.config (N.B. : à utiliser uniquement pour les sites SSL, car il ajoutera l'en-tête pour les réponses HTTP et HTTPS, ce qui est contraire à la spécification RFC 6797, voir l'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>

Évidemment, vous avez peut-être déjà un system.webServer dans votre Web.config, alors ajoutez ceci à ce bloc, si c'est le cas. Nous préférons gérer les choses dans le Web.config plutôt que dans l'interface graphique, car cela signifie que les modifications de la configuration peuvent être validées dans notre dépôt Git.

Si vous vouliez gérer la redirection HTTP vers SSL, en tant que Greg Askew mentionné, vous pourriez trouver plus facile de le faire avec un site web séparé dans IIS. C'est ainsi que nous gérons l'obligation de SSL pour certains sites clients. Ce site ne contient qu'une redirection HTTP et un peu de information-divulgation des corrections, le tout 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>

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

Modifié pour ajouter : Pour être clair, afin de se conformer à RFC 6797 le Strict-Transport-Security en-tête personnalisé NE DOIT PAS être ajouté aux demandes faites par HTTP non crypté. Pour être conforme à la 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 par un transport non sécurisé.

donc envoyer le Strict-Transport-Security en réponse à une demande non-SSL ne serait pas conforme à la spécification.

17voto

voretaq7 Points 78924

IIS a la possibilité d'ajouter des en-têtes personnalisés aux réponses . Cela semble être la façon la plus simple de procéder.

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

  • 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 d'accueil, double-cliquez sur HTTP Response Headers.
  • Dans le volet HTTP Response Headers, cliquez sur Add... 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.

9voto

Thecamelcoder Points 11

J'utiliserais l'exemple du lien Wikipedia que vous avez référencé et j'exécuterais l'activité dans global.asax pour le site. Cela permet de rediriger la demande vers une url https, et puis insérer 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 se trouve pas dans 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;
    }
}

3voto

erbz Points 53

Cela semble être un moyen assez sûr de le faire. Ajoutez ce code dans le fichier Global.asax - l'événement Application_BeginRequest se déclenche 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 requêtes http ne doivent pas répondre avec l'en-tête - donc ce code ne l'ajoute que pour les requêtes https. Max-age est en nombre de secondes, et c'est généralement une bonne idée de mettre une grande valeur ici (par exemple, 31536000 indique que le site fonctionnera uniquement en SSL 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;
  }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X