徹底移除 IIS Response Header 版本資訊
9 |
從 IIS Reponse Header 移除 Server、X-AspNet-Version、X-Powered-By 等版本資訊,可降低因曝露資訊被鎖定攻擊的機率,被視為提高資安防護的手段(效果高低見仁見智,但有些資安掃瞄將此列為弱點,不做也得做)。這已算是老話題,網路上有不少討論與參考文章:
- mrkt 的程式學習筆記- ASP.NET MVC - 移除特定的 Response Headers 內容
- Troy Hunt: Shhh… don’t let your response headers talk too loudly
- KingKong Bruce記事: 提升ASP.NET MVC專案安全性與效能小技巧
綜觀常見的幾種做法,不管是用 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。
安裝程式在背後做了一堆事:
- Installs stripheaders.dll
- Registers the Native-Code module with IIS using the appcmd.exe command
- Extends the IIS configuration schema to allow setting of headers to remove
- Adds default settings to the IIS configuration to remove the common "Server", "X-Powered-By" and "X-Aspnet-Version" response headers
- 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或重開機。