這篇可能更好的位置是放在 Authentication 的後面,其實這兩個模組我本來都有打算要講,但想到篇幅調整跟配合,把他們從前面的地方移掉,在這邊結合成一篇應該也還算恰當。
Authentication 本身做的事情其實只是認證現在這個請求的人是誰,而這個「誰」有哪些權限,可以看什麼不能看什麼,是在 Authorization 裡設定的。中文來說 Authentication 叫做認證, Authorization 叫做授權,你戴上王冠,王冠是身分的象徵,而國王能夠做的事情,是通過過往法律律定制定,你能有哪些權利,寫在那兒。
IP Address and Domain Restrictions 的功能其實比較靠近 Request Filtering 那塊,也是管理特定 Pattern 的 Request 的存取行為,只是辨別的對象從 Url 變成了 IP Address 和 Domain。
這兩個模組分別在圖中的位置。
我們先來看看 Authentication 的介面
可以看到這裡預設會有一條 Allow All Users 的 Rule 存在,這是從 Home 階級(Server)繼承下來到各個網站層級的,所以只要不改該設定,每個網站開起來就會預設有這條繼承的。我這邊顯示 Local 是因為我點開的地方是 Server Level,如果點開的是 Website 這條 entry type 就會是 Inherited。
所以過往你可能使用體驗上沒有特別感受到這個功能,就是因為這條預設的存在,如果今天你把這條預設拿掉,那你會看到的是這個頁面:
401.2,Unauthorized,未授權,基本出這個就是去檢查設定中授權相關規範,確認目前設定限制了哪些存取;另外就是檢查認證的身分,認證到錯誤的身分,自然就拿不到正確的授權。
在新增授權規則的部分,Allow 與 Deny 基本介面是完全一樣的:
可以針對
另外可以再多一層針對不同的 HTTP verbs 去做設定。
如果你在完全相同的角色、HTTP verbs上,是不能同時設置 Allow 和 Deny 的。
如果設置成 Deny 所有的 Verb,再針對單一 Verb 做 Allow,是不會生效的,Deny 的優先度是大於 Get 的。優先度在我的理解上是從上到下,上方優先(所以 Deny All 會在最上面)。也可以注意到這邊的項目是沒有調整優先度的,優先度就是根據你設定的角色與範圍由系統來決定。
Authorization 基本也沒太多設置,就是讓前面 Authentication 識別身分,再對身分做對應權限設定。我自己的經驗上一般會出問題通常都是前面的認證沒認出對的身分,導致後面沒給到對應的權限,Authorizatoin 比較少會有摸不著頭腦的問題。
第二個模組是 IP Address and Domain Restrictions,這個就可以設定優先度來決定哪項設定比較應該先被考慮。
Allow 和 Deny 的項目這個模組也是可設定的項目都一樣。
我們嘗試設定一下 Deny 127.0.0.1,並瀏覽 localhost:
這時會遇到的頁面是 403.503,如果在有顯示詳細資訊(上圖)這種時候,看到這個就會知道是因為 IpRestrictionModule,不管是看頁面上的模組名稱或是用對對應的錯誤碼直接查詢,應該都能識別是這個原因。(客戶端訪問看到預設錯誤處理頁面的話就要去查 IIS Log 來對錯誤代碼啦)
你可能會想,上面的視窗裡都是 Ip restriction,我要怎麼設定關於 Domain 的阻擋呢?其實要到 Edit Feature Settings 那把對應選項打開,才會看的到,接著就順勢來看一下 Edit Feature Settings 裡提供的設定吧。
上面的截圖是未改任何設定下的預設值。也就是預設當沒有設定阻不阻擋的時候,會是允許通過(Access for unspecified clients : Allow);畫紅線的就是勾選後會能在 Allow / Deny 的介面裡對 Domain 作對應設置(Enable domain name restrictions)。
下一個選項 Enable Proxy Mode 影響的是允不允許該網站透過 Proxy 來進行存取,因為其實很多 IIS 前面都會有一些比如 Load Balance 的服務、防火牆或是 Proxy Server, 訪問的 IP Address 其實會變成最靠近 IIS 的 request 節點。為了能在這樣的情況識別正確的 Client IP,IIS 有對應的 Header x-forwarded-for 來做中間跳轉過的 IP 紀錄。在這個設定打開的情況下,除了 Client IP 以外,IIS 也會對 x-forwarded-for 裡的 IP 進行同樣的檢查。
最後面的設定 Deny Action Type 就是你可以決定 Deny 該 Request 後要顯示的錯誤,選項總共有 Unauthorized ,Not Found 或是 Abort,錯誤畫面依序為下列三張圖片:
Sub status code 的錯誤碼都是 .503,算是其中一個好識別的特點,Abort 則是直接讓使用者的連線中斷(ERR_CONNECTION_RESET),無法瀏覽網頁。
特別注意的是行為選為 Abort 的話該 Request 會在 HTTP.sys 層就被斷掉,IIS Log 中會找不到對應的紀錄,要去 HTTPERR log 裡才會有痕跡,對應的 s-reason 會寫 Request_Cancelled。
最後還有一個 Dynamic IP Restriction Settings 的設置選項可以調整,主要能夠針對 IP 的情況更靈活地去做阻檔或限制,比如限制同一IP的同時最大連線數,或是時間內的連線數最多能有幾個,下面的 Enable Logging Only Mode 指的是在這邊的 Dynamic IP 限制到達的情況下,也不對 IP 做存取限制,而是在 IIS Log 裡留下 sub status code 502,如 200.502,即使成功存取也能在 Log 中留下紀錄,作為真正要禁用前的資訊收集。
以上大概就是這兩個模組的相關設定與功用,基本上 IIS 的內部錯誤頁面都有足夠的資訊能讓你在遇到問題的時候定位到到底是哪個模組回傳的錯誤,在除錯時這些都是很有用的資訊。