IIS 7'de HTTP Sıkı Aktarım Güvenliğini (HSTS) Etkinleştirme


75

IIS 7 web sunucusunda HTTP Sıkı Aktarım Güvenliği'ni açmanın en iyi yolu nedir ?

Sadece GUI üzerinden girip uygun HTTP yanıt başlığını ekleyebilir miyim, yoksa appcmd kullanmalı mıyım, öyleyse ne değişir?


1
Bunların çoğu, IIS'nin sunduğu şeyleri nasıl oluşturduğunuza bağlıdır (örneğin, PHP veya ASP.NET sayfalarındaki başlıkları uygulamanızdan ayarlayabilirsiniz). Bize kullanım durumunuz hakkında daha fazla bilgi verir misiniz?
voretaq7

Yanıtlar:


18

IIS, yanıtlara özel başlıklar ekleme yeteneğine sahiptir . Bu, bunu yapmanın en kolay yolu gibi görünüyor.

IIS.net'teki belgelere göre, bu başlıkları IIS Yöneticisi'nden ekleyebilirsiniz:

  • Bağlantılar bölmesinde, özel bir HTTP üstbilgisi ayarlamak istediğiniz siteye, uygulamaya veya dizine gidin.
  • Giriş bölmesinde, HTTP Yanıt Başlıkları'nı çift tıklatın.
  • HTTP Yanıt Başlıkları bölmesinde, Eylemler bölmesinde Ekle ... 'yi tıklayın.
  • Özel HTTP Yanıt Başlığı Ekle iletişim kutusunda, özel başlığınızın adını ve değerini ayarlayın ve ardından Tamam'ı tıklayın.

5
Bunu, tercih edebileceğiniz Web.config dosyasında yapmak da mümkündür. Ayrıntıları yeni bir cevap olarak gönderdim, çünkü yorumlarda bulunmayan kaynak kod biçimlendirmesi olmadan okumak gerçekten zor olacak.
Owen Blacker

3
HTTP Sıkı Aktarım Güvenliği IIS Modülü'nün üreticilerine göre , yalnızca özel başlığın eklenmesi, taslak belirtimiyle (RFC 6797) uyumlu değildir. Aslında bu IIS Modülünü kurmanız gerekir.
Chris

@Chris Onlar yanlış (tür). Teknik özelliklerle ilgili değil - orada kesinlikle haklılar - ancak modüllerinden ayrı olarak uymanın "basit" bir yolu olmadığı için: Sadece bir site için SSL (başlıklı) ve bir tane de SSL olmayanlar için 2 site oluşturun başlık olmadan). Elbette ki modül biraz daha şık , ama gerekli değil (siteniz sadece https ise ve düz HTTP yanıtları vermiyorsanız garanti edilmez).
voretaq7

1
@Chris Bu modüle atıfta bulunan bir cevap eklemelisiniz - ücretsiz yükseltme! (Onun varlığından haberdar değildim ve birçok insan için muhtemelen özel başlık başlığından daha kolay / daha iyi bir seçenek)
voretaq7

112

Bu, hem HTTP yönlendirmesini yönetmemize hem de Strict-Transport-Security üstbilgisini tek bir IIS sitesiyle HTTPS yanıtlarına eklememize olanak tanır (URL Rewrite modülü kurulmalıdır):

<?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
Teşekkürler, bu en iyi cevap! Programatik yaklaşımın aksine, başlığı statik HTML dosyalarına da ekler. Ve HTTP'ye eklenmez, bu nedenle standarda uygundur.
Jeow Li Huan

4
@Mathemats IIS'de URL Rewrite kurulu mu?
Doug Wilson,

3
Hayır, daha fazla araştırmadan sonra yeniden yazma etiketinin uzantı (d'oh) tarafından sağlandığını öğrendim. Bulduğum tüm cevaplar bu uzantıya bağımlılık olarak bahsetmiyor, belki de cevabınıza ihtiyaç duyduğunuzu söyleyerek bir liner atabilirsiniz.
Mathemats

2
hstspreload.org kullanıcının `eklemek istediğini;` includeSubDomains; Maksimum yaş değerinden sonra önyük`. seçenekler. Tam satır olur: <action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />Bir almak için geçiş hstspreload.org üzerinde
JP HELLEMONS

2
Desen (. *) İçeren R: 1 yakalama grubu URL'nin, protokolün ve hepsinin tümü ile eşleşiyor ve {HTTP_HOST} / {R: 1} birleştirmeye çalışıyorsun, aldığın https://somedomain.com/https://somedomain.com/relatedpathve sonuç yolun düştüğü anlamına geliyor.
AaronLS

38

Tamamlamak için voretaq7 cevabını, ayrıca Web.config dosyasını kullanarak bu yapabilirdi (Not: bu RFC 6797 şartnamesine karşı olan HTTP ve HTTPS yanıtları hem başlığını katacak beri, yalnızca SSL siteleri için kullanılmak üzere lütfen aşağıdaki açıklamaya bakınız) - aşağıdaki gibi bir blok ekleyin:

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

Açıkçası, system.webServerWeb.config'inizde zaten bir blok olabilir , öyleyse bunu ekleyin. Konfigürasyon değişikliklerinin Git depomuzda gerçekleştirilebileceği anlamına geldiği için GUI yerine Web.config'teki şeyleri kullanmayı tercih ediyoruz.

HTTP-SSL yönlendirmesini, Greg Askew'in dediği gibi ele almak istiyorsanız, bunu IIS'de ayrı bir web sitesiyle yapmayı daha kolay bulabilirsiniz. Bazı müşteri siteleri için SSL talep etme yöntemimiz budur. Bu site, yalnızca bir Web yönlendirmesi ve Web.config dosyasındaki bazı bilgileri açıklama düzeltmeleri içerir:

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

Bu, birkaç nedenden dolayı bizim tercih ettiğimiz çözümdür - yönlendirilen trafiği ayrı ayrı kolayca kaydedebiliriz (farklı bir IIS günlüğünde olduğu gibi), Global.asax.cs içinde daha fazla kod içermez (herhangi bir kodumuz yok) Orada bir Umbraco sitesi için biraz daha uygun olan) ve daha da önemlisi, tüm yapılandırmaların hala GIT depomuzda tutulduğu anlamına gelir.

Eklemek Düzenlendi: uymak amacıyla, Açık olmak gerekirse RFC 6797 , Strict-Transport-Securityözel başlık ZORUNLU şifrelenmemiş HTTP ile yapılan isteklere eklenecektir. RFC6797 uyumlu olmak için, ilk kod bloğundan sonra tanımladığım gibi IIS'de iki siteniz olması GEREKİR. Chris'in işaret ettiği gibi , RFC 6797 şunları içerir:

Bir HSTS Sunucu ZORUNLU güvenli olmayan bir aktarım üzerinden iletilen HTTP yanıtları STS başlık alanı bulunmaktadır.

bu nedenle, Strict-Transport-SecuritySSL’ye ait olmayan bir talebe yanıt olarak müşteri başlığının gönderilmesi şartnameye uygun olmaz.


1
Owen Blacker yanıtına eklemek için, IIS için URLScan 3.1 kullanıyorum ve RemoveServerHeader = 1'i ayarlayarak SUNUCU'nun genel olarak SERVER'ı kaldırmasını sağladım, ayarların geri kalanı her sitenin web.config dosyasında olmasını zorunlu kıldı. Bunu sadece değeri boşaltmayı tercih ediyorum.
KeyOfJ

URLScan çok yaygın bir çözümdür ve önerdiğimden daha iyi bir çözümdür. Ancak bu her zaman en uygun çözüm değildir: o)
Owen Blacker

Bunu HTTPS ve HTTP etkin olan bir siteye eklemenin (böylece yeniden yönlendirebilir) siteyi BREAK yapacağına dikkat etmek önemlidir! Günlüklerde hiçbir hata olmadan CustomErrors Mode = "Off" ile bile bilgisiz bir 500 elde edersiniz.
Chris Moschini

@ChrisMoschini İlk Web.config satırının yalnızca SSL sitesi için olması gerektiği konusunda daha net olmalıydım.
Owen Blacker,

1
@Lenne Scott Hanselman, HTTP kullanırken STS'nin neden başlığa ait olmadığına dair daha iyi bir açıklama yazdı. Burada
David Yates

8

Başvurduğunuz Wikipedia bağlantısından gelen örneği kullanır ve etkinliği site için global.asax'ta gerçekleştiririm. Bu, isteğin bir https URL'sine yönlendirilmesini ve ardından başlığın cevabına yerleştirilmesini sağlar.

Bunun nedeni HSTS başlığının bir https yanıtında olmaması durumunda göz ardı edilmesi gerektiğidir.

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

Bu, bunu yapmanın oldukça başarısız güvenli bir yol gibi görünüyor. Global.asax'a bu kodu ekleyin - Application_BeginRequest olayı ilk önce Asp.net istek yaşam döngüsünde başlatılır: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs. 110) .Aspx

Spesifikasyona göre, http istekleri başlığa cevap vermemelidir - bu nedenle bu kod sadece https istekleri için ekler. Maksimum yaş saniye cinsindendir ve buraya büyük bir değer koymak genellikle iyi bir fikirdir (IE - 31536000, sitenin yalnızca sonraki 365 gün boyunca SSL’yi çalıştıracağını gösterir)

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

Doug Wilson tarafından sağlanan örneği kullanarak HTTPS'ye yeniden yönlendirme ve HSTS başlıkları eklemek için URL yeniden yazma kuralları eklemek için aşağıdaki iki PowerShell işlevini oluşturdum.

Bunlar, Windows 2012 ve Windows 2012 R2'de test edilmiştir.

Yapmanız gereken tek şey web sitesi adını vermektir. Varsayılanları beğenmezseniz, isteğe bağlı olarak kuralları farklı bir ad verebilirsiniz.

Unutulmaması gereken nokta, testlerimden itibaren, Sunucu Değişkenlerinin yanıt başlıklarına girmeden önce izin verilenler listesine eklenmesi gerektiğidir. Fonksiyonlar bunu sizin için yapar.

EDIT: Burada HTTP Başlıkları için URL Yeniden Yazma referansına bakın: 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

HTTP Sıkı Aktarım Güvenliği IIS Modülü'nün üreticilerine göre, yalnızca özel başlığın eklenmesi, taslak belirtimiyle (RFC 6797) uyumlu değildir.

HSTS'yi IIS 7'de açmak için aslında bu IIS Modülünü yüklemeniz gerekir .

Güncelleme 26 okt 2014 : Aşağıdaki yorumcu sayesinde, modül sayfasını tekrar okudum ve özellikle modülün kullanımını özel başlıklar eklemeye uygun kılan kısmı okudum.

Bir HSTS Sunucusu, STS başlık alanını güvenli olmayan taşıma üzerinden iletilen HTTP yanıtlarına dahil ETMEMELİDİR.

Başlıkları yalnızca HTTPS’de ve HTTP’de DEĞİL’i eklediğinizden emin olursanız, bu modüle ihtiyacınız olmaz ve yanıtı Doug Wilson tarafından kullanabilirsiniz. Owen Blacker'in cevabını kullanmayın çünkü https koşulu yoktur.


1
Peki, başlığı yalnızca HTTPS isteklerine gönderen diğer yanıtların bazıları da bu sorunu çözüyor mu? Yoksa modülünüz diğer çözümlerden farklı / ekstra bir şey mi yapıyor?
slolife

@slolife Cevabımı güncelledim. Kodu Doug Wilson'ın cevabında kullanabilirsiniz. Bu modüle ihtiyacınız yok. Şimdi bunun da kabul edilen cevabın yorumunda tartışıldığını görüyorum. Bu modülün, diğer çözümlerin yapmadığı farklı / ekstra bir şey yaptığının farkında değilim. Ama ben de kaynak kodunu kapsamlı bir şekilde kontrol etmedim .
Chris

İlk Web.config dosyasının yalnızca SSL sitelerinde uygulanması gerektiği konusunda daha net davranmalıydım. Bunu açıklığa kavuşturmak için cevabımı düzenleyeceğim.
Owen Blacker,

1

Bu Web.Config'de aşağıdaki bloğu ekleyerek yapılabilir:

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

Özel üstbilgileri yanıtlayabilmesi için IIS üzerinde yapılandırmamız gerekiyor:

  • Internet Information Services (IIS) Yöneticisi'ne gidin.
  • Sunucudan gelen yanıtlara eklenen Yanıt başlıklarını yapılandırın.
  • Şimdi özel başlık Adınızı ve özel Değerinizi ekleyin (Özel başlık adı ve değeri, Web.Config ile aynı olmalıdır). Blogda bulabilirsiniz

0

Sadece eklemek için, ben yorumlarda 2 kişi bunu yaptığınızda 500 hata hakkında konuşurken görüyorum. Bunu yaptım.

IIS'de 500 hatası alırsanız, bu kuralı hem üst düzeye eklemiş, kalıtsal ve site düzeyinde ayarlamış olmanız olabilir.

Örneğin

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

IIS / Tarayıcı, hata işleme ayarlarınızdan bağımsız olarak, bunu yaptığınız hiçbir bilgiyi vermiyor gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.