web-dev-qa-db-ja.com

IIS 7でHTTP Strict Transport Security(HSTS)を有効にする

IIS 7 Webサーバーで HTTP Strict Transport Security をオンにする最良の方法は何ですか?

GUIを介して適切なHTTP応答ヘッダーを追加できますか、それともappcmdを使用する必要がありますか。

77
Bob

IISには カスタムヘッダーを応答に追加する機能 があります。これはそれを行う最も簡単な方法のようです。

IIS.net のドキュメントによると、これらのヘッダーはIIS Manager:

  • [接続]ウィンドウで、カスタムHTTPヘッダーを設定するサイト、アプリケーション、またはディレクトリに移動します。
  • [ホーム]ウィンドウで、[HTTP応答ヘッダー]をダブルクリックします。
  • [HTTP応答ヘッダー]ウィンドウで、[アクション]ウィンドウの[追加...]をクリックします。
  • [カスタムHTTP応答ヘッダーの追加]ダイアログボックスで、カスタムヘッダーの名前と値を設定し、[OK]をクリックします。
17
voretaq7

これにより、HTTPリダイレクトを処理し、1つのIISサイト(URL書き換えモジュールをインストールする必要があります)を使用してHTTPS応答にStrict-Transport-Securityヘッダーを追加できます)。

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

voretaq7 の回答を補足するために、Web.configファイルを使用してこれを行うこともできます(注:HTTPとHTTPSの両方の応答のヘッダーが追加されるため、SSLサイトのみに使用されます。 RFC 6797仕様に違反しています。以下の説明を参照してください)—次のようにブロックを追加します。

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

明らかに、すでにsystem.webServer Web.configでブロックします。その場合は、これを追加します。構成の変更をGitリポジトリにコミットできるため、GUIではなくWeb.configで処理することをお勧めします。

Greg Askew で述べたように、HTTPからSSLへのリダイレクトを処理したい場合は、IISで別のWebサイトを使用する方が簡単な場合があります。これは、一部のクライアントサイトでSSLの要求を処理する方法です。そのサイトには、HTTPリダイレクトといくつかの information-disclosure 修正のみが含まれており、すべて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>

これは、いくつかの理由で推奨されるソリューションです。リダイレクトされたトラフィックを個別に簡単に記録できます(別のIISログにあるため))、Global.asaxにコードを追加する必要がありません。 cs(そこにはコードがありません。これはUmbracoサイトにとって少し便利です)、そして重要なことに、すべての構成がまだGITリポジトリに保持されていることを意味します。

編集して追加:明確にするために、 RFC 6797 に準拠するために、Strict-Transport-Securityカスタムヘッダー MUST NOT 暗号化されていないHTTPによって行われたリクエストに追加されます。 RFC6797に準拠するには、最初のコードブロックの後で説明したように、IISに2つのサイトが必要です。 Chris が指摘するように、RFC 6797には次のものが含まれます。

HSTSホスト MUST NOT 非セキュアなトランスポートを介して伝達されるHTTP応答にSTSヘッダーフィールドを含めます。

したがって、Strict-Transport-Security非SSLリクエストへの応答における顧客ヘッダーは、仕様に準拠していません。

40
Owen Blacker

参照したウィキペディアリンクの例を使用して、サイトのglobal.asaxでアクティビティを実行します。これにより、リクエストをhttpsのURLにリダイレクトでき、thenが応答にヘッダーを挿入します。

これは、https応答にない場合はHSTSヘッダーを無視する必要があるためです。

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

これはかなりフェイルセーフな方法のようです。このコードをGlobal.asaxに追加します。Application_BeginRequestイベントは、Asp.netリクエストライフサイクルの最初に発生します。 http://msdn.Microsoft.com/en-us/library/system.web.httpapplication.beginrequest( v = vs.110).aspx

仕様によると、httpリクエストはヘッダーで応答してはなりません-したがって、このコードはhttpsリクエストに対してのみヘッダーを追加します。 Max-ageは秒単位であり、通常は大きな値をここに入力することをお勧めします(IE-31536000は、サイトが今後365日間のみSSLを実行することを示します)

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

Doug Wilsonが提供する例を使用して、HTTPSへのリダイレクトとHSTSヘッダーを追加するためのURL書き換えルールを追加するために、次の2つのPowerShell関数を作成しました。

これらは、Windows 2012およびWindows 2012 R2でテストされています。

あなたがする必要があるすべてはウェブサイトの名前を提供することです。デフォルトが気に入らない場合は、オプションでルールに別の名前を付けることができます。

注意すべき点の1つは、私のテストでは、サーバー変数を応答ヘッダーに含める前に許可リストに追加する必要があることです。関数がこれを行います。

編集:HTTPヘッダーのURL書き換えに関する参照はこちら: http://www.iis.net/learn/extensions/url-rewrite-module/setting-http-request-headers-and-iis-server-変数

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

HTTP Strict Transport SecurityのメーカーIIS Moduleによると、カスタムヘッダーを追加するだけではドラフト仕様(RFC 6797)に準拠していません。

実際にこれをインストールする必要があります IISモジュール HSTSをオンにするにはIIS 7。

Update 26 okt 2014:以下のコメントのおかげで、モジュールのページ、特にカスタムヘッダーの追加よりもモジュールの使用を正当化する部分をもう一度読みました。

HSTSホストは、非セキュアなトランスポートを介して伝達されるHTTP応答にSTSヘッダーフィールドを含めてはなりません

ヘッダーをHTTPSではなくHTTPでのみ追加する場合は、このモジュールは必要なく、Doug Wilsonによる回答を使用できます。 https条件がないため、オーエンブラックの回答を使用しないでください。

1
Chris

これを行うには、Web.Configに次のブロックを追加します。

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

IISで構成する必要があります。これは、カスタムヘッダーから応答する機能を備えています。

  • インターネットインフォメーションサービス(IIS)マネージャーに移動します。
  • サーバーからの応答に追加される応答ヘッダーを構成します。
  • 次に、カスタムヘッダーの名前とカスタム値を追加します(カスタムヘッダーの名前と値は、Web.Configと同じにする必要があります)。 blog で見つけることができます
1
Vinit

付け加えると、これを行うと、コメントに500人のエラーについて話している2人が表示されます。これ食べました。

IISで500エラーが発生する場合は、ルールをトップレベル、継承に設定、サイトレベルの両方で追加したことが原因である可能性があります。

例えば.

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

IIS /ブラウザーは、エラー処理設定に関係なく、これを行った情報を提供していないようです

0
tony