IIS 7 WebサーバーでHTTP Strict Transport Securityを有効にする最良の方法は何ですか?
GUIだけで適切なHTTP応答ヘッダーを追加できますか、appcmdを使用する必要がありますか?
IIS 7 WebサーバーでHTTP Strict Transport Securityを有効にする最良の方法は何ですか?
GUIだけで適切なHTTP応答ヘッダーを追加できますか、appcmdを使用する必要がありますか?
回答:
IISには、応答にカスタムヘッダーを追加する機能があります。これが最も簡単な方法のようです。
IIS.netのドキュメントによると、IISマネージャーを介してこれらのヘッダーを追加できます。
- [接続]ウィンドウで、カスタムHTTPヘッダーを設定するサイト、アプリケーション、またはディレクトリに移動します。
- [ホーム]ウィンドウで、[HTTP応答ヘッダー]をダブルクリックします。
- [HTTP応答ヘッダー]ウィンドウで、[アクション]ウィンドウの[追加...]をクリックします。
- [カスタムHTTP応答ヘッダーの追加]ダイアログボックスで、カスタムヘッダーの名前と値を設定し、[OK]をクリックします。
これにより、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>
<action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />
取得するにはパス hstspreload.org上を
https://somedomain.com/https://somedomain.com/relatedpath
と、取得され、結果としてパスがドロップされます。
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.webServer
Web.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 6797、Strict-Transport-Security
カスタムヘッダーはならない(MUST NOT)暗号化されていないHTTPによって行われた要求に追加すること。RFC6797に準拠するには、最初のコードブロックの後で説明したように、IISに2つのサイトが必要です。クリスが指摘し、RFC 6797には含まれています:
HSTSホストは、非セキュアトランスポートを介して伝達されるHTTP応答にSTSヘッダーフィールドを含めてはなりません。
そのためStrict-Transport-Security
、非SSLリクエストに応答して顧客ヘッダーを送信すると、仕様に準拠しません。
参照した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;
}
}
これは、これを行う非常にフェイルセーフな方法のようです。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;
}
}
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"
}
HTTP Strict Transport Security IISモジュールのメーカーによると、カスタムヘッダーを追加するだけではドラフト仕様(RFC 6797)に準拠していません。
IIS 7でHSTSを有効にするには、実際にこのIISモジュールをインストールする必要があります。
更新26 okt 2014:以下のコメンターのおかげで、モジュールページ、特にカスタムヘッダーの追加よりもモジュールの使用を正当化する部分をもう一度読みました。
HSTSホストは、非セキュアトランスポートを介して伝達されるHTTP応答にSTSヘッダーフィールドを含めてはなりません。
HTTPではなくHTTPSのみでヘッダーを追加するようにする場合は、このモジュールは不要で、Doug Wilsonの回答を使用できます。Owen Blackerの回答はhttps条件を持たないため使用しないでください。
これを行うには、Web.Configに次のブロックを追加します。
<system.webServer>
<httpProtocol>
<customHeaders>
<add name ="CustomName" value="MyCustomValue"/>
</customHeaders>
</httpProtocol>
</system.webServer>
応答するヘッダーをカスタマイズする機能を持つIISで構成する必要があります。