Який найкращий спосіб увімкнути жорстку безпеку транспорту HTTP на веб-сервері IIS 7?
Чи можу я просто через графічний інтерфейс і додати належний заголовок відповіді HTTP або я повинен використовувати appcmd і якщо так, то що перемикається?
Який найкращий спосіб увімкнути жорстку безпеку транспорту HTTP на веб-сервері IIS 7?
Чи можу я просто через графічний інтерфейс і додати належний заголовок відповіді HTTP або я повинен використовувати appcmd і якщо так, то що перемикається?
Відповіді:
IIS має можливість додавати власні заголовки до відповідей . Це, мабуть, буде найпростішим шляхом для цього.
Згідно з документацією по IIS.net ви можете додати ці заголовки через Диспетчер IIS:
- На панелі «Підключення» перейдіть на сайт, додаток або каталог, для якого потрібно встановити спеціальний заголовк HTTP.
- На панелі "Домашня сторінка" двічі клацніть заголовки відповідей HTTP.
- На панелі заголовків відповідей HTTP натисніть кнопку Додати ... на панелі "Дії".
- У діалоговому вікні Додати спеціальний заголовок відповіді HTTP встановіть ім’я та значення для власного заголовка та натисніть кнопку ОК.
Це дозволяє нам обробляти і перенаправлення HTTP, і додавати заголовок Strict-Transport-Security до відповідей HTTPS з одного сайту IIS (повинен бути встановлений модуль перезапису URL):
<?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" />
отримати пропуск на hstspreload.org
https://somedomain.com/https://somedomain.com/relatedpath
а результат - шлях випадає.
Щоб доповнити відповідь voretaq7 , ви можете також зробити це за допомогою файлу Web.config (Примітка. Для використання лише для SSL-сайтів, оскільки він додасть заголовок для HTTP та HTTPS-відповідей, що суперечить специфікації RFC 6797, будь ласка, дивіться пояснення нижче) - додайте блок наступним чином:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Очевидно, у вас вже може бути system.webServer
блок у вашій Web.config, тому додайте це до цього, якщо так. Ми вважаємо за краще обробляти речі в Web.config, а не GUI, оскільки це означає, що зміни конфігурації можуть бути здійснені в нашому репозиторії Git.
Якщо ви хочете обробляти перенаправлення HTTP на SSL, як згадував Грег Аскеу , вам може бути простіше зробити це на окремому веб-сайті в IIS. Ось як ми обробляємо необхідність SSL для деяких клієнтських сайтів. Цей веб-сайт містить лише переспрямування HTTP та деякі виправлення інформації щодо розкриття інформації , все в Web.config:
<?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>
Це наше найкраще рішення з кількох причин - ми можемо легко ввійти перенаправлений трафік окремо (як це в інший журнал IIS), він не включає більше коду в Global.asax.cs (у нас немає коду там, що трохи зручніше для сайту Umbraco) і, що важливо, це означає, що весь конфігурація все ще зберігається в нашому репортажі GIT.
Відредаговано, щоб додати: Щоб зрозуміти, щоб відповідати RFC 6797 , Strict-Transport-Security
користувацький заголовок НЕ МОЖЕ бути доданий до запитів, зроблених незашифрованими HTTP. Щоб бути сумісним з RFC6797, ви повинні ОБОВ'ЯЗКИ мати два сайти в IIS, як я описав після першого блоку коду. Як зазначає Кріс , RFC 6797 включає:
Хост HSTS НЕ МОЖЕ включати поле заголовка STS у відповіді HTTP, що передаються через незахищений транспорт.
тому надсилання Strict-Transport-Security
заголовка клієнта у відповідь на не-SSL-запит не буде відповідати специфікації.
Я б використав приклад із посилання на Wikipedia, на яке ви посилаєтесь, і виконує діяльність на сайті global.asax. Це дозволяє перенаправити запит на URL-адресу https, а потім вставити заголовок у відповідь.
Це пов'язано з тим, що заголовок HSTS потрібно ігнорувати, якщо він не відповідає https-відповіді.
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;
}
}
Це, здається, досить невдалий безпечний спосіб зробити це. Додайте цей код у Global.asax - подія Application_BeginRequest запускається спочатку в життєвому циклі запиту Asp.net: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs. 110) .aspx
За специфікацією, http-запити не повинні відповідати заголовком - тому цей код додає його лише для запитів https. Макс-вік становить кількість секунд, і зазвичай це гарна ідея ввести тут велике значення (IE - 31536000 вказує, що сайт буде працювати SSL лише протягом наступних 365 днів)
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;
}
}
Використовуючи приклад Дуга Вілсона, я створив дві наступні функції PowerShell, щоб додати правила перезапису URL для перенаправлення до HTTPS та для додавання заголовків HSTS.
Вони перевірені на Windows 2012 та Windows 2012 R2.
Все, що вам потрібно зробити - це вказати ім’я веб-сайту. Ви можете необов’язково дати правилам інше ім'я, якщо ти не подобається за замовчуванням.
Слід зазначити, що після мого тестування, змінні сервери потрібно додати до списку дозволів, перш ніж потрапити в заголовки відповідей. Функції роблять це за вас.
EDIT: Див. Посилання на перезапис Url для заголовків HTTP тут: 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"
}
На думку виробників модуля IIS Strict Transport Security IIS, просто додавання користувацького заголовка не відповідає проекту специфікації (RFC 6797).
Вам потрібно було б встановити цей модуль IIS, щоб увімкнути HSTS на IIS 7.
Оновлення 26 жовтня 2014 року : Завдяки коментатору нижче, я знову прочитав сторінку модуля, а саме ту частину, яка виправдовує використання модуля для додавання користувацьких заголовків.
Хост HSTS НЕ повинен включати поле заголовка STS у відповіді HTTP, що передаються через незахищений транспорт.
Якщо ви обов'язково додаєте заголовки лише в HTTPS, а НЕ в HTTP, цей модуль вам не потрібен, і ви можете використовувати відповідь Дугом Вілсоном. Не використовуйте відповідь Оуена Блекдера, тому що в ньому немає умови https.
Це можна зробити, додавши наступний блок у Web.Config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name ="CustomName" value="MyCustomValue"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Ми повинні налаштувати на IIS, який має можливість користувацьких заголовків відповідати:
Просто додам, я бачу в коментарях 2 людини, які говорять про 500 помилок, коли ви це робите. У мене це було.
Якщо ви отримаєте помилку 500 в IIS, це може бути тому, що ви додали правило як на верхньому рівні, встановленому у спадок, так і на рівні сайту.
напр
Default Web Site <- here
Some Web Site <- here
IIS / Браузер, здається, не дає вам ніякої інформації, що ви зробили це, незалежно від налаштувань обробки помилок