IIS 7 웹 서버 에서 HTTP Strict Transport Security를 설정하는 가장 좋은 방법은 무엇입니까 ?
GUI를 통해 적절한 HTTP 응답 헤더를 추가 할 수 있습니까? 아니면 appcmd를 사용해야합니까? 그렇다면 어떤 것이 전환됩니까?
IIS 7 웹 서버 에서 HTTP Strict Transport Security를 설정하는 가장 좋은 방법은 무엇입니까 ?
GUI를 통해 적절한 HTTP 응답 헤더를 추가 할 수 있습니까? 아니면 appcmd를 사용해야합니까? 그렇다면 어떤 것이 전환됩니까?
답변:
IIS는 응답에 사용자 지정 헤더를 추가 할 수 있습니다 . 이것은 가장 쉬운 방법 인 것 같습니다.
IIS.net 의 문서에 따르면 IIS 관리자를 통해 다음 헤더를 추가 할 수 있습니다.
- 연결 창에서 사용자 지정 HTTP 헤더를 설정하려는 사이트, 응용 프로그램 또는 디렉토리로 이동하십시오.
- 홈 분할 창에서 HTTP 응답 헤더를 두 번 클릭하십시오.
- HTTP 응답 헤더 분할 창의 조치 분할 창에서 추가 ...를 클릭하십시오.
- 사용자 정의 HTTP 응답 헤더 추가 대화 상자에서 사용자 정의 헤더의 이름과 값을 설정 한 다음 확인을 클릭하십시오.
이를 통해 HTTP 리디렉션을 처리하고 단일 IIS 사이트를 사용하여 Strict-Transport-Security 헤더를 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" />
에서 패스 받기
https://somedomain.com/https://somedomain.com/relatedpath
하면 경로가 삭제 되었음을 의미합니다 .
voretaq7 의 답변 을 보완하기 위해 Web.config 파일을 사용하여이 작업을 수행 할 수도 있습니다 (NB : SSLC 사이트에만 사용됩니다. 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-to-SSL 리디렉션을 처리하려는 경우 IIS의 별도 웹 사이트에서 더 쉽게 수행 할 수 있습니다. 이것이 우리가 일부 클라이언트 사이트에 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 로그에있는 것처럼 쉽게 개별적으로 기록 할 수 있으며 Global.asax.cs에 더 많은 코드가 포함되지 않습니다 (코드가 없습니다) 거기에서 Umbraco 사이트에 조금 더 편리합니다) 그리고 중요한 것은 모든 구성이 여전히 GIT 저장소에 유지된다는 것을 의미합니다.
추가 편집 : 준수하기 위해, 명확하게하기 위해 RFC 6797 의 Strict-Transport-Security
사용자 정의 헤더는 안 암호화되지 않은 HTTP에 의해 만들어진 요청에 추가. RFC6797을 준수하려면 첫 번째 코드 블록 다음에 설명한대로 IIS에 두 개의 사이트가 있어야합니다. Chris가 지적한 것처럼 RFC 6797에는 다음이 포함됩니다.
HSTS 호스트 는 비보안 전송을 통해 전달되는 HTTP 응답에 STS 헤더 필드를 포함 해서는 안됩니다 .
Strict-Transport-Security
SSL이 아닌 요청에 대한 응답으로 고객 헤더를 전송 하면 사양을 준수하지 않습니다.
참조한 Wikipedia 링크의 예제를 사용하고 사이트의 global.asax에서 활동을 수행합니다. 이렇게하면 요청을 https URL로 리디렉션 한 다음 헤더를 응답에 삽입 할 수 있습니다.
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;
}
}
이것은이 작업을 수행하는 데 실패하지 않은 안전한 방법 인 것 같습니다. Global.asax에이 코드를 추가합니다. Application_BeginRequest 이벤트는 Asp.net 요청 수명주기에서 먼저 발생합니다. 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이 제공 한 예제를 사용하여 HTTPS로 리디렉션하고 HSTS 헤더를 추가하기위한 URL 다시 쓰기 규칙을 추가하는 다음 두 가지 PowerShell 함수를 만들었습니다.
이들은 Windows 2012 및 Windows 2012 R2에서 테스트되었습니다.
웹 사이트 이름 만 입력하면됩니다. 기본값이 마음에 들지 않으면 규칙에 다른 이름을 지정할 수 있습니다.
주의해야 할 점은 테스트에서 응답 헤더에 들어가기 전에 서버 변수를 허용 목록에 추가해야한다는 것입니다. 기능은 당신을 위해 이것을합니다.
편집 : 여기에 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 헤더 필드를 포함해서는 안됩니다.
HTTPS에서만 헤더를 추가하고 HTTP에서는 헤더를 추가하지 않으면이 모듈이 필요하지 않으며 Doug Wilson의 답변을 사용할 수 있습니다. https 조건이없는 Owen Blacker의 답변 원인을 사용하지 마십시오.
Web.Config에 다음 블록을 추가하면됩니다.
<system.webServer>
<httpProtocol>
<customHeaders>
<add name ="CustomName" value="MyCustomValue"/>
</customHeaders>
</httpProtocol>
</system.webServer>
우리는 IIS에 대해 사용자 정의 헤더를 응답 할 수있는 기능을 구성해야합니다.