Bagikan melalui


Dukungan IIS 10.0 Versi 1709 HTTP Strict Transport Security (HSTS)

oleh Yanbing Shi

Di IIS 10.0 versi 1709, administrator memiliki opsi untuk mengaktifkan pengalihan HSTS dan HTTP ke HTTPS di tingkat situs.

Kompatibilitas

Versi Catatan
IIS 10.0 versi 1709 Fitur yang dijelaskan dalam artikel ini diperkenalkan dalam IIS 10.0 versi 1709
IIS 10.0 dan yang lebih lama Fitur yang dijelaskan dalam artikel ini tidak didukung sebelum IIS 10.0 versi 1709

HTTP Strict Transport Security (HSTS)

HTTP Strict Transport Security (HSTS), yang ditentukan dalam RFC 6797, memungkinkan situs web untuk menyatakan dirinya sebagai host yang aman dan untuk memberi tahu browser bahwa itu harus dihubungi hanya melalui koneksi HTTPS. HSTS adalah peningkatan keamanan keikutsertaan yang memberlakukan HTTPS dan secara signifikan mengurangi kemampuan serangan jenis man-in-the-middle untuk mencegat permintaan dan respons antara server dan klien.

HSTS memberlakukan penggunaan HTTPS melalui kebijakan yang memerlukan dukungan dari server web dan browser. Host web dengan dukungan HSTS dapat menyertakan header respons HTTP khusus "Strict-Transport-Security" (STS) bersama dengan arahan "usia maksimal" dalam respons HTTPS untuk meminta browser menggunakan HTTPS untuk komunikasi lebih lanjut. Browser menerima header , dan menghafal kebijakan HSTS untuk jumlah detik yang ditentukan oleh direktif "usia maks". Dalam periode ini, jika pengguna mencoba mengunjungi situs web yang sama tetapi mengetik http:// atau menghilangkan skema sama sekali, browser akan secara otomatis mengubah tautan yang tidak aman ke yang aman (https://) dan membuat koneksi HTTPS ke server. Setelah respons diterima melalui HTTPS, browser juga mencegah pengguna "mengklik" peringatan keamanan apa pun (misalnya peringatan tentang sertifikat server yang tidak valid). Untuk memanfaatkan HSTS, browser harus melihat header HSTS setidaknya sekali. Untuk melindungi pengguna dalam koneksi pertama ke domain tertentu, HSTS memiliki mekanisme terpisah untuk memuat daftar domain terdaftar ke browser di luar kotak.

Tantangan dalam Mengaktifkan HSTS sebelum IIS 10.0 Versi 1709

Sebelum IIS 10.0 versi 1709, mengaktifkan HSTS pada server IIS memerlukan konfigurasi yang kompleks.

Dua solusi untuk mengaktifkan HSTS sebelum IIS 10.0 versi 1709 disediakan untuk skenario contoh: administrator web ingin mengaktifkan HSTS untuk domain contoso.com yang menerima koneksi HTTP dan HTTPS dan untuk mengalihkan semua lalu lintas HTTP ke HTTPS. Pengalihan dalam skenario ini tidak aman secara alami, tetapi masih merupakan pola yang diikuti oleh banyak situs web yang mendukung HTTPS. Alasan mendasar untuk masih mendengarkan HTTP adalah bahwa situs web tidak memiliki kontrol atas bagaimana pengunjung dapat mencoba menghubungkannya - melalui HTTPS atau hanya HTTP biasa. Mengaktifkan HSTS sangat mengurangi jumlah pengalihan HTTP ke HTTPS yang tidak aman dalam kondisi browser melihat header STS selama koneksi HTTPS pertama yang berhasil (baik melalui kunjungan langsung atau melalui pengalihan).

Solusi 1: Modul Pengalihan HTTP + Header Kustom

Mengalihkan semua lalu lintas HTTP ke HTTPS dapat dicapai menggunakan Modul Pengalihan HTTP dengan dua situs web terpisah, satu untuk HTTP dan yang lainnya untuk HTTPS, untuk menghindari perulangan pengalihan tak terbatas.

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

Aturan pengalihan dikonfigurasi di web.config situs HTTP untuk merutekan semua lalu lintasnya ke situs HTTPS, dan yang selanjutnya benar-benar melayani konten.

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

Header STS dapat ditambahkan melalui Header Kustom dengan mengonfigurasi web.config situs 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>

Solusi 2: Modul Penulisan Ulang URL

Solusi alternatif adalah menginstal Modul Penulisan Ulang URL dan mengonfigurasi aturan penulisan ulang untuk satu situs web dengan pengikatan HTTP dan HTTPS. Pengalihan HTTP ke HTTPS dapat ditentukan oleh aturan masuk sambil menambahkan header STS ke balasan HTTPS dapat dicapai dengan aturan keluar.

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

Dukungan HSTS Asli IIS 10.0 Versi 1709

Dengan rilis IIS 10.0 versi 1709, HSTS sekarang didukung secara asli. Konfigurasi untuk mengaktifkan HSTS disederhanakan <hsts> secara signifikan - HSTS dapat diaktifkan di tingkat situs dengan mengonfigurasi atribut elemen di bawah setiap <site> elemen - detail lebih lanjut dapat ditemukan dalam referensi konfigurasi Pengaturan HSTS HSTS untuk HSTS> Situs <Web.

Contoh skenario hanya dapat dicapai dengan mengonfigurasi enabledatribut , , max-agedan redirectHttpToHttps dari <hsts> elemen situs web menggunakan cmdlet IISAdministration PowerShell mengikuti tutorial.

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

Konfigurasi HSTS untuk situs web ditunjukkan di bawah ini:

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

Dukungan asli HSTS juga dapat digunakan bersama dengan Modul Pengalihan HTTP untuk skenario yang lebih kompleks.

Misalnya, situs web contoso.com mengalihkan semua lalu lintas ke subdomainnya www.contoso.com, dan kedua situs web menerima koneksi HTTP dan HTTPS. Ini adalah skenario umum jika situs web lebih disukai untuk memiliki satu alamat kanonis. HSTS disarankan untuk diaktifkan untuk domain akar dan subdomain karena pengguna dapat langsung mengunjungi salah satunya melalui HTTP atau HTTPS. Mengaktifkan includeSubDomains atribut <hsts> elemen domain akar semakin meningkatkan cakupan kebijakan HSTS ke semua subdomainnya.

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

Selain itu, pengalihan dari domain akar ke subdomain dapat dikonfigurasi melalui <httpRedirect> elemen di web.config situs domain akar. Dengan konfigurasi tersebut, permintaan HTTP ke contoso.com pertama-tama akan dialihkan ke HTTPS, dan kemudian permintaan HTTPS ke situs yang sama akan dialihkan ke www.contoso.com dengan header STS yang ditambahkan dalam respons.

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

Konfigurasi sampel di atas juga berlaku untuk skenario pengalihan lalu lintas dari situs sumber ke situs tujuan yang bukan subdomain situs sumber, dengan modifikasi konfigurasi kecil untuk menonaktifkan includeSubDomains situs sumber.