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 ?

2voto

mel Points 1

En utilisant 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 ajouter des en-têtes HSTS.

Ils ont été testés sur Windows 2012 et Windows 2012 R2.

Il vous suffit de fournir le nom du site web. 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 du serveur doivent être ajoutées à la liste des éléments autorisés avant de figurer dans les en-têtes de réponse. Les fonctions le font pour vous.

EDIT : Voir la référence sur Url Rewrite for HTTP Headers 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"

}

1voto

Chris Points 478

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

Vous devez en fait installer ce Module IIS pour activer le HSTS sur IIS 7.

Mise à jour du 26 octobre 2014 : Grâce au commentateur ci-dessous, j'ai relu la page du module et plus particulièrement la partie qui justifie l'utilisation du module par rapport à 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 par un transport non sécurisé.

Si vous vous assurez d'ajouter les en-têtes uniquement en HTTPS et NON en 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 elle n'a pas la condition https.

1voto

william_grisaitis Points 101

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

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name ="CustomName" value="MyCustomValue"/>
      </customHeaders>
    </httpProtocol>
</system.webServer>

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

  • Allez dans Internet Information Services (IIS) Manager.
  • Configurer les en-têtes de réponse qui sont ajoutés à la réponse du serveur.
  • Maintenant, ajoutez 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 les mêmes que dans Web.Config). Vous pouvez trouver sur blog

0voto

tony Points 101

Juste pour ajouter, je vois dans les commentaires 2 personnes parlant d'erreurs 500 lorsque vous faites cela. J'avais ça.

Si vous obtenez une erreur 500 dans IIS, c'est peut-être parce que vous avez ajouté la règle à la fois au niveau supérieur, définie comme héritée, et au niveau du site.

par exemple

Default Web Site <- here
  Some Web Site <- here

IIS/The Browser ne semble pas vous indiquer que vous avez effectué cette opération, quels que soient vos paramètres de gestion des erreurs.

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