Поделиться через


Поддержка служб IIS 10.0 версии 1709 HTTP Strict Transport Security (HSTS)

Янбин Ши

В IIS 10.0 версии 1709 администратор может включить перенаправление HSTS и HTTP на HTTPS на уровне сайта.

Совместимость

Версия Примечания
IIS 10.0 версии 1709 Функции, описанные в этой статье, были представлены в IIS 10.0 версии 1709
IIS 10.0 и более ранние версии Функции, описанные в этой статье, не поддерживались до IIS 10.0 версии 1709

HTTP Strict Transport Security (HSTS)

Http Strict Transport Security (HSTS), указанный в RFC 6797, позволяет веб-сайту объявить себя защищенным узлом и информировать браузеры о том, что с ним следует связываться только через HTTPS-подключения. HSTS — это расширение безопасности, которое обеспечивает принудительное применение ПРОТОКОЛА HTTPS и значительно снижает возможность атак типа "злоумышленник в середине" для перехвата запросов и ответов между серверами и клиентами.

HSTS обеспечивает использование HTTPS с помощью политики, которая требует поддержки веб-серверов и браузеров. Веб-узел с поддержкой HSTS может включать специальный заголовок HTTP-ответа Strict-Transport-Security (STS) и директиву max-age в ответе HTTPS, чтобы запросить у браузера использование HTTPS для дальнейшего взаимодействия. Браузер получает заголовок и запоминает политику HSTS на количество секунд, указанное в директиве max-age. В течение этого периода, если пользователь пытается посетить тот же веб-сайт, но вводит http:// или вообще пропускает схему, браузер автоматически переключит небезопасную ссылку на безопасный (https://) и установит HTTPS-подключение к серверу. После получения ответа по протоколу HTTPS браузер также запрещает пользователю "щелкать" любое предупреждение системы безопасности (например, предупреждение о недопустимом сертификате сервера). Чтобы воспользоваться преимуществами HSTS, браузер должен видеть заголовок HSTS по крайней мере один раз. Чтобы защитить пользователя в первом подключении к заданному домену, служба HSTS имеет отдельный механизм предварительной загрузки списка зарегистрированных доменов в браузер из коробки.

Проблемы при включении HSTS до IIS 10.0 версии 1709

До iis 10.0 версии 1709 включение HSTS на сервере IIS требует сложной настройки.

Два решения для включения HSTS до IIS 10.0 версии 1709 приведены в качестве примера: веб-администратор хочет включить HSTS для домена contoso.com, который принимает подключения HTTP и HTTPS, и перенаправлять весь трафик HTTP в HTTPS. Перенаправление в этом сценарии небезопасно по своей природе, но по-прежнему является шаблоном, за которым следуют многие веб-сайты, поддерживающие HTTPS. Основная причина, по-прежнему прослушивающая HTTP, заключается в том, что веб-сайт не имеет контроля над тем, как посетители могут попытаться подключить его - через HTTPS или просто простой HTTP. Включение HSTS значительно сокращает количество небезопасных перенаправлений HTTP в HTTPS при условии, что браузер увидит заголовок STS во время первого успешного httpS-подключения (через прямой визит или перенаправление).

Решение 1. Модуль перенаправления HTTP + пользовательские заголовки

Чтобы избежать бесконечного цикла перенаправления, можно перенаправить весь трафик HTTP на HTTPS с помощью модуля перенаправления HTTP с двумя отдельными веб-сайтами, одним из них — для HTTPS, а другим — для HTTPS.

<sites>
    <site name="Contoso-http" id="1" serverAutoStart="true">
        <application path="/" applicationPool="Contoso-http">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-http" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:contoso.com" />
        </bindings>
    </site>
    <site name="Contoso-https" id="2" serverAutoStart="true">
        <application path="/" applicationPool="Contoso-https">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-https" />
        </application>
        <bindings>
            <binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
        </bindings>
    </site>
    <siteDefaults>
        <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
        <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
    </siteDefaults>
    <applicationDefaults applicationPool="DefaultAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

Правило перенаправления настраивается в web.config HTTP-сайта для маршрутизации всего трафика на сайт HTTPS, а последующий фактически обслуживает содержимое.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="https://contoso.com" httpResponseStatus="Permanent" />
    </system.webServer>
</configuration>

Заголовок STS можно добавить с помощью пользовательских заголовков , настроив web.config сайта HTTPS.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

Решение 2. Модуль переопределения URL-адресов

Альтернативным решением является установка модуля переопределения URL-адресов и настройка правил перезаписи для одного веб-сайта с привязками HTTP и HTTPS. Перенаправление HTTP на HTTPS может быть задано правилом для входящего трафика, а добавление заголовка STS в ответы HTTPS может быть достигнуто с помощью правила для исходящего трафика.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add the STS header in HTTPS responses">
                    <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

Поддержка собственных служб HSTS iis 10.0 версии 1709

В выпуске IIS 10.0 версии 1709 HSTS теперь поддерживается изначально. Настройка включения HSTS значительно упрощена. HSTS можно включить на уровне сайта, настроив атрибуты <hsts> элемента под каждым <site> элементом. Дополнительные сведения см. в справочнике по конфигурации HSTS HSTS Settings for a Web Site <HSTS HSTS>.

Пример сценария можно просто реализовать, настроив enabledатрибуты , max-ageи redirectHttpToHttps элемента <hsts> веб-сайта с помощью командлетов PowerShell IISAdministration, описанных в этом руководстве.

Import-Module IISAdministration
Reset-IISServerManager -Confirm:$false
Start-IISCommitDelay

$sitesCollection = Get-IISConfigSection -SectionPath "system.applicationHost/sites" | Get-IISConfigCollection
$siteElement = Get-IISConfigCollectionElement -ConfigCollection $sitesCollection -ConfigAttribute @{"name"="Contoso"}
$hstsElement = Get-IISConfigElement -ConfigElement $siteElement -ChildElementName "hsts"
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "enabled" -AttributeValue $true
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "max-age" -AttributeValue 31536000
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "redirectHttpToHttps" -AttributeValue $true

Stop-IISCommitDelay
Remove-Module IISAdministration

Ниже приведены конфигурации HSTS для веб-сайта.

<site name="Contoso" id="1">
    <application path="/" applicationPool="Contoso">
        <virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:80:contoso.com" />
        <binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
    </bindings>
    <hsts enabled="true" max-age="31536000" redirectHttpToHttps="true" />
</site>

Встроенную поддержку HSTS также можно использовать вместе с модулем перенаправления HTTP для более сложных сценариев.

Например, веб-сайт contoso.com перенаправляет весь трафик в поддомен www.contoso.com, и оба веб-сайта принимают подключения HTTP и HTTPS. Это типичный сценарий, если веб-сайт предпочтительнее иметь один канонический адрес. HSTS рекомендуется включить как для корневого домена, так и для поддомена, так как пользователи могут напрямую посещать один из них по протоколу HTTP или HTTPS. Включение includeSubDomains атрибута <hsts> элемента корневого домена еще больше расширяет охват политики HSTS для всех ее поддоменов.

<sites>
    <site name="Contoso" id="1">
        <application path="/" applicationPool="Contoso">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:contoso.com" />
            <binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
        </bindings>
        <hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />
    </site>
    <site name="Contoso-www" id="2">
        <application path="/" applicationPool="Contoso-www">
            <virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-www" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:www.contoso.com" />
            <binding protocol="https" bindingInformation="*:443:www.contoso.com" sslFlags="0" />
        </bindings>
        <hsts enabled="true" max-age="31536000" redirectHttpToHttps="true" />
    </site>
    <siteDefaults>
        <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
        <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
    </siteDefaults>
    <applicationDefaults applicationPool="DefaultAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

Кроме того, перенаправление из корневого домена в поддомен можно настроить с помощью <httpRedirect> элемента в web.config сайта корневого домена. При такой конфигурации HTTP-запрос к contoso.com сначала будет перенаправляться на HTTPS, а затем HTTPS-запрос на тот же сайт будет перенаправлен на www.contoso.com с заголовком STS, добавленным в ответ.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="https://www.contoso.com" httpResponseStatus="Permanent" />
    </system.webServer>
</configuration>

Приведенные выше примеры конфигураций также применяются к сценарию перенаправления includeSubDomains трафика с исходного сайта на целевой сайт, который не является поддоменом исходного сайта, с незначительным изменением конфигурации отключения для исходного сайта.