Вопрос: Включить HTTP Strict Transport Security (HSTS) в IIS 7


Каков наилучший способ включения Строгая транспортная безопасность HTTP на веб-сервере IIS 7?

Могу ли я просто через графический интерфейс и добавить правильный заголовок ответа HTTP, или я должен использовать appcmd, и если да, то какие переключатели?


69
2017-08-13 21:23


Источник


От этого зависит многое как вы создаете материал, обслуживающий IIS (например, вы можете установить заголовок на PHP или ASP.NET-страницах из вашего приложения). Не могли бы вы рассказать нам больше о вашем случае использования? - voretaq7


Ответы:


IIS возможность добавлять пользовательские заголовки к ответам, Казалось бы, это самый простой способ сделать это.

Согласно документации по IIS.net вы можете добавить эти заголовки через диспетчер IIS:

  • На панели «Соединения» перейдите на сайт, приложение или каталог, для которого вы хотите настроить собственный HTTP-заголовок.
  • На панели «Домой» дважды щелкните заголовки ответов HTTP.
  • В области заголовков HTTP-ответов нажмите Добавить ... на панели «Действия».
  • В диалоговом окне «Добавить пользовательский HTTP-ответ» задайте имя и значение для своего настраиваемого заголовка и нажмите «ОК».

17
2017-08-13 21:37



Это также возможно сделать в Web.config, который вы можете предпочесть. Я опубликовал детали как новый ответ, так как их было бы очень трудно читать без форматирования исходного кода, недоступного в комментариях. - Owen Blacker
По словам создателей Модуль строгой транспортной безопасности HTTP IIS, просто добавление настраиваемого заголовка не соответствует спецификации проекта (RFC 6797). Вам действительно нужно установить этот модуль IIS. - Chris
@ Крис Они (вроде бы) ошибаются. Не о спецификации - они абсолютно верны там, но о том, что нет «простого» способа уклониться от их модуля: просто создайте 2 сайта, один для SSL (с заголовком) и один для не-SSL ( без заголовка). Конечно, модуль немного больше элегантный, но это не необходимо (и не гарантируется вообще, если ваш сайт является https-only, и вы не используете простые HTTP-ответы). - voretaq7
@Chris Вам следует добавить ответ, ссылающийся на этот модуль, хотя - бесплатные upvotes! (Я не знал о его существовании, и для многих людей это, вероятно, более простой / лучший вариант, чем пользовательский материал заголовка) - voretaq7


Это позволяет нам обрабатывать как перенаправление HTTP, так и добавлять заголовок Strict-Transport-Security в HTTPS-ответы с одного сайта IIS (должен быть установлен модуль Rewrite 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}/{R:1}"
                        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" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

100
2017-09-18 17:05



Спасибо, это лучший ответ! Добавляет заголовок к статическим файлам HTML тоже, в отличие от программного подхода. И не добавляет к HTTP, таким образом, соответствующий стандарту. - Jeow Li Huan
Когда я добавляю это в мой раздел <system.webServer> файла web.config, я получаю ошибку 500 на моих страницах asp.net. Кажется, что для этого узла не существует дочерний элемент <rewrite> (msdn.microsoft.com/en-us/library/ms689429.aspx). - Mathemats
@Mathemats У вас есть URL Rewrite, установленный в IIS? - Doug Wilson
Нет, после дополнительных исследований выяснилось, что тег перезаписи предоставляется расширением (d'oh). Все ответы, которые я мог найти, не упоминают расширение как зависимость, возможно, вы могли бы бросить один лайнер в свой ответ, говоря, что вам это нужно. - Mathemats
hstspreload.org хочет, чтобы пользователь добавил `; includeSubDomains; preload` после максимального значения возраста. опции. Полная линия: <action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" /> чтобы получить проходить на hstspreload.org - JP Hellemons


В дополнение voretaq7, вы также можете сделать это с помощью файла Web.config (NB: для использования только для сайтов SSL, поскольку он добавит заголовок для ответов HTTP и HTTPS, что противоречит спецификации RFC 6797, см. ниже) - добавьте блок следующим образом:

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

Очевидно, что у вас, возможно, уже есть system.webServer блок в вашем Web.config, поэтому добавьте это к этому, если это так. Мы предпочитаем обрабатывать вещи в Web.config, а не в графическом интерфейсе, потому что это означает, что изменения конфигурации могут быть переданы в наш репозиторий Git.

Если вы хотите обработать перенаправление HTTP-SSL, Грег Аскью вам может быть проще сделать это с помощью отдельного веб-сайта в IIS. Вот как мы обрабатываем SSL для некоторых клиентских сайтов. Этот сайт содержит только HTTP-перенаправление и некоторые информационно-раскрытие исправления, все в 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>

Это наше предпочтительное решение по нескольким причинам: мы можем легко записывать перенаправленный трафик отдельно (как в другом журнале IIS), он не включает больше кода в Global.asax.cs (у нас нет никакого кода там, что немного удобнее для сайта Umbraco), и, что важно, это означает, что вся конфигурация сохраняется в нашем реестре GIT.

Отредактировано для добавления: Чтобы быть ясным, чтобы соответствовать RFC 6797, Strict-Transport-Security настраиваемый заголовок НЕ ДОЛЖЕН быть добавлены к запросам, сделанным незашифрованным HTTP. Чтобы быть совместимым с RFC6797, вы должны иметь два сайта в IIS, как я описал после первого блока кода. В виде Крис указывает, RFC 6797 включает в себя:

Хост HSTS НЕ ДОЛЖЕН включают поле заголовка STS в ответах HTTP, передаваемых по незащищенному транспорту.

поэтому отправьте Strict-Transport-Security заголовок клиента в ответ на запрос без SSL не будет соответствовать спецификации.


36
2018-03-20 15:06



Чтобы добавить к Owen Blacker ответ, для IIS я использую URLScan 3.1 и глобально удаляю SERVER из ответа, установив RemoveServerHeader = 1, остальные настройки должны быть указаны в каждом файле web.config сайта. Я предпочитаю это просто гасить значение. - KeyOfJ
URLScan - очень распространенное решение, и я бы предложил, лучший, чем тот, который я предлагаю. Но это не всегда самое удобное решение: o) - Owen Blacker
Важно отметить, что добавление этого на сайт с HTTPS и HTTP-поддержкой (поэтому он может перенаправлять) будет BREAK на сайте! Вы получите информационный 500, даже с CustomErrors Mode = «Off», без ошибок в журналах. - Chris Moschini
@ChrisMoschini Мне следовало бы уточнить, что первая строка Web.config должна быть для сайта только для SSL. - Owen Blacker
Почему запрет Strict-Transport-Security не поддерживается SSL? Это будет показатель для браузера, который изменится на https. Ошибка в спецификации, или есть конкретная причина? - Lenne


Я бы использовал этот пример из ссылки Википедии, на которую вы ссылались, и выполнял действия в 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;
    }
}

8
2017-08-13 23:40





Кажется, это довольно безопасный способ сделать это. Добавьте этот код в Global.asax - событие Application_BeginRequest запускается сначала в жизненном цикле запроса Asp.net: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs.110).aspx

По спецификациям HTTP-запросы не должны отвечать заголовком, поэтому этот код только добавляет его для запросов https. Max-age занимает несколько секунд, и обычно неплохо было бы здесь добавить большое значение (IE - 31536000 указывает, что сайт будет запускать SSL только в течение следующих 365 дней)

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;
  }
}

3
2018-03-20 03:20





По словам разработчиков модуля строгой безопасности TCP IIS, просто добавление настраиваемого заголовка не соответствует проекту спецификации (RFC 6797).

Вам действительно нужно установить это Модуль IIS включить HSTS на IIS 7.

Обновление 26 октября 2014 года: Благодаря комментатору ниже я снова прочитал страницу модуля и, в частности, ту часть, которая оправдывает использование модуля над добавлением пользовательских заголовков.

Хост HSTS НЕ ДОЛЖЕН включать поле заголовка STS в ответах HTTP, передаваемых по незащищенному транспорту.

Если вы обязательно добавляете заголовки только в HTTPS и НЕ в HTTP, вам не нужен этот модуль, и вы можете использовать ответ Дуга Уилсона. Не используйте ответ Owen Blacker, потому что у него нет условия https.


1
2018-03-03 21:14



Так что некоторые другие ответы, которые отправляют только заголовок в запросы HTTPS, также решают эту проблему? Или ваш модуль делает что-то другое / дополнительное, чего нет у других решений? - slolife
@slolife Я обновил свой ответ. Вы можете использовать код в ответе Дуга Уилсона. Вам не нужен этот модуль. Теперь я вижу, что это также обсуждается в комментариях принятого ответа. Я не знаю, как этот модуль делает что-то другое / дополнительное, чего нет в других решениях. Но я не сделал исчерпывающей проверки исходный код или. - Chris
Я должен был бы уточнить, что первый Web.config должен быть реализован на сайте только для SSL. Я отредактирую свой ответ, чтобы уточнить это. - Owen Blacker


Используя пример, предоставленный Дугом Уилсоном, я создал следующие две функции PowerShell, чтобы добавить правила перезаписи URL для перенаправления на HTTPS и для добавления заголовков HSTS.

Они были протестированы в Windows 2012 и Windows 2012 R2.

Все, что вам нужно сделать, это указать имя веб-сайта. Вы можете при желании дать правилам другое имя, если вам не нравятся значения по умолчанию.

Следует отметить, что из моего тестирования переменные сервера необходимо добавлять в список разрешений перед тем, как быть в заголовках ответов. Функции делают это для вас.

РЕДАКТИРОВАТЬ: См. Ссылку на Url Rewrite для заголовков HTTP здесь: 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
2018-02-04 16:51





Это можно сделать, добавив следующий блок в Web.Config:                                 

Мы должны настроить IIS, который имеет возможность настраивать заголовки для ответа:

  • Перейдите в диспетчер служб IIS.
  • Настройте заголовки ответов, которые добавляются к ответу с сервера.
  • Теперь добавьте свой собственный заголовок. Имя и пользовательское значение. (Имя пользовательского заголовка и значение должны быть такими же, как в Web.Config). Вы можете найти блог

0
2017-12-15 13:39