Kích hoạt bảo mật truyền tải nghiêm ngặt HTTP (HSTS) trong IIS 7


75

Cách tốt nhất để bật HTTP Strict Transport Security trên máy chủ web IIS 7 là gì?

Tôi có thể chỉ qua GUI và thêm tiêu đề phản hồi HTTP thích hợp hay tôi nên sử dụng appcmd và nếu có thì chuyển đổi gì?


1
Rất nhiều thứ này phụ thuộc vào cách bạn tạo ra thứ mà IIS đang phục vụ (ví dụ: bạn có thể đặt tiêu đề trong các trang PHP hoặc ASP.NET từ trong ứng dụng của mình). Bạn có thể cho chúng tôi biết thêm về trường hợp sử dụng của bạn?
voretaq7

Câu trả lời:


18

IIS có khả năng thêm các tiêu đề tùy chỉnh để trả lời . Đây có vẻ là cách dễ nhất để đi về nó.

Theo tài liệu trên IIS.net, bạn có thể thêm các tiêu đề này thông qua Trình quản lý IIS:

  • Trong ngăn Kết nối, đi đến trang web, ứng dụng hoặc thư mục mà bạn muốn đặt tiêu đề HTTP tùy chỉnh.
  • Trong ngăn Trang chủ, bấm đúp vào Tiêu đề phản hồi HTTP.
  • Trong ngăn Tiêu đề phản hồi HTTP, bấm Thêm ... trong ngăn Hành động.
  • Trong hộp thoại Thêm tiêu đề phản hồi HTTP tùy chỉnh, đặt tên và giá trị cho tiêu đề tùy chỉnh của bạn, sau đó bấm OK.

5
Bạn cũng có thể thực hiện việc này trong Web.config mà bạn có thể thích. Tôi đã đăng các chi tiết dưới dạng một câu trả lời mới, vì chúng thực sự rất khó đọc nếu không có định dạng mã nguồn không có trong các bình luận.
Owen Blacker

3
Theo các nhà sản xuất Mô-đun IIS Bảo mật Giao thông Vận tải Nghiêm , chỉ cần thêm tiêu đề tùy chỉnh là không tuân thủ thông số kỹ thuật dự thảo (RFC 6797). Bạn thực sự sẽ cần phải cài đặt Mô-đun IIS này.
Chris

@Chris Họ (kinda) sai. Không phải về thông số kỹ thuật - họ hoàn toàn chính xác ở đó - nhưng về thực tế là không có cách "đơn giản" nào để tuân thủ mô-đun của họ: Chỉ cần tạo 2 trang web, một cho SSL (với tiêu đề) và một cho không SSL ( không có tiêu đề). Chắc chắn mô-đun thanh lịch hơn một chút , nhưng nó không cần thiết (và hoàn toàn không được bảo hành nếu trang web của bạn chỉ có https và bạn không phục vụ các phản hồi HTTP đơn giản).
voretaq7

1
@Chris Bạn nên thêm một câu trả lời tham khảo mô-đun đó mặc dù - upvotes miễn phí! (Tôi không biết về sự tồn tại của nó và đối với nhiều người, đây có lẽ là một lựa chọn dễ dàng / tốt hơn so với công cụ tiêu đề tùy chỉnh)
voretaq7

112

Điều này cho phép chúng tôi xử lý cả chuyển hướng HTTP và thêm tiêu đề Strict-Transport-Security vào các phản hồi HTTPS với một trang IIS duy nhất (phải cài đặt mô-đun Viết lại 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
Cảm ơn, đây là câu trả lời tốt nhất! Thêm tiêu đề vào các tệp HTML tĩnh, không giống như cách tiếp cận theo chương trình. Và không thêm vào HTTP, do đó tuân thủ tiêu chuẩn.
Jeow Li Huân

4
@Mathemats Bạn đã cài đặt URL Rewrite trong IIS chưa?
Doug Wilson

3
Không, sau khi nghiên cứu thêm, tôi phát hiện ra rằng thẻ viết lại được cung cấp bởi tiện ích mở rộng (d'oh). Tất cả các câu trả lời mà tôi có thể tìm thấy không đề cập đến phần mở rộng như một phần phụ thuộc, có lẽ bạn có thể ném một phần trong câu trả lời của bạn nói rằng bạn cần nó.
Mathemats

2
hstspreload.org muốn người dùng thêm `; includeSubDomains; tải trước `sau giá trị tuổi tối đa. tùy chọn. Dòng đầy đủ sẽ là: <action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />để vượt qua trên hstspreload.org
JP Hellemons

2
Nhóm chụp R: 1 với mẫu (. *) Khớp với toàn bộ URL, giao thức và tất cả, và cố gắng nối {HTTP_HOST} / {R: 1} có nghĩa là bạn nhận được https://somedomain.com/https://somedomain.com/relatedpathvà kết quả là đường dẫn bị loại bỏ.
AaronLS

38

Để bổ sung câu trả lời của voretaq7 , bạn cũng có thể thực hiện việc này bằng tệp Web.config (NB: Chỉ được sử dụng cho các trang SSL, vì nó sẽ thêm tiêu đề cho cả phản hồi HTTP và HTTPS, trái với thông số RFC 6797, vui lòng xem giải thích bên dưới) - thêm một khối như sau:

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

Rõ ràng, bạn có thể đã có một system.webServerkhối trong Web.config, vì vậy hãy thêm khối này vào đó, nếu vậy. Chúng tôi thích xử lý mọi thứ trong Web.config hơn là GUI, vì điều đó có nghĩa là các thay đổi cấu hình có thể được cam kết với kho Git của chúng tôi.

Nếu bạn muốn xử lý chuyển hướng HTTP sang SSL, như Greg Askew đã đề cập, bạn có thể thấy việc đó dễ dàng hơn với một trang web riêng trong IIS. Đây là cách chúng tôi xử lý yêu cầu SSL cho một số trang web của khách hàng. Trang web đó chỉ chứa một chuyển hướng HTTP và một số bản sửa lỗi tiết lộ thông tin , tất cả đều có trong 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>

Đây là giải pháp ưa thích của chúng tôi vì một vài lý do - chúng tôi có thể dễ dàng đăng nhập lưu lượng truy cập được chuyển hướng riêng biệt (vì nó trong một bản ghi IIS khác nhau), nó không liên quan đến nhiều mã hơn trong Global.asax.cs (chúng tôi không có bất kỳ mã nào trong đó, thuận tiện hơn một chút cho trang web Umbraco) và quan trọng là điều đó có nghĩa là tất cả các cấu hình vẫn được giữ trong repo GIT của chúng tôi.

Đã chỉnh sửa để thêm: Để rõ ràng, để tuân thủ RFC 6797 , Strict-Transport-Securitytiêu đề tùy chỉnh KHÔNG PHẢI được thêm vào các yêu cầu được tạo bởi HTTP không được mã hóa. Để tuân thủ RFC6797, bạn PHẢI có hai trang web trong IIS, như tôi đã mô tả sau khối mã đầu tiên. Như Chris chỉ ra, RFC 6797 bao gồm:

Máy chủ HSTS KHÔNG PHẢI bao gồm trường tiêu đề STS trong các phản hồi HTTP được truyền tải qua vận chuyển không an toàn.

do đó, việc gửi Strict-Transport-Securitytiêu đề của khách hàng để đáp ứng yêu cầu không có SSL sẽ không tuân thủ thông số kỹ thuật.


1
Để thêm vào phản hồi của Owen Blacker, đối với IIS, tôi sử dụng URLScan 3.1 và xóa toàn bộ SERVER khỏi phản hồi bằng cách đặt RemoveServerHeader = 1, các cài đặt còn lại bắt buộc phải có trong mỗi tệp web.config trang web. Tôi thích điều này chỉ để làm trống giá trị.
KeyOfJ

URLScan là một giải pháp rất phổ biến và, tôi muốn đề xuất, một giải pháp tốt hơn giải pháp tôi đề xuất. Nhưng nó không phải luôn luôn là giải pháp tiện lợi nhất: o)
Owen Blacker

Điều quan trọng cần lưu ý là việc thêm tính năng này vào một trang web có HTTPS và HTTP được kích hoạt (để nó có thể chuyển hướng) sẽ BREAK trang web! Bạn sẽ nhận được 500 thông tin, ngay cả với CustomErrors Mode = "Off", không có lỗi trong nhật ký.
Chris Moschini

@ChrisMoschini Tôi nên rõ ràng hơn rằng dòng Web.config đầu tiên phải dành cho trang web chỉ có SSL.
Owen Blacker

1
@Lenne Scott Hanselman đã viết một mô tả rất hay về lý do tại sao STS không thuộc về tiêu đề trong khi sử dụng HTTP. Đọc thêm tại đây
David Yates

8

Tôi sẽ sử dụng ví dụ từ liên kết Wikipedia mà bạn đã tham chiếu và thực hiện hoạt động trong global.asax cho trang web. Điều này cho phép chuyển hướng yêu cầu đến url https, sau đó chèn tiêu đề vào phản hồi.

Điều này là do tiêu đề HSTS phải được bỏ qua nếu nó không có trong phản hồi 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

Đây có vẻ là một cách khá thất bại an toàn để làm điều này. Thêm mã này vào Global.asax - sự kiện Application_BeginRequest kích hoạt đầu tiên trong vòng đời yêu cầu Asp.net: http://msdn.microsoft.com/en-us/l Library / system.web.httpapplication.beginrequest (v = vs. 110) .aspx

Theo thông số kỹ thuật, các yêu cầu http không được phản hồi với tiêu đề - vì vậy mã này chỉ thêm nó cho các yêu cầu https. Tuổi tối đa tính bằng số giây và thường nên đặt giá trị lớn ở đây (IE - 31536000 cho biết trang web sẽ chỉ chạy SSL trong 365 ngày tiếp theo)

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

Sử dụng ví dụ do Doug Wilson cung cấp, tôi đã tạo hai hàm PowerShell sau để thêm quy tắc viết lại url để chuyển hướng sang HTTPS và để thêm các tiêu đề HSTS.

Chúng đã được thử nghiệm trên Windows 2012 và Windows 2012 R2.

Tất cả bạn cần làm là cung cấp tên trang web. Bạn có thể tùy ý đặt cho các quy tắc một tên khác nếu bạn không thích mặc định.

Một điều cần lưu ý là từ thử nghiệm của tôi, Biến máy chủ cần được thêm vào danh sách cho phép trước khi nằm trong tiêu đề phản hồi. Các chức năng làm điều này cho bạn.

EDIT: Xem tài liệu tham khảo về Url Rewrite cho HTTP Headers tại đây: 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

Theo các nhà sản xuất Mô-đun IIS Bảo mật Giao thông Vận tải Nghiêm, chỉ cần thêm tiêu đề tùy chỉnh là không tuân thủ thông số kỹ thuật dự thảo (RFC 6797).

Bạn thực sự sẽ cần phải cài đặt Mô-đun IIS này để bật HSTS trên IIS 7.

Cập nhật 26 okt 2014 : Nhờ người bình luận bên dưới, tôi đọc lại trang mô-đun và cụ thể là phần chứng minh việc sử dụng mô-đun qua việc thêm các tiêu đề tùy chỉnh.

Máy chủ HSTS KHÔNG PHẢI bao gồm trường tiêu đề STS trong các phản hồi HTTP được truyền tải qua vận chuyển không an toàn.

Nếu bạn chắc chắn chỉ thêm các tiêu đề trong HTTPS và KHÔNG trong HTTP, bạn không cần mô-đun này và bạn có thể sử dụng câu trả lời của Doug Wilson. Không sử dụng câu trả lời của Owen Blacker vì nó không có điều kiện https.


1
Vì vậy, một số câu trả lời khác chỉ gửi tiêu đề đến các yêu cầu HTTPS cũng giải quyết vấn đề này? Hoặc mô-đun của bạn làm điều gì đó khác biệt / bổ sung mà các giải pháp khác không làm được?
slolife

@slolife Mình cập nhật câu trả lời. Bạn có thể sử dụng mã trong câu trả lời của Doug Wilson. Bạn không cần mô-đun này. Tôi thấy bây giờ điều này cũng được thảo luận trong các ý kiến ​​của câu trả lời được chấp nhận. Tôi không biết mô-đun này làm bất cứ điều gì khác biệt / bổ sung mà các giải pháp khác không làm được. Nhưng tôi cũng chưa thực hiện kiểm tra toàn diện mã nguồn .
Chris

Tôi nên rõ ràng hơn rằng Web.config đầu tiên nên được triển khai trong một trang web chỉ có SSL. Tôi sẽ chỉnh sửa câu trả lời của tôi để làm rõ điều đó.
Owen Blacker

1

Điều này có thể được thực hiện bằng cách thêm khối sau vào Web.Config:

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

Chúng tôi phải định cấu hình trên IIS có khả năng tùy chỉnh các tiêu đề để phản hồi:

  • Chuyển đến Trình quản lý dịch vụ thông tin Internet (IIS).
  • Định cấu hình các tiêu đề Phản hồi được thêm vào phản hồi từ máy chủ.
  • Bây giờ thêm Tên tiêu đề tùy chỉnh và Giá trị tùy chỉnh của bạn (Tên và giá trị tiêu đề tùy chỉnh phải giống như trong Web.Config). Bạn có thể tìm thấy trên blog

0

Chỉ cần thêm, tôi thấy trong các ý kiến ​​2 người nói về 500 lỗi khi bạn làm điều này. Tôi đã có điều này.

Nếu bạn gặp lỗi 500 trong IIS thì có thể là do bạn đã thêm quy tắc ở cấp cao nhất, được đặt thành kế thừa và ở cấp trang web.

ví dụ

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

IIS / Trình duyệt dường như không cung cấp cho bạn bất kỳ thông tin nào bạn đã thực hiện việc này, bất kể cài đặt xử lý lỗi của bạn là gì

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.