IIS 7에서 HTTP Strict Transport Security (HSTS) 사용


75

IIS 7 웹 서버 에서 HTTP Strict Transport Security를 설정하는 가장 좋은 방법은 무엇입니까 ?

GUI를 통해 적절한 HTTP 응답 헤더를 추가 할 수 있습니까? 아니면 appcmd를 사용해야합니까? 그렇다면 어떤 것이 전환됩니까?


1
이것은 IIS가 제공하는 것들을 생성하는 방법에 달려 있습니다 (예 : 응용 프로그램 내에서 PHP 또는 ASP.NET 페이지에서 헤더를 설정할 수 있습니다). 사용 사례에 대해 더 자세히 말씀해 주시겠습니까?
voretaq7

답변:


18

IIS는 응답에 사용자 지정 헤더를 추가 할 수 있습니다 . 이것은 가장 쉬운 방법 인 것 같습니다.

IIS.net 의 문서에 따르면 IIS 관리자를 통해 다음 헤더를 추가 할 수 있습니다.

  • 연결 창에서 사용자 지정 HTTP 헤더를 설정하려는 사이트, 응용 프로그램 또는 디렉토리로 이동하십시오.
  • 홈 분할 창에서 HTTP 응답 헤더를 두 번 클릭하십시오.
  • HTTP 응답 헤더 분할 창의 조치 분할 창에서 추가 ...를 클릭하십시오.
  • 사용자 정의 HTTP 응답 헤더 추가 대화 상자에서 사용자 정의 헤더의 이름과 값을 설정 한 다음 확인을 클릭하십시오.

5
원하는 Web.config에서도이 작업을 수행 할 수 있습니다. 주석에서 사용할 수없는 소스 코드 형식이 없으면 읽기가 어려울 수 있으므로 세부 정보를 새로운 답변으로 게시했습니다.
Owen Blacker

3
HTTP Strict Transport Security IIS Module 제조업체에 따르면 사용자 정의 헤더를 추가하는 것만 초안 사양 (RFC 6797)과 호환되지 않습니다. 실제로이 IIS 모듈을 설치해야합니다.
Chris

@Chris 그들은 (kinda) 틀 렸습니다. 스펙에 관한 것이 아니라 그것들이 절대적으로 정확합니다. 그러나 모듈을 따로 따를 "간단한"방법이 없다는 사실에 대한 것입니다 : SSL (헤더 포함)과 SSL 이외의 사이트 ( 헤더없이). 분명히 모듈은 조금 더 우아 하지만 필요 하지는 않습니다 (사이트가 https 전용이고 일반 HTTP 응답을 제공하지 않는 경우 전혀 보장되지 않습니다).
voretaq7

1
@Chris 당신은 그 모듈을 참조하는 답변을 추가해야합니다-무료 공감! (나는 그것이 존재한다는 것을 몰랐다. 그리고 많은 사람들에게는 아마도 사용자 정의 헤더보다 더 쉽고 더 나은 옵션 일 것이다)
voretaq7

112

이를 통해 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>

7
감사합니다. 이것이 최선의 대답입니다! 프로그래밍 방식과 달리 정적 HTML 파일에도 헤더를 추가합니다. 그리고 HTTP에 추가하지 않으므로 표준을 준수합니다.
Jeow Li Huan

4
@Mathemats IIS에 URL Rewrite가 설치되어 있습니까?
더그 윌슨

3
아니요, 더 많은 연구를 한 후 확장 (d' oh)이 다시 쓰기 태그를 제공한다는 것을 알았습니다. 내가 찾을 수있는 모든 대답은 확장을 종속성으로 언급하지 않으며 아마도 대답에 하나의 라이너를 던질 수 있습니다.
Mathemats

2
hstspreload.org 는 사용자가`; includeSubDomains; 최대 연령 값 다음에 미리로드하십시오. 옵션. 전체 노선은 다음과 같습니다. hstspreload.org <action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />에서 패스 받기
JP Hellemons

2
패턴 (. *)이있는 캡처 그룹 R : 1은 전체 URL, 프로토콜 및 모두와 일치하며 {HTTP_HOST} / {R : 1}을 연결하려고 https://somedomain.com/https://somedomain.com/relatedpath하면 경로가 삭제 되었음을 의미합니다 .
AaronLS

38

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.webServerWeb.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 6797Strict-Transport-Security사용자 정의 헤더는 암호화되지 않은 HTTP에 의해 만들어진 요청에 추가. RFC6797을 준수하려면 첫 번째 코드 블록 다음에 설명한대로 IIS에 두 개의 사이트가 있어야합니다. Chris가 지적한 것처럼 RFC 6797에는 다음이 포함됩니다.

HSTS 호스트 는 비보안 전송을 통해 전달되는 HTTP 응답에 STS 헤더 필드를 포함 해서는 안됩니다 .

Strict-Transport-SecuritySSL이 아닌 요청에 대한 응답으로 고객 헤더를 전송 하면 사양을 준수하지 않습니다.


1
Owen Blacker 응답에 추가하기 위해 IIS의 경우 URLScan 3.1을 사용하고 RemoveServerHeader = 1을 설정하여 응답에서 SERVER를 전체적으로 제거하도록합니다. 나머지 설정은 각 사이트 web.config 파일에 있어야합니다. 값을 비우는 것보다 이것을 선호합니다.
KeyOfJ

URLScan은 매우 일반적인 솔루션이므로 제안하는 것보다 낫습니다. 그러나 항상 가장 편리한 솔루션은 아닙니다 : o)
Owen Blacker

HTTPS 및 HTTP를 사용하도록 설정하여 (리디렉션 할 수있는) 사이트에 추가하면 사이트가 중단됩니다. CustomErrors Mode = "Off"를 사용하더라도 로그에 오류없이 정보가없는 500을 얻을 수 있습니다.
Chris Moschini 1

@ChrisMoschini 첫 번째 Web.config 줄이 SSL 전용 사이트 여야한다는 것이 분명했습니다.
Owen Blacker

1
@Lenne Scott Hanselman은 STS가 HTTP를 사용하는 동안 헤더에 속하지 않는 이유에 대해 더 잘 설명했습니다. 자세한 내용은 여기
David Yates

8

참조한 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;
    }
}

3

이것은이 작업을 수행하는 데 실패하지 않은 안전한 방법 인 것 같습니다. 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;
  }
}

2

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"

}

1

HTTP Strict Transport Security IIS 모듈 제조업체에 따르면 사용자 정의 헤더를 추가하는 것만 초안 사양 (RFC 6797)을 준수하지 않습니다.

실제로 IIS 7에서 HSTS를 켜려면 이 IIS 모듈 을 설치해야합니다 .

업데이트 26 okt 2014 : 아래의 주석 작성자 덕분에 모듈 페이지를 다시 읽고 특히 사용자 정의 헤더 추가보다 모듈 사용을 정당화하는 부분을 읽었습니다.

HSTS 호스트는 비보안 전송을 통해 전달되는 HTTP 응답에 STS 헤더 필드를 포함해서는 안됩니다.

HTTPS에서만 헤더를 추가하고 HTTP에서는 헤더를 추가하지 않으면이 모듈이 필요하지 않으며 Doug Wilson의 답변을 사용할 수 있습니다. https 조건이없는 Owen Blacker의 답변 원인을 사용하지 마십시오.


1
따라서 헤더를 HTTPS 요청으로 만 보내는 다른 응답 중 일부 도이 문제를 해결합니까? 아니면 모듈이 다른 솔루션과 다른 / 추가 기능을 수행합니까?
slolife

@ slolife 내 답변을 업데이트했습니다. Doug Wilson의 답변에서 코드를 사용할 수 있습니다. 이 모듈이 필요하지 않습니다. 나는 이것이 또한 받아 들여진 대답의 의견에서 논의되는 것을 본다. 이 솔루션이 다른 솔루션과 다른 / 추가 작업을 수행하는 것을 알지 못합니다. 그러나 소스 코드를 철저히 검사하지 않았습니다 .
Chris

첫 번째 Web.config가 SSL 전용 사이트에서 구현되어야한다는 것이 분명했습니다. 명확히하기 위해 답을 편집하겠습니다.
Owen Blacker

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.