IIS 10.0 バージョン 1709 HTTP Strict Transport Security (HSTS) のサポート

作成者: Yanbing Shi

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)

RFC 6797 で指定されている HTTP Strict Transport Security (HSTS) を使用すると、Web サイト自体をセキュリティで保護されたホストとして宣言し、HTTPS 接続経由でのみ接続する必要があることをブラウザーに通知できます。 HSTS は、HTTPS を適用して、中間者型攻撃がサーバーとクライアント間の要求と応答をインターセプトする能力を大幅に低下させるオプトイン セキュリティ拡張機能です。

HSTS は、Web サーバーとブラウザーの両方からのサポートを必要とするポリシーを通じて HTTPS の使用を強制します。 HSTS が有効になっている Web ホストは、HTTPS 応答に特別な HTTP 応答ヘッダー "Strict-Transport-Security" (STS) と "max-age" ディレクティブを含めて、以降の通信に HTTPS を使用することをブラウザーに要求できます。 ブラウザーはヘッダーを受け取り、"max-age" ディレクティブで指定された秒数だけ HSTS ポリシーを記憶します。 この期間内にユーザーが同じ Web サイトにアクセスしようとして、「http://」を入力したかスキームを完全に省略した場合、ブラウザーはセキュリティで保護されていないリンクをセキュリティで保護されたもの (https://) に自動的に変換し、サーバーへの HTTPS 接続を行います。 また、ブラウザーは HTTPS 経由で応答を受信すると、ユーザーがセキュリティ警告 (無効なサーバー証明書に関する警告など) を "クリック スルー" できないようにします。 HSTS を利用するには、ブラウザーで HSTS ヘッダーを少なくとも 1 回表示する必要があります。 特定のドメインへの最初の接続でユーザーを保護するために、HSTS には登録されたドメインの一覧をブラウザーに事前に読み込む別のメカニズムがあります。

IIS 10.0 バージョン 1709 より前の HSTS の有効化に関する課題

IIS 10.0 バージョン 1709 より前の場合、IIS サーバーで HSTS を有効にするには複雑な構成が必要です。

IIS 10.0 バージョン 1709 より前の HSTS を有効にするための 2 つの解決策を次の例のシナリオで説明します: Web 管理者は、HTTP と HTTPS の両方の接続を受け入れるドメイン contoso.com に対して HSTS を有効にし、すべての HTTP トラフィックを HTTPS にリダイレクトしたいと考えています。 このシナリオでのリダイレクトは、本質的に安全ではありませんが、依然として、HTTPS をサポートする多くの Web サイトで使用されているパターンです。 HTTP を依然としてリッスンする基本的な理由は、訪問者がどの方法 (HTTPS 経由または単に HTTP 経由) で接続しようとするかを Web サイトが制御できないということです。 HSTS を有効にすると、(直接アクセスまたはリダイレクトを通じて) 最初に成功した HTTPS 接続中にブラウザーに STS ヘッダーが表示されるという条件で、安全でない HTTP から HTTPS へのリダイレクトの数が大幅に減少します。

解決策 1: HTTP リダイレクト モジュール + カスタム ヘッダー

HTTPS へのすべての HTTP トラフィックのリダイレクトを HTTP リダイレクト モジュールで 2 つの別々の Web サイト (1 つは HTTP 用、もう 1 つは 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>

HTTP サイトの web.config で、すべてのトラフィックを HTTPS サイトにルーティングし、後からコンテンツを実際に提供するようにリダイレクト規則を構成します。

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

HTTPS サイトの web.config を構成することで、カスタム ヘッダーを使用して STS ヘッダーを追加できます。

<?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 Rewrite Module

別の解決策として、URL Rewrite Module をインストールし、HTTP と HTTPS の両方のバインドを使用して単一の Web サイトの書き換え規則を構成します。 HTTP から HTTPS へのリダイレクトはインバウンド規則で指定できます。HTTPS 応答への STS ヘッダーの追加はアウトバウンド規則によって実現できます。

<?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>

IIS 10.0 バージョン 1709 ネイティブ HSTS のサポート

IIS 10.0 バージョン 1709 のリリースにより、HSTS がネイティブでサポートされるようになりました。 HSTS を有効にするための構成は大幅に簡略化されています。HSTS は、各 <site> 要素の下に <hsts> 要素の属性を構成することでサイト レベルで有効にすることができます。詳細については、HSTS の構成リファレンス「Web サイトの HSTS 設定 <HSTS>」を参照してください。

この例のシナリオは、チュートリアルに従って IISAdministration PowerShell コマンドレットを使用して、Web サイトの <hsts> 要素の enabledmax-ageredirectHttpToHttps 属性を構成するだけで実現できます。

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

この Web サイトの 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 リダイレクト モジュールと共に使用することもできます。

たとえば、Web サイト contoso.com は、すべてのトラフィックをサブドメイン www.contoso.com にリダイレクトし、この両方の Web サイトが HTTP と HTTPS の接続を受け入れます。 これは、Web サイトが単一の正規アドレスを持つことが望ましい場合の一般的なシナリオです。 HSTS は、ルート ドメインとサブドメインの両方に対して有効にすることをお勧めします。ユーザーが HTTP または HTTPS のどちらでも直接アクセスできるためです。 ルート ドメインの <hsts> 要素の includeSubDomains 属性を有効にすると、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>

さらに、ルート ドメインからサブドメインへのリダイレクトは、ルート ドメイン サイトの web.config 内で <httpRedirect> 要素を使用して構成できます。 このような構成にすると、最初に contoso.com への HTTP 要求が HTTPS にリダイレクトされ、次に同じサイトへの HTTPS 要求が、応答に STS ヘッダーが追加された状態で www.contoso.com にリダイレクトされます。

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

上記のサンプル構成は、ソース サイトの includeSubDomains を無効にするというマイナーな構成変更を加えて、ソース サイトからソース サイトのサブドメインではない宛先サイトにトラフィックをリダイレクトするシナリオにも適用されます。