it-swarm.com.de

Aktivieren Sie HTTP Strict Transport Security (HSTS) in IIS 7

Was ist der beste Weg, um HTTP Strict Transport Security auf einem IIS 7-Webserver) einzuschalten?

Kann ich einfach über die GUI den richtigen HTTP-Antwortheader hinzufügen oder sollte ich appcmd verwenden und wenn ja, welche Schalter?

77
Bob

IIS hat die Fähigkeit, benutzerdefinierte Header zu Antworten hinzuzufügen . Dies scheint der einfachste Weg zu sein.

Gemäß der Dokumentation zu IIS.net können Sie diese Header über IIS Manager:

  • Wechseln Sie im Bereich Verbindungen zu der Site, Anwendung oder dem Verzeichnis, für die Sie einen benutzerdefinierten HTTP-Header festlegen möchten.
  • Doppelklicken Sie im Bereich Start auf HTTP-Antwortheader.
  • Klicken Sie im Bereich HTTP-Antwortheader im Bereich Aktionen auf Hinzufügen.
  • Legen Sie im Dialogfeld Benutzerdefinierten HTTP-Antwortheader hinzufügen den Namen und den Wert für Ihren benutzerdefinierten Header fest und klicken Sie dann auf OK.
17
voretaq7

Auf diese Weise können wir sowohl die HTTP-Umleitung als auch den Strict-Transport-Security-Header zu HTTPS-Antworten mit einer einzigen IIS Site) (URL Rewrite-Modul muss installiert sein):

<?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>
116
Doug Wilson

Um die Antwort von voretaq7 zu ergänzen, können Sie dies auch mit der Datei Web.config tun (Hinweis: Nur für SSL-Sites zu verwenden, da hier der Header für HTTP- und HTTPS-Antworten hinzugefügt wird verstößt gegen die RFC 6797-Spezifikation (siehe Erklärung unten) - fügen Sie einen Block wie folgt hinzu:

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

Offensichtlich haben Sie möglicherweise bereits ein system.webServer Block in Ihrer Web.config, fügen Sie dies dem hinzu, wenn ja. Wir bevorzugen es, Dinge in der Web.config anstatt in der GUI zu behandeln, da dies bedeutet, dass die Konfigurationsänderungen in unser Git-Repository übernommen werden können.

Wenn Sie die HTTP-zu-SSL-Umleitung wie Greg Askew erwähnt behandeln möchten, ist es möglicherweise einfacher, dies mit einer separaten Website in IIS zu tun. So behandeln wir das Erfordernis von SSL für einige Client-Standorte. Diese Site enthält nur eine HTTP-Weiterleitung und einige Information-Disclosure Fixes, alle in der 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>

Dies ist aus mehreren Gründen unsere bevorzugte Lösung. Wir können umgeleiteten Datenverkehr problemlos separat protokollieren (da er sich in einem anderen IIS -Protokoll) befindet, enthält er keinen weiteren Code in Global.asax. cs (wir haben dort keinen Code, was für eine Umbraco-Site etwas praktischer ist) und vor allem bedeutet dies, dass die gesamte Konfiguration noch in unserem GIT-Repo gespeichert ist.

Bearbeitet, um Folgendes hinzuzufügen: Um klar zu sein, um RFC 6797 , das Strict-Transport-Security Benutzerdefinierter Header DARF NICHT zu Anforderungen hinzugefügt werden, die von unverschlüsseltem HTTP gestellt werden. Um RFC6797-kompatibel zu sein, MÜSSEN Sie zwei Standorte in IIS haben, wie ich nach dem ersten Codeblock beschrieben habe. Wie Chris hervorhebt, enthält RFC 6797:

Ein HSTS-Host DARF NICHT enthält das STS-Headerfeld in HTTP-Antworten, die über einen nicht sicheren Transport übertragen werden.

also senden Sie die Strict-Transport-Security Der Kundenheader als Antwort auf eine Nicht-SSL-Anfrage würde der Spezifikation nicht entsprechen.

40
Owen Blacker

Ich würde das Beispiel aus dem Wikipedia-Link verwenden, auf den Sie verwiesen haben, und die Aktivität in global.asax für die Site ausführen. Dies ermöglicht das Umleiten der Anforderung an eine https-URL und dann Einfügen des Headers in die Antwort.

Dies liegt daran, dass der HSTS-Header ignoriert werden muss, wenn er nicht in einer https-Antwort enthalten ist.

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;
    }
}
9
Greg Askew

Dies scheint ein ziemlich ausfallsicherer Weg zu sein. Fügen Sie diesen Code in Global.asax hinzu. Das Application_BeginRequest-Ereignis wird zuerst im Asp.net-Anforderungslebenszyklus ausgelöst: http://msdn.Microsoft.com/en-us/library/system.web.httpapplication.beginrequest ( v = vs.110) .aspx

Gemäß der Spezifikation dürfen http-Anforderungen nicht mit dem Header antworten. Dieser Code fügt ihn daher nur für https-Anforderungen hinzu. Das maximale Alter wird in Sekunden angegeben, und es ist normalerweise eine gute Idee, hier einen großen Wert einzugeben (IE - 31536000 gibt an, dass auf der Site SSL nur für die nächsten 365 Tage ausgeführt wird).

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
erbz

Anhand des von Doug Wilson bereitgestellten Beispiels habe ich die folgenden zwei PowerShell-Funktionen erstellt, um Regeln zum Umschreiben von URLs für die Umleitung zu HTTPS und zum Hinzufügen von HSTS-Headern hinzuzufügen.

Diese wurden unter Windows 2012 und Windows 2012 R2 getestet.

Sie müssen lediglich den Namen der Website angeben. Sie können den Regeln optional einen anderen Namen geben, wenn Ihnen die Standardeinstellungen nicht gefallen.

Zu beachten ist, dass nach meinen Tests die Servervariablen zur Zulassungsliste hinzugefügt werden müssen, bevor sie in den Antwortheadern enthalten sind. Die Funktionen erledigen dies für Sie.

BEARBEITEN: Siehe Referenz zu Url Rewrite für HTTP-Header hier: http://www.iis.net/learn/extensions/url-rewrite-module/setting-http-request-headers-and-iis-server- Variablen

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"

}
2
CarlR

Laut den Herstellern von HTTP Strict Transport Security IIS Modul) entspricht das Hinzufügen des benutzerdefinierten Headers nicht dem Entwurf der Spezifikation (RFC 6797).

Sie müssten dieses IIS-Modul tatsächlich installieren, um HSTS auf IIS 7) zu aktivieren.

Update 26. Oktober 2014 : Dank des Kommentators unten habe ich die Modulseite erneut gelesen und insbesondere den Teil, der die Verwendung des Moduls über das Hinzufügen benutzerdefinierter Header rechtfertigt .

Ein HSTS-Host darf das STS-Headerfeld NICHT in HTTP-Antworten enthalten, die über einen nicht sicheren Transport übermittelt werden.

Wenn Sie sicherstellen, dass die Header nur in HTTPS und NICHT in HTTP hinzugefügt werden, benötigen Sie dieses Modul nicht und können die Antwort von Doug Wilson verwenden. Verwenden Sie nicht die Antwort von Owen Blacker, da die https-Bedingung nicht erfüllt ist.

1
Chris

Dies kann durch Hinzufügen des folgenden Blocks in Web.Config erfolgen:

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

Wir müssen konfigurieren auf IIS, das die Fähigkeit hat, benutzerdefinierte Header als Antwort zu verwenden:

  • Wechseln Sie zum IIS-Manager (Internet Information Services).
  • Konfigurieren Sie Antwortheader, die der Antwort vom Server hinzugefügt werden.
  • Fügen Sie nun Ihren benutzerdefinierten Headernamen und Ihren benutzerdefinierten Wert hinzu (Benutzerdefinierter Headername und -wert sollten mit denen in Web.Config übereinstimmen). Sie finden auf Blog
1
Vinit

Nur um hinzuzufügen, ich sehe in den Kommentaren 2 Leute, die über 500 Fehler sprechen, wenn Sie dies tun. Ich hatte das.

Wenn in IIS] ein Fehler von 500 angezeigt wird, liegt dies möglicherweise daran, dass Sie die Regel sowohl auf der obersten Ebene als auch auf der Site-Ebene hinzugefügt haben.

z.B.

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

IIS/Der Browser scheint Ihnen keine Informationen darüber zu geben, dass Sie dies getan haben, unabhängig von Ihren Einstellungen für die Fehlerbehandlung

0
tony