The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何替 ELMAH 錯誤紀錄頁面加上 IP 來源限制存取設定 (IIS)

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>



相關連結