Windows 擴充保護 <extendedProtection>
概觀
元素 <extendedProtection>
會指定設定 IIS 7.5 中Windows 驗證擴充保護的設定。
擴充保護可增強現有的Windows 驗證功能,以減輕驗證轉送或「中間人」攻擊。 這項風險降低是使用透過兩種安全性機制實作的安全性資訊來完成:
- 透過通道系結權杖指定的通道系結資訊 (CBT) ,主要用於 SSL 連線。
- 透過服務主體名稱 (SPN) 指定的服務系結資訊,主要用於不使用 SSL 的連線,或透過提供 SSL 卸載的案例建立連線時,例如 Proxy 伺服器或負載平衡器。
元素 <extendedProtection>
可能包含專案的 <spn>
集合,每個元素都包含服務系結資訊的唯一 SPN。 每個 SPN 都代表連線路徑中的唯一端點,可能是目的地伺服器或 Proxy 伺服器的完整功能變數名稱 (FQDN) 或 NetBIOS 名稱。 例如,如果用戶端透過 Proxy 伺服器連線到目的地伺服器,則目的地伺服器上的 SPN 集合必須包含 Proxy 伺服器的 SPN。 集合中的每個 SPN 都必須加上 「HTTP」,因此 「www.contoso.com」 產生的 SPN 會是 「HTTP/www.contoso.com」。
元素有兩個 <extendedProtection>
屬性可設定通道系結,以及 IIS 擴充保護的其他行為:
tokenChecking屬性會設定檢查通道系結權杖的行為。 此屬性的可能值為:
名稱 描述 None
這個值會指定 IIS 不會執行通道系結權杖檢查。 此設定會模擬在延伸保護之前存在的行為。
數值為0
。Allow
這個值會指定啟用通道系結權杖檢查,但並非必要。 此設定允許與支援擴充保護的用戶端進行安全通訊,但仍支援無法使用擴充保護的用戶端。
數值為1
。Require
這個值會指定需要通道系結權杖檢查。 此設定不支援擴充保護的用戶端不支援。
數值為2
。flags屬性會設定擴充保護的其他行為。 可能的旗標如下:
名稱 描述 None
此旗標指定未針對擴充保護啟用任何其他行為。 (例如,未使用 Proxy 伺服器且已啟用 SPN 檢查,而且需要 FQDN.)
數值為0
。Proxy
此旗標指定通訊路徑的一部分會透過 Proxy,或用戶端透過 HTTP 直接連線到目的地伺服器。
數值為1
。NoServiceNameCheck
此旗標指定已停用 SPN 檢查;此旗標不應該用於只檢查 SPN 的案例中。
數值為2
。AllowDotlessSpn
此旗標指定 SPN 不需要是 FQDN。 設定此旗標可允許以 NetBIOS 為基礎的 SPN。 注意: 設定此旗標不是安全的案例;非 FQDN 型名稱很容易遭受名稱解析有害攻擊。
數值為4
。ProxyCohosting
此旗標指定整個用戶端對伺服器通訊路徑只會使用 HTTP;通訊路徑中沒有任何部分會使用 SSL,而且會使用 SPN 檢查。 注意: 當您指定此旗標時,也必須指定 Proxy
旗標。
數值為32
。
擴充保護案例
請考慮下列範例案例:
- 在下列每個案例中,如果您的網路環境支援 NetBIOS 型 SPN,您也可以指定
AllowDotlessSpn
旗標;不過,NetBIOS 型 SPN 並不安全。 - 對於下列每一個使用 SPN 檢查的案例,而且不會使用通道系結權杖檢查,您不應該指定
NoServiceNameCheck
旗標。
狀況 | Flags | 描述 |
---|---|---|
用戶端會使用 HTTP 直接連線到目的地伺服器 | Proxy , ProxyCohosting |
將會使用 SPN 檢查,而且不會使用通道系結權杖檢查。 |
用戶端會使用 SSL 直接連線到目的地伺服器 | None |
會使用通道系結權杖檢查,而且不會使用 SPN 檢查。 |
用戶端會針對整個路徑使用 HTTP 透過 Proxy 伺服器連線到目的地伺服器 | Proxy , ProxyCohosting |
將會使用 SPN 檢查,而且不會使用通道系結權杖檢查。 |
用戶端會透過使用 SSL 的 Proxy 伺服器連線到目的地伺服器,以取得整個路徑 | Proxy |
將會使用 SPN 檢查,而且不會使用通道系結權杖檢查。 |
用戶端會使用 SSL 連線到 Proxy 伺服器,而 Proxy 伺服器會使用 HTTP (SSL 卸載載入連線到目的地伺服器) | Proxy |
將會使用 SPN 檢查,而且不會使用通道系結權杖檢查。 |
其他資訊
如需有關擴充保護的詳細資訊,請參閱下列主題:
相容性
版本 | 備註 |
---|---|
IIS 10.0 | 未在 IIS 10.0 中修改專案 <extendedProtection> 。 |
IIS 8.5 | 未在 IIS 8.5 中修改專案 <extendedProtection> 。 |
IIS 8.0 | 未在 IIS 8.0 中修改專案 <extendedProtection> 。 |
IIS 7.5 | 元素 <extendedProtection> 是在 IIS 7.5 中引進。 |
IIS 7.0 | N/A |
IIS 6.0 | N/A |
安裝程式
IIS 7 和更新版本的預設安裝不包含Windows 驗證角色服務。 若要在 IIS 上使用Windows 驗證,您必須安裝角色服務、停用網站或應用程式的匿名驗證,然後為網站或應用程式啟用Windows 驗證。
注意
安裝角色服務之後,IIS 7 會將下列組態設定認可至ApplicationHost.config檔案。
<windowsAuthentication enabled="false" />
Windows Server 2012 或 Windows Server 2012 R2
- 在工作列上,按一下 [伺服器管理員]。
- 在[伺服器管理員] 中,按一下 [管理] 功能表,然後按一下 [新增角色及功能]。
- 在 [ 新增角色及功能精 靈] 中,按 [ 下一步]。 選取安裝類型,然後按 [ 下一步]。 選取目的地伺服器,然後按 [ 下一步]。
- 在 [ 伺服器角色] 頁面上,依序展開 [ Web 服務器] ([IIS) ]、[ 網頁伺服器]、[ 安全性],然後選取 [ Windows 驗證]。 按一下 [下一步] 。
. - 在 [選取功能] 頁面上,按 [下一步]。
- 在 [確認安裝選項] 頁面上,按一下 [安裝]。
- 在 [結果] 頁面上,按一下 [關閉]。
Windows 8 或 Windows 8.1
- 在 [開始] 畫面上,將指標全部移至左下角,以滑鼠右鍵按一下 [開始] 按鈕,然後按一下[主控台]。
- 在主控台中,按一下 [程式和功能],然後按一下 [開啟或關閉 Windows 功能]。
- 展開 [Internet Information Services]、[ 萬維網服務]、[ 安全性],然後選取 [ Windows 驗證]。
- 按一下 [確定]。
- 按一下 [關閉] 。
Windows Server 2008 或 Windows Server 2008 R2
- 在工作列上,按一下 [開始],指向 [系統管理工具],然後按一下[伺服器管理員]。
- 在[伺服器管理員階層] 窗格中,展開 [角色],然後按一下 [Web 服務器] (IIS) 。
- 在 [Web 服務器 (IIS) ] 窗格中,捲動至 [ 角色服務 ] 區段,然後按一下 [ 新增角色服務]。
- 在 [新增角色服務精靈] 的 [選取角色服務] 頁面上,選取 [Windows 驗證],然後按 [下一步]。
- 在 [確認安裝選項] 頁面上,按一下 [安裝]。
- 在 [結果] 頁面上,按一下 [關閉]。
Windows Vista 或 Windows 7
- 在工作列上,按一下 [開始],然後按一下[主控台]。
- 在主控台中,按一下 [程式和功能],然後按一下 [開啟或關閉 Windows 功能]。
- 展開 [Internet Information Services]、[ 萬維網服務]、[ 安全性]。
- 選取 [Windows 驗證],然後按一下 [ 確定]。
作法
如何啟用Windows 驗證的擴充保護
(IIS) 管理員開啟 Internet Information Services:
如果您使用 Windows Server 2012 或 Windows Server 2012 R2:
- 在工作列上,依序按一下 [伺服器管理員]、[工具],然後按一下 [Internet Information Services] ([IIS) 管理員]。
如果您使用 Windows 8 或 Windows 8.1:
- 按住Windows鍵,按字母X,然後按一下[主控台]。
- 按一下 [ 系統管理工具],然後按兩下 [Internet Information Services] ([IIS) 管理員]。
如果您使用 Windows Server 2008 或 Windows Server 2008 R2:
- 在工作列上,按一下 [ 開始],指向 [ 系統管理工具],然後按一下 [ Internet Information Services (IIS) 管理員]。
如果您使用 Windows Vista 或 Windows 7:
- 在工作列上,按一下 [開始],然後按一下[主控台]。
- 按兩下 [ 系統管理工具],然後按兩下 [Internet Information Services] ([IIS) 管理員]。
在 [連線] 窗格中,展開伺服器名稱、[站台],然後展開您要為其啟用 [擴充保護] 的月臺、應用程式或 Web 服務Windows 驗證。
捲動至 [首頁] 窗格中的 [安全性] 區段,然後按兩下 [驗證]。
在 [ 驗證] 窗格中,選取 [Windows 驗證]。
按一下 [動作] 窗格中的 [進階設定]。
當 [ 進階設定 ] 對話方塊出現時,請在 [ 擴充保護 ] 下拉式功能表中選取下列其中一個選項:
按一下 [確定] 以關閉 [進階設定] 對話方塊。
組態
專案 <extendedProtection>
可在ApplicationHost.config檔案的月臺、應用程式或虛擬目錄層級設定。
屬性
屬性 | 描述 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
flags |
選擇性旗標屬性。 指定擴充保護的其他行為設定。 屬性 flags 可以是下列值的組合;預設值為 None 。
|
||||||||||||
tokenChecking |
選擇性列舉屬性。 指定檢查通道系結資訊的行為。 屬性 tokenChecking 可以是下列其中一個值;預設值為 None 。
|
子元素
元素 | 描述 |
---|---|
spn |
將 SPN 加入至集合。 |
clearSpns |
清除 SPN 的集合。 |
removeSpn |
從集合中移除 SPN。 |
組態範例
下列範例顯示一個元素,示範如何啟用具有預設網站擴充保護的Windows 驗證,並將兩個 <extendedProtection>
SPN 專案新增至 SPN 的集合。
<location path="Default Web Site">
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true">
<extendedProtection tokenChecking="Allow" flags="None">
<spn name="HTTP/www.contoso.com" />
<spn name="HTTP/contoso.com" />
</extendedProtection>
</windowsAuthentication>
</authentication>
</security>
</system.webServer>
</location>
範例程式碼
下列範例示範如何設定具有預設網站擴充保護的Windows 驗證,並將兩個 SPN 專案新增至 SPN 的集合。
AppCmd.exe
appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/windowsAuthentication /enabled:"True" /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/windowsAuthentication /extendedProtection.tokenChecking:"Allow" /extendedProtection.flags:"None" /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/windowsAuthentication /+"extendedProtection.[name='HTTP/www.contoso.com']" /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/security/authentication/windowsAuthentication /+"extendedProtection.[name='HTTP/contoso.com']" /commit:apphost
注意
當您使用AppCmd.exe設定這些設定時,請務必將 認可 參數 apphost
設定為 。 這會將組態設定認可至ApplicationHost.config檔案中適當的位置區段。
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection windowsAuthenticationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", "Default Web Site");
windowsAuthenticationSection["enabled"] = true;
ConfigurationElement extendedProtectionElement = windowsAuthenticationSection.GetChildElement("extendedProtection");
extendedProtectionElement["tokenChecking"] = @"Allow";
extendedProtectionElement["flags"] = @"None";
ConfigurationElementCollection extendedProtectionCollection = extendedProtectionElement.GetCollection();
ConfigurationElement spnElement = extendedProtectionCollection.CreateElement("spn");
spnElement["name"] = @"HTTP/www.contoso.com";
extendedProtectionCollection.Add(spnElement);
ConfigurationElement spnElement1 = extendedProtectionCollection.CreateElement("spn");
spnElement1["name"] = @"HTTP/contoso.com";
extendedProtectionCollection.Add(spnElement1);
serverManager.CommitChanges();
}
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetApplicationHostConfiguration
Dim windowsAuthenticationSection As ConfigurationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", "Default Web Site")
windowsAuthenticationSection("enabled") = True
Dim extendedProtectionElement As ConfigurationElement = windowsAuthenticationSection.GetChildElement("extendedProtection")
extendedProtectionElement("tokenChecking") = "Allow"
extendedProtectionElement("flags") = "None"
Dim extendedProtectionCollection As ConfigurationElementCollection = extendedProtectionElement.GetCollection
Dim spnElement As ConfigurationElement = extendedProtectionCollection.CreateElement("spn")
spnElement("name") = "HTTP/www.contoso.com"
extendedProtectionCollection.Add(spnElement)
Dim spnElement1 As ConfigurationElement = extendedProtectionCollection.CreateElement("spn")
spnElement1("name") = "HTTP/contoso.com"
extendedProtectionCollection.Add(spnElement1)
serverManager.CommitChanges()
End Sub
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var windowsAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/windowsAuthentication", "MACHINE/WEBROOT/APPHOST/Default Web Site");
windowsAuthenticationSection.Properties.Item("enabled").Value = true;
var extendedProtectionElement = windowsAuthenticationSection.ChildElements.Item("extendedProtection");
extendedProtectionElement.Properties.Item("tokenChecking").Value = "Allow";
extendedProtectionElement.Properties.Item("flags").Value = "None";
var extendedProtectionCollection = extendedProtectionElement.Collection;
var spnElement = extendedProtectionCollection.CreateNewElement("spn");
spnElement.Properties.Item("name").Value = "HTTP/www.contoso.com";
extendedProtectionCollection.AddElement(spnElement);
var spnElement1 = extendedProtectionCollection.CreateNewElement("spn");
spnElement1.Properties.Item("name").Value = "HTTP/contoso.com";
extendedProtectionCollection.AddElement(spnElement1);
adminManager.CommitChanges();
VBScript
Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set windowsAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/windowsAuthentication", "MACHINE/WEBROOT/APPHOST/Default Web Site")
windowsAuthenticationSection.Properties.Item("enabled").Value = True
Set extendedProtectionElement = windowsAuthenticationSection.ChildElements.Item("extendedProtection")
extendedProtectionElement.Properties.Item("tokenChecking").Value = "Allow"
extendedProtectionElement.Properties.Item("flags").Value = "None"
Set extendedProtectionCollection = extendedProtectionElement.Collection
Set spnElement = extendedProtectionCollection.CreateNewElement("spn")
spnElement.Properties.Item("name").Value = "HTTP/www.contoso.com"
extendedProtectionCollection.AddElement(spnElement)
Set spnElement1 = extendedProtectionCollection.CreateNewElement("spn")
spnElement1.Properties.Item("name").Value = "HTTP/contoso.com"
extendedProtectionCollection.AddElement(spnElement1)
adminManager.CommitChanges()