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?
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?
Yanıtlar:
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.
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>
<action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />
Bir almak için geçiş hstspreload.org üzerinde
https://somedomain.com/https://somedomain.com/relatedpath
ve sonuç yolun düştüğü anlamına geliyor.
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.webServer
Web.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-Security
SSL’ye ait olmayan bir talebe yanıt olarak müşteri başlığının gönderilmesi şartnameye uygun olmaz.
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;
}
}
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;
}
}
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"
}
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.
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:
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.