ELMAH (Error Logging Modules and Handlers) 專門用來紀錄 ASP.NET 網站執行時期的錯誤,對維護網站軟體品質來說有很大的幫助。不過 ELMAH 記錄的資訊過於詳細,一般來說我們都還是會設定各種存取限制,例如透過限定使用者或角色的方式。本篇文章我將說明如何透過 IIS7 / IIS8 內建的 IP Security 模組,來限制特定 IP 來源才能存取 ELMAH 錯誤紀錄頁面。
首先,如果你的 IIS 是 Windows 7 或 Windows Server 2008 以上版本,必須先安裝 IIS 的 IP 安全性 功能,以確保你可以正確使用限制 IP 存取的功能設定。如果是 IISExpress 則不用特別設定,預設就已經內建了。
如果有安裝成功,你會在 IIS 管理員中看見 IP 位址及網域限制 功能:
由於 ELMAH 執行的時候,其 URL 不是固定的,他是一個 HttpHandler,所以可以透過 web.config 任意修改網址 ( 預設網址為 elmah.axd )。不過,我們若要在 IIS 管理員中設定 IP 安全性,只能針對實體資料夾進行設定,因此若要將設定套用在 ELMAH 的 URL 勢必要用手動設定。
不過,我們可以先藉由 IIS 管理員的 GUI 介面幫我們設定好,最後在手動調整網址即可,請參考以下步驟進行設定,這裡我們直接以上圖 aspnet_client 資料夾做為測試範例。
1. 先編輯功能設定,我們要先將該資料夾位址設定為「預設拒絕存取」
2. 然後新增允許項目,讓特定 IP 來源才能存取該位址
新增完成後如下範例:
3. 接著我們來查看這個設定到底儲存在哪裡。
由於 IIS 的 IP 安全性 ( IP Security ) 模組預設只能被定義在伺服器層級的 applicationHost.config 設定檔中,所以你透過 IIS 管理員所做出的設定,都會儲存在這個檔案中,而非網站根目錄或 aspnet_client 目錄下的 web.config 裡。以下為 applicationHost.config 設定檔的實體路徑:
- IIS7 / IIS8: "C:\Windows\System32\inetsrv\config\applicationHost.config"
- IISExpress: "%USERPROFILE%\Documents\IISExpress\config\applicationhost.config"
開啟該設定檔後,直接跳至檔案最下方,就會看到這個設定:
如果你最後要完成設定,只要將 <location> 的 path 屬性修改一下即可,請參考如下圖箭頭處:
設定的文字檔內容如下:
<location path="Default Web Site/elmah.axd" overrideMode="Allow">
<system.webServer>
<security>
<ipSecurity allowUnlisted="false">
<add ipAddress="127.0.0.1" allowed="true" />
</ipSecurity>
</security>
</system.webServer>
</location>
不過,這樣的設定由於每次調整都要動到系統資料夾下的 applicationHost.config 設定檔,對網站部署來說,其實蠻不好管理的,如果可以的話,最好是可以讓設定直接保存在網站目錄下的 web.config 之中,如此一來 IP 安全性設定就可以直接在網站資料夾中做設定,也可以跟專案一起做好版本控管。
如果你想將 <ipSecurity> 區段設定在 web.config 之中,那麼你勢必要先調整 applicationHost.config 設定檔,允許 web.config 可以覆蓋 applicationHost.config 設定檔中的 <ipSecurity> 定義。
請先用系統管理員權限開啟 applicationHost.config 設定檔:
- IIS7 / IIS8: "C:\Windows\System32\inetsrv\config\applicationHost.config"
- IISExpress: "%USERPROFILE%\Documents\IISExpress\config\applicationhost.config"
然後找到 configuration/configSections/sectionGroup[name="system.webServer"]/sectionGroup[name="security"] 區段,並且找到以下這行: (或搜尋 ipSecurity 關鍵字也可以快速找到)
<section name="ipSecurity" overrideModeDefault="Deny" />
並請修改成如下設定,然後儲存檔案:
<section name="ipSecurity" overrideModeDefault="Allow" />
如此一來便設定完成!
以下是一個 ELMAH 的設定檔範例,其中包括 ipSecurity 設定:
<location path="elmah.axd" inheritInChildApplications="false">
<system.web>
<httpHandlers>
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
<!--
See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for
more information on using ASP.NET authorization securing ELMAH.
<authorization>
<allow roles="admin" />
<deny users="*" />
</authorization>
-->
</system.web>
<system.webServer>
<handlers>
<add name="ELMAH" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
</handlers>
<security>
<ipSecurity allowUnlisted="false">
<add ipAddress="127.0.0.1" subnetMask="8" allowed="true" />
<add ipAddress="192.168.1.0" subnetMask="24" allowed="true" />
<add ipAddress="12.34.56.78" subnetMask="32" allowed="true" />
</ipSecurity>
</security>
</system.webServer>
</location>
相關連結