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


75

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

GUIだけで適切なHTTP応答ヘッダーを追加できますか、appcmdを使用する必要がありますか?


1
これの多くは、IISが提供するものの生成方法に依存します(たとえば、アプリケーション内からPHPまたはASP.NETページにヘッダーを設定できます)。ユースケースについて詳しく教えてください。
voretaq7

回答:


18

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

IIS.netのドキュメントによると、IISマネージャーを介してこれらのヘッダーを追加できます。

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

5
Web.configでこれを行うこともできます。詳細は新しい回答として投稿しました。コメントでは利用できないソースコードのフォーマットなしでは読みにくいため、詳細は非常に困難です。
オーウェンブラッカー

3
HTTP Strict Transport Security IIS Moduleのメーカーによると、カスタムヘッダーを追加するだけではドラフト仕様(RFC 6797)に準拠していません。実際には、このIISモジュールをインストールする必要があります。
クリス14

@クリス彼らは(ちょっと)間違っています。仕様についてではありません-それらは絶対に正しいのですが、モジュール以外に準拠する「簡単な」方法がないという事実についてです:SSL用(ヘッダー付き)と非SSL用(ヘッダーなし)。確かモジュールはもう少しでエレガントな、しかし、そうではありません、必要な(そして、あなたのサイトがHTTPSのみであり、あなたはプレーンなHTTPレスポンスを提供していない場合は全く保証されていません)。
voretaq7 14

1
@Chrisただし、そのモジュールを参照する回答を追加する必要があります-無料の賛成票!(私はそれが存在することを知りませんでしたが、多くの人にとってはおそらくカスタムヘッダーのものよりも簡単/良いオプションです)
voretaq7 14

112

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

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

7
ありがとう、これがベストアンサーです!プログラム的なアプローチとは異なり、静的HTMLファイルにもヘッダーを追加します。また、HTTPに追加しないため、標準に準拠しています。
ジョーリーフアン14

4
@Mathemats IISにURL Rewriteをインストールしましたか?
ダグウィルソン

3
いいえ、さらに調査した結果、書き換えタグは拡張機能(d'oh)によって提供されることがわかりました。私が見つけることができるすべての答えは、拡張機能を依存関係として言及していません。おそらく、あなたはそれを必要とする答えに1つのライナーを投げることができます。
Mathemats

2
hstspreload.orgはユーザーに `; includeSubDomains;を追加することを望んでいます。max-age値の後にプリロードします。オプション。フルラインは次のようになります<action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />取得するにはパス hstspreload.org上を
JP Hellemons

2
パターン(。*)を持つキャプチャグループR:1は、URL、プロトコル、およびすべてと一致します。{HTTP_HOST} / {R:1}を連結しようとするhttps://somedomain.com/https://somedomain.com/relatedpathと、取得され、結果としてパスがドロップされます。
アーロンLS

38

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

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

明らかに、system.webServerWeb.configに既にブロックが存在している可能性があるので、追加する場合はこれに追加します。GUIよりもWeb.configで処理することをお勧めします。これは、設定の変更をGitリポジトリにコミットできることを意味します。

Greg Askewが述べたように、HTTPからSSLへのリダイレクトを処理したい場合は、IISの別のWebサイトを使用する方が簡単な場合があります。これは、一部のクライアントサイトでSSLの要求を処理する方法です。そのサイトには、すべてWeb.configにあるHTTPリダイレクトといくつかの情報開示修正のみが含まれています。

<?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ログにあるため)。そこには、Umbracoサイトにとってもう少し便利です)、そして重要なことは、すべての構成がまだGITリポジトリに保持されていることを意味します。

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

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

そのためStrict-Transport-Security、非SSLリクエストに応答して顧客ヘッダーを送信すると、仕様に準拠しません。


1
Owen Blackerの応答に追加するには、IISでURLScan 3.1を使用し、RemoveServerHeader = 1を設定して応答からSERVERをグローバルに削除します。残りの設定は各サイトのweb.configファイルに指定する必要があります。私はこれを単に値を空白にするよりも好みます。
KeyOfJ

URLScanは非常に一般的なソリューションであり、私が提案しているものよりも優れたソリューションをお勧めします。しかし、それは常に最も便利な解決策ではありません:o)
オーウェンブラッカー14年

HTTPSとHTTPが有効になっている(リダイレクトできる)サイトにこれを追加すると、サイトが破損することに注意してください。CustomErrors Mode = "Off"が設定されていても、ログにはエラーがなく、情報なしの500が表示されます。
クリスモスキーニ14

@ChrisMoschini最初のWeb.config行はSSLのみのサイト用である必要があることを明確にすべきでした。
オーウェンブラッカー

1
@Lenne Scott Hanselmanは、HTTPを使用しているときにSTSがヘッダーに含まれない理由について、より良い説明を書きました。詳細はこちら
David Yates

8

参照したWikipediaリンクの例を使用して、サイトのglobal.asaxでアクティビティを実行します。これは、HTTPS URLに要求をリダイレクトでき、次いで応答にヘッダを挿入します。

これは、HSTSヘッダーが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;
    }
}

3

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

仕様に従って、httpリクエストはヘッダーで応答してはいけません-このコードはhttpsリクエストに対してのみ追加します。最大経過時間は秒数です。通常、ここに大きな値を設定することをお勧めします(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;
  }
}

2

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

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

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

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

編集:HTTPヘッダーのURLリライトのリファレンスを参照してください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

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

IIS 7でHSTSを有効にするには、実際にこのIISモジュールをインストールする必要があります。

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

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

HTTPではなくHTTPSのみでヘッダーを追加するようにする場合は、このモジュールは不要で、Doug Wilsonの回答を使用できます。Owen Blackerの回答はhttps条件を持たないため使用しないでください。


1
HTTPSリクエストにのみヘッダーを送信する他の回答のいくつかは、この問題も解決しますか?それとも、あなたのモジュールは他のソリューションとは異なる/特別な何かをしますか?
slolife 14年

@slolife私は答えを更新しました。Doug Wilsonの答えのコードを使用できます。このモジュールは必要ありません。これは、受け入れられた答えのコメントでも議論されていることがわかりました。私は、このモジュールが他のソリューションにはない別の/余分なことをしていることを知りません。しかし、ソースコードの徹底的なチェックも行っていません。
クリス14年

最初のWeb.configをSSLのみのサイトに実装する必要があることを明確にすべきでした。それを明確にするために答えを編集します。
オーウェンブラッカー

1

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

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

応答するヘッダーをカスタマイズする機能を持つIISで構成する必要があります。

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

0

付け加えると、コメントを見ると、2人が500エラーについて話していることがわかります。これがあった。

IISで500エラーが表示された場合は、トップレベル、継承された設定、およびサイトレベルの両方でルールを追加した可能性があります。

例えば

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.