Vraag Schakel HTTP Strict Transport Security (HSTS) in IIS 7 in


Wat is de beste manier om in te schakelen HTTP Strict Transport Security op een IIS 7-webserver?

Kan ik gewoon de GUI doorlopen en de juiste HTTP-antwoordkop toevoegen of moet ik appcmd gebruiken en zo ja, welke switches?


69
2017-08-13 21:23


oorsprong


Veel hiervan hangt ervan af hoe u genereert het materiaal dat IIS gebruikt (u kunt bijvoorbeeld de header instellen op PHP- of ASP.NET-pagina's vanuit uw toepassing). Kun je ons meer vertellen over je use-case? - voretaq7


antwoorden:


IIS heeft de mogelijkheid om aangepaste headers aan reacties toe te voegen. Dit lijkt de eenvoudigste manier om dit aan te pakken.

Volgens de documentatie over IIS.net u kunt deze headers toevoegen via IIS Manager:

  • Ga in het deelvenster Verbindingen naar de site, toepassing of directory waarvoor u een aangepaste HTTP-header wilt instellen.
  • Dubbelklik in het deelvenster Thuis op HTTP-antwoordheaders.
  • Klik in het deelvenster HTTP-antwoordheaders op Toevoegen ... in het deelvenster Acties.
  • Stel in het dialoogvenster Aangepaste HTTP-reactiekoptekst toevoegen de naam en waarde in voor uw aangepaste koptekst en klik vervolgens op OK.

17
2017-08-13 21:37



Het is ook mogelijk om dit in Web.config te doen, wat u misschien de voorkeur geeft. Ik heb de details als een nieuw antwoord gepost, omdat ze echt moeilijk te lezen zijn zonder de broncode-opmaak die niet beschikbaar is in reacties. - Owen Blacker
Volgens de makers van HTTP Strict Transport Security IIS-module, alleen het toevoegen van de aangepaste koptekst voldoet niet aan de conceptspecificatie (RFC 6797). U zou deze IIS-module eigenlijk moeten installeren. - Chris
@Chris Ze zijn (nogal) fout. Niet over de specificatie - ze kloppen absoluut daar - maar over het feit dat er geen "eenvoudige" manier is om te voldoen aan hun module: maak gewoon 2 sites, één voor SSL (met de header) en één voor niet-SSL ( zonder de koptekst). Zeker, de module is iets meer elegant, maar het is niet noodzakelijk (en helemaal niet gegarandeerd als uw site alleen https is en u geen gewone HTTP-antwoorden aanbiedt). - voretaq7
@Chris Je zou een antwoord moeten toevoegen dat verwijst naar die module - gratis upvotes! (Ik was me niet bewust van het bestaan ​​ervan, en voor veel mensen is het waarschijnlijk een gemakkelijkere / betere optie dan de aangepaste header-dingen) - voretaq7


Hiermee kunnen we zowel de HTTP-omleiding verwerken als de Strict-Transport-Security-header toevoegen aan HTTPS-antwoorden met een enkele IIS-site (URL Rewrite-module moet worden geïnstalleerd):

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



Bedankt, dit is het beste antwoord! Voegt de header ook toe aan statische HTML-bestanden, in tegenstelling tot de programmatische aanpak. En voegt niet toe aan HTTP, dus conform de standaard. - Jeow Li Huan
Wanneer ik dit aan mijn <system.webServer> -sectie van web.config toevoeg, krijg ik een 500-fout op mijn asp.net-pagina's. Er lijkt geen <herschrijf> kind te zijn voor dit knooppunt (msdn.microsoft.com/en-us/library/ms689429.aspx). - Mathemats
@Mathemats Heeft u URL Rewrite geïnstalleerd in IIS? - Doug Wilson
Nee, na meer onderzoek kwam ik erachter dat de rewrite-tag wordt verstrekt door de extensie (d'oh). Alle antwoorden die ik kon vinden, vermelden de extensie niet als een afhankelijkheid, misschien kun je een voering in je antwoord gooien die zegt dat je het nodig hebt. - Mathemats
hstspreload.org wil dat de gebruiker `; includeSubDomains; voorspanning 'na de maximumleeftijdwaarde. opties. De volledige regel is: <action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" /> om een ​​te krijgen voorbij lopen op hstspreload.org - JP Hellemons


Aan te vullen voretaq7Het antwoord is dat u dit ook kunt doen met behulp van het bestand Web.config (NB: alleen voor SSL-sites, aangezien het de header voor zowel HTTP- als HTTPS-antwoorden zal toevoegen, wat in strijd is met de RFC 6797-specificatie, zie de onderstaande uitleg) - voeg een blok toe als volgt:

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

Het is duidelijk dat je misschien al een hebt system.webServer blokkeren in uw Web.config, dus voeg dit hieraan toe, als dat het geval is. Wij geven de voorkeur aan dingen in Web.config in plaats van de GUI, omdat dit betekent dat de configuratiewijzigingen kunnen worden vastgelegd in onze Git-repository.

Als u de HTTP-naar-SSL-omleiding wilde afhandelen, zoals Greg Askew vermeld, zou u het gemakkelijker kunnen vinden om dat te doen met een afzonderlijke website in IIS. Dit is hoe wij omgaan met het vereisen van SSL voor sommige klantensites. Die site bevat alleen een HTTP-omleiding en enkele vrijgeven van informatie fixes, allemaal in 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>

Dit is onze geprefereerde oplossing om een ​​aantal redenen - we kunnen omgeleide verkeer gemakkelijk loggen (zoals in een ander IIS-logboek), er is niet meer code bij betrokken in Global.asax.cs (we hebben geen code daarin, wat een beetje handiger is voor een Umbraco-site) en, belangrijker, dit betekent dat alle config nog steeds in onze GIT-repo wordt bewaard.

Bewerkt om toe te voegen: Voor de duidelijkheid, om te voldoen aan RFC 6797, de Strict-Transport-Security aangepaste koptekst MOET NIET worden toegevoegd aan verzoeken die zijn gedaan door niet-versleutelde HTTP. Om RFC6797-compatibel te zijn, MOET je twee sites hebben in IIS, zoals ik heb beschreven na het eerste codeblok. Zoals Chris wijst erop dat RFC 6797 het volgende omvat:

Een HSTS-host MOET NIET omvat het STS-headerveld in HTTP-responsen die worden overgedragen via niet-beveiligd transport.

dus stuur het Strict-Transport-Security klant header in reactie op een niet-SSL-verzoek niet zou voldoen aan de specificatie.


36
2018-03-20 15:06



Om aan het antwoord van Owen Blacker toe te voegen, gebruik ik voor IIS URLScan 3.1 en laat ik de SERVER globaal verwijderen uit het antwoord door RemoveServerHeader = 1 in te stellen, de rest van de instellingen hebben opdracht gekregen om in elk web.config-websitebestand te staan. Ik geef er de voorkeur aan om de waarde gewoon weg te werken. - KeyOfJ
URLScan is een veel voorkomende oplossing en, ik zou willen voorstellen, een betere dan degene die ik voorstel. Maar het is niet altijd de handigste oplossing: o) - Owen Blacker
Belangrijk om op te merken dat als je dit toevoegt aan een site met HTTPS en HTTP ingeschakeld (dus het kan omleiden) de site BREAK! Je krijgt een informationless 500, zelfs met CustomErrors Mode = "Off", zonder fouten in de logs. - Chris Moschini
@ChrisMoschini Ik had beter moeten weten dat de eerste Web.config-regel zou moeten zijn voor een SSL-site. - Owen Blacker
Waarom is Strict-Transport-Security niet toegestaan ​​in niet-SSL? Het zou een indicator zijn voor de browser om naar https te gaan. Een bug in de specificatie of is er een specifieke reden? - Lenne


Ik zou het voorbeeld van de Wikipedia-link gebruiken waarnaar u verwijst en de activiteit uitvoeren op global.asax voor de site. Hierdoor kan het verzoek worden omgeleid naar een https-URL, en dan plaats de header in het antwoord.

Dit komt omdat de HSTS-header moet worden genegeerd als deze geen https-reactie bevat.

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





Dit lijkt een behoorlijk faalveilige manier om dit te doen. Voeg deze code toe aan Global.asax: de Application_BeginRequest-gebeurtenis wordt eerst geactiveerd in de levenscyclus van Asp.net-aanvragen: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs.110).aspx

Per de specificatie moeten http-verzoeken niet reageren met de header - dus deze code voegt deze alleen toe voor https-aanvragen. Max-leeftijd is in seconden, en het is meestal een goed idee om hier een grote waarde in te zetten (IE - 31536000 geeft aan dat de site alleen gedurende de volgende 365 dagen SSL zal gebruiken)

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





Volgens de makers van de HTTP Strict Transport Security IIS-module voldoet het toevoegen van de aangepaste koptekst niet aan de conceptspecificatie (RFC 6797).

U zou dit eigenlijk moeten installeren IIS-module om HSTS op IIS 7 in te schakelen.

Update 26 okt 2014: Dankzij de commentator hieronder, las ik de modulepagina opnieuw en specifiek het deel dat het gebruik van de module rechtvaardigt ten opzichte van het toevoegen van aangepaste headers.

Een HSTS-host MAG NIET het STS-headerveld opnemen in HTTP-responsen die worden overgedragen via niet-beveiligd transport.

Als u ervoor zorgt dat u de headers alleen in HTTPS en NIET in HTTP toevoegt, hebt u deze module niet nodig en kunt u het antwoord van Doug Wilson gebruiken. Gebruik het antwoord van Owen Blacker niet omdat het niet de https-voorwaarde heeft.


1
2018-03-03 21:14



Dus lossen sommige van de andere antwoorden die alleen de header naar HTTPS-verzoeken sturen ook dit probleem op? Of doet jouw module iets anders / extras dan de andere oplossingen niet? - slolife
@slolife Ik heb mijn antwoord bijgewerkt. Je kunt de code gebruiken in het antwoord van Doug Wilson. U hebt deze module niet nodig. Ik zie nu dat dit ook wordt besproken in de opmerkingen van het geaccepteerde antwoord. Ik ben me niet bewust van het feit dat deze module iets anders / extras doet dan de andere oplossingen niet. Maar ik heb nog geen volledige controle van de broncode een van beide. - Chris
Ik had beter moeten weten dat de eerste Web.config zou moeten worden geïmplementeerd in een SSL-site. Ik zal mijn antwoord aanpassen om dat te verduidelijken. - Owen Blacker


Aan de hand van het voorbeeld van Doug Wilson heb ik de volgende twee PowerShell-functies gemaakt om url-herschrijfregels toe te voegen voor doorverwijzing naar HTTPS en voor het toevoegen van HSTS-headers.

Deze zijn getest op Windows 2012 en Windows 2012 R2.

Het enige wat u hoeft te doen is de naam van de website vermelden. Je kunt de regels optioneel een andere naam geven als je de standaardwaarden niet waardeert.

Een ding om op te merken is dat de Server Variables van mijn tests moeten worden toegevoegd aan de lijst met toezeggingen voordat ze zich in de antwoordheaders bevinden. De functies doen dit voor u.

BEWERK: Zie de referentie op URL herschrijven voor HTTP-headers hier: 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





Dit kan gedaan worden door het volgende blok toe te voegen in Web.Config:                                 

We moeten configureren op IIS dat de mogelijkheid heeft om aangepaste headers om te reageren:

  • Ga naar IIS-manager (Internet Information Services).
  • Configureer Response-headers die zijn toegevoegd aan het antwoord van de server.
  • Voeg nu uw aangepaste koptekstnaam en aangepaste waarde toe (aangepaste koptekstnaam en waarde moeten dezelfde zijn als die in Web.Config). U kunt vinden op blog

0
2017-12-15 13:39