從 IIS Reponse Header 移除 Server、X-AspNet-Version、X-Powered-By 等版本資訊,可降低因曝露資訊被鎖定攻擊的機率,被視為提高資安防護的手段(效果高低見仁見智,但有些資安掃瞄將此列為弱點,不做也得做)。這已算是老話題,網路上有不少討論與參考文章:

綜觀常見的幾種做法,不管是用 IHttpModule 或 Global.asax.cs 在 PreSendRequestHeader() 將 Server Header 移除,都只對 ASP.NET WebForm 或 ASP.NET MVC 有效,攻擊者只要改下載 HTML/JS/CSS/JPG/PNG 等靜態檔案,甚至隨便想個不存在的 html,HTTP 404 Reponse 冒出 Server: Microsoft-IIS/10.0 當場破功,白忙半天。

這是因為靜態內容由 IIS 直接處理,不會經過我們設計的機制(延伸閱讀:system.web 與 system.webServer )。

有個笨方法,設定 <modules runAllManagedModulesForAllRequests="true"> 將所有靜態檔案也導入 ASP.NET Pipeline,雖然管用,但原本由 IIS 輕巧做掉的工作通通被導進為複雜情境設計的笨重程序,對效能很傷。

Server Header 是當中最棘手的項目,IIS Manager HTTP Response Headers 或 URL Rewrite Module 可以改寫或清空 Server Header,但無法移除,而 UrlScan 可以清除 Server Header 只支援到 IIS 7。

最後我找到一個不錯的解決方案 - StripHeaders。一個 C++ 開發的開源模組,使用 WIN32 API 在 IIS 核心執行,能涵蓋靜態內容,核心模組的 Overhead 低,加上原生程式執行效能遠比 .NET 程式快,較不用擔心效能問題。

IIS 原生模組的安裝程序蠻多,不過 StripHeaders 提供 MSI 安裝檔,大大簡化安裝步驟。目前最新版 iis_stripheaders_module_1.0.5.msi 於 2016-11-19 推出,支援 Server 2016。

安裝程式在背後做了一堆事:

  1. Installs stripheaders.dll
  2. Registers the Native-Code module with IIS using the appcmd.exe command
  3. Extends the IIS configuration schema to allow setting of headers to remove
  4. Adds default settings to the IIS configuration to remove the common "Server", "X-Powered-By" and "X-Aspnet-Version" response headers
  5. Adds a registry setting to remove the "Server: Microsoft-HTTPAPI/2.0" response header.

理論上重開機後就會生效,如果你不想重開機,可以使用 net stop http 重啟底層 HTTP 服務再手動啟動 IIS 及其他相依服務。不過我實測時停用 HTTP 失敗(處於停用中的狀態,一直關不掉),最後只能重開機。但我遇的狀況是重開完也沒生效,最後參考 Github 的安裝程式原始碼(Open Source 萬歲!),手動註冊 StripHeadersModule 才解決問題:

appcmd install module /name:StripHeadersModule /image:%windir%\system32\inetsrv\stripheaders.dll /add:true /lock:true

安裝妥當後,如下圖應該要在 IIS 模組清單看到 StripHeadersModule:

StripHeaders 預設會移除 Server、X-Powered-By、X-AspNet-Version 等 Response Header,不需修改 web.config 就會生效。如需移除額外 Header,則可在 web.config  system.webServer/stripHeaders 中設定。

以 css 實測,未啟用 StripHeaders 前:

啟用後,Server、X-Powered-By 消失,成功!

Tips of using StripHeaderModule to remove response headers, Server, X-AspNet-Version, X-Powered-By to increase security.


Comments

# by Honor Liao

黑大你好, 想請教你一個問題, 不知道移除 header 這件事情能否由網路設備實現。 比方說 LTM 設備,如果能有硬體層實現就可以節省 server 去處理 request,也讓server的部署更加容易。 只是小弟對網路不熟,不知是否可行?

# by Jeffrey

to Honor, WAF(Web Application Firewall) 或 Layer 7 Switch 具備這種能力,但如 FB 上的討論,先產生垃圾再回收屬平白消耗資源。部署設定是一次性成本,網路設備的移除動作卻要經年累月執行下去,成本較高。

# by 吕镇

黑大还在吗?问您几个问题 1、asp.net core能用吗? 2、我用的vs2019编译的源码后 执行addcmd命令后 IIS报错 事件查看器中 显示 模块 DLL C:\WINDOWS\system32\inetsrv\stripheaders.dll 未能加载。返回的数据为错误信息。

# by Jeffrey

to 吕镇,StripHeaders 作用於 IIS 底層,跟執行網站應用程式的關聯不大,ASP.NET Core 應也適用。至於無法加截 stripheaders.dll 問題,會是因為少了 .NET 3.5 嗎?參考:https://binarytree.zendesk.com/hc/en-us/articles/360025297251-NM-Application-Pool-will-not-start-in-IIS-on-Windows-Server-2012

# by Jason

HI 黑大您好, 想請問一下,照您的說法如要移除CSS JS這類靜態檔案的Header是否就只能 1.將靜態檔案導入Pipeline 2.使用StripHeaders 而無法像WebForm那樣調整Config或修改Global.asax.cs來達成? 或是有其他方式? 謝謝

# by Jeffrey

to Jason, 靜態檔案預設由 IIS 處理,不會經過 ASP.NET 邏輯。故如你所說,要不改 web.config 將靜態檔接進 ASP.NET Pipeline 處理,要不就是在 IIS 層解決,應該沒有其他更好的做法。

# by roger

不知道為什麼大家都不習慣在IIS前面再多加一層反向代理,這樣的好處是不用每台機器都調整header又能做nlb,還能用port forwarding做server farm內網實際主機的隱藏

# by M

Hi all, 我使用appcmd直接安裝該module後於事件紀錄簿會顯示"無法下載 C:\WINDOWS\system32\inetsrv\stripheaders.dll 模組 DLL。資料為該錯誤。",網站無法開啟,因為應用程式無法正常啟動 後來發現目錄下的確沒該dll,解決方式就是到StripHeaders Github找到msi安裝就有該dll,應用程式就可正常執行了。 這順序不需要重開機就可生效該module 另外提醒大家一點千萬不要直接從IIS直接移除該module,這會使得再也無法安裝回去 錯誤顯示 ERROR ( message:無法新增重複的集合元素 "StripHeadersModule"。 ) 試過重開機, 到新增移除feature那邊將IIS Web管理全部清掉再勾選回來或是到applicationHost.config手動清掉stripheaders相關內容後再重新appcmd安裝module都無法正確啟動該module

# by tony520

Hello~ 因為安裝該模組後發現一些問題, 移除後又會發生IIS網站無法正常運作的問題, 以下提供一些方法讓大家順利移除該模組的方法。 移除 StripHeaders 的方法: 以管理管理者身分執行cmd後,輸入以下指令… rem 列出目前IIS已安裝的模組 appcmd list module rem 移除"StripHeadersModule" 模組 appcmd delete module /module.name:StripHeadersModule 完成後,在 iis_stripheaders_module_1.0.5.msi 檔案上點滑鼠右鍵選「解除安裝」 以及在IIS管理員裡模組的重作「設定原生模組」裡找到StripHeadersModule後,打勾後移除 重新啟動IIS或重開機。

Post a comment