ClearPass MAC Cache的Captive Portal認證要如何做Active Sessions限制

最近做Active Sessions限制,發現,運作不如預期。怪了,以前這樣可以,現在卻異常,讓LLM搜尋,是6.11版本之後發生的。我那時候做的版本記得是6.9,那不行了,要如何修正呢?

要做Active Sessions,首先要做RADIUS Accounting,ClearPass才能透過查詢RADIUS Accounting過濾出Active Sessions。

在6.11版本不好使,原因就出在於過濾使用的語法。

本文會用自訂語法,修復查詢失敗的錯誤,並且得到更符合標題型式,即MAC Cache訪客認證的情境,要如何查出。

前置條件

RADIUS:一定要做RADIUS認證,才能用RADIUS Accounting。

RADIUS Accounting:有計量才能知道Username使用狀況,是否在線。Client上線或是離線,Network Authentication Server(NAS)都會發送訊息給ClearPass,讓ClearPass能即時掌握Client上線情況。

RADIUS Interim:定期更新Client使用量,主要作為網路使用量偵測並即時觸發限制,需要在NAS與ClearPass開啟對應的功能。※然而Active Session查詢是用不到。

ClearPass Insight:要Enable,ClearPass才會有insight方面相關數據,而Active Session數據來源即是 [Insight Repository]。

[Insight Repository]:用語法查詢RADIUS Accounting,得到Active Sessions。

Service Authorization:認證服務授權源要套用[Insight Repository]。

認證做MAC Cache功能的概念

在網路認證,如果走Captive Portal的型式,那麼Initial Role的目的就是讓Client跳出Captive Portal。然而登入成功之後,使用者因故,像是出去吹風吃午餐,可能裝置斷線五分鐘進而被NAS判定為斷線而清除認證快取,於是回到Initial Role。

於是變成,上午一次完整Captive Portal認證,下午一次,當然還有可能更多,於是變成「困擾」。

「能不能認證成功一次之後,一天就輸入一次,不要更多次?」

這個想法就催生出MAC Cache的概念,認證成功過的MAC,在一定時間內重新認證時,就直接取得通過認證的Role。

於是認證被拆成兩個階段:MAC、Web。

MAC認證檢查MAC是否存在有效的MAC Cache,此時Username是MAC Address。

Web認證檢查Account是否有效,此時Username是Account的Username。如果有效,就在該裝置屬性寫入一個MAC Cache的有效時間。

於是就能完成一個MAC Cache型式的Captive Portal認證。

Sessions限制運作

在ClearPass,Guest的部分可以限制同時使用數,這部分要生效,需要套上一個Profile,如果只限制一個Active Session,Profile內容如下:

※Guest User的同時使用數限制,只要把Session-Check Active-Session-Count的值改為「%{GuestUser:simultaneous_use}」則可。

運作方式是,在「登入成功」後,也就是套用配置之後,檢查Active Session,超過1就斷線。

但是如果沒有講清楚說明白,網路使用者會覺得是不是網路怪怪的,為什麼登入成功後就一直跳掉?

我認為做成 Reject 型式,不要讓人登入成功,就不會產生一下能用,一下不能用的感覺,因為從始至終都不能正常用。

原生Active Sessions Filter的狀況

以下是從ClearPass 6.11版,[Insight Repository]取出的Filter,然後稍微整理。

SELECT COUNT(*) AS active_count 
FROM radius_acct 
WHERE 
  (username = '%{Authentication:Username}' 
    OR calling_station_id = '%{Connection:Client-Mac-Address-NoDelim}'
  ) 
AND start_time >=  NOW() - INTERVAL '2 day' 
AND end_time is NULL;

這邊可以看到使用 username 與 calling_station_id 同時符合做搜尋,有開始但沒有結束的Session有幾個。

剛剛沒提的狀況,就是語法沒有整理,整理成上面的型式就能用,複製程式碼區塊蓋過原本的,此外,整理後也比較好看懂條件。

順一次認證流程,先來個一臺裝置的情境:

MAC認證時,Accounting寫入,username是mac,calling_station_id也是mac。由於Active Session是在認證前查詢,應該要是0。

Web認證時,Accouting改變,username是username,calling_station_id是mac。由於Active Session是在認證前查詢,應該要是1。

MAC Cache狀態,MAC認證時,Accounting寫入,username是mac,calling_station_id也是mac。由於Active Session是在認證前查詢,有可能是0或1。1是如果來不及清除,就會是1。

透過CoA,就會導致馬上重新認證,就可能會發生Active Sessions是1的狀況。

如果我在MAC認證時限制Active Session是0才算符合MAC Cache,這情況就會出狀況。若改為1,又可能出現實際上兩個裝置同時連線。

如果兩臺情況之下,就複雜一點,可分為:無、初次MAC認證、Web認證、MAC Cache階段MAC認證,然後兩臺裝置都可能處於不同階段。

我們要堵上漏洞應該換個想法,不要抓Active Session數值,而是抓跟認證裝置不同MAC的Active Session數值。

不是Active Sessions,而是Diff MAC Active Sessions。

在[Insight Repository]新增兩個Filters,「diff_mac_active_sessions_mac」作為MAC Mache認證時使用,「diff_mac_active_sessions_web」作為Web認證時使用。

至於屬性Endpoint:Guest_Username則在下個段落會說明。

SELECT count(DISTINCT calling_station_id) AS diff_mac_active_sessions_mac
FROM radius_acct
WHERE end_time IS NULL
  AND username = '%{Endpoint:Guest_Username}'
  AND calling_station_id != '%{Connection:Client-Mac-Address-NoDelim}'
  AND start_time >= NOW() - INTERVAL '2 day';  
SELECT count(DISTINCT calling_station_id) AS diff_mac_active_sessions_web
FROM radius_acct
WHERE end_time IS NULL
  AND username = '%{Authentication:Username}'
  AND calling_station_id != '%{Connection:Client-Mac-Address-NoDelim}'
  AND start_time >= NOW() - INTERVAL '2 day';        

用這想法,再次順一臺情形:

MAC認證時,Accounting寫入,username是mac,calling_station_id也是mac。由於Diff MAC Active Session是在認證前查詢,應該要是0。

Web認證時,Accounting改變,username是username,calling_station_id是mac。由於Diff MAC Active Session是在認證前查詢,應該要是1。

MAC Cache狀態,MAC認證時,Accounting寫入,username是mac,calling_station_id也是mac。由於Active Session是在認證前查詢,應該要是0。即便裝置先前的Accounting是如果來不及清除,也不會影響。

現在一臺能夠順利了,換成兩臺。

第一臺裝置直接做完Web認證,目前Sessions是

  1. username是username,calling_station_id是mac1。

那換第二臺Web認證,由於Active Session是在認證前查詢,應該要是1,於是我在Web認證設定Diff MAC Active Sessions等於0才能通過認證,就能順利攔劫。

不過第一臺不小心斷開,重新以MAC Cache階段連上,目前Sessions是:

  1. username是mac1,calling_station_id是mac1。

那換第二臺Web認證,由於Diff MAC Active Session是在認證前查詢,此時mac2或是username都查不到第一臺的Session,得到結果應該是0,於是第二臺順利通過Web驗證。

這個漏洞是基於MAC Cache是MAC認證,MAC認證Username是裝置的MAC,要修補它,我們要做的是讓MAC Cache通過的Username是之前Web認證通過時的Username。

在裝置紀錄Web認證時的Username作為MAC Cache使用

這邊推薦新增一個屬性,範例為「Guest_Username」。

新增兩個Enforcement Profiles,一個把username寫入裝置屬性。一個把裝置屬性作為Username。

當然如果要用既有的裝置屬性「Username」也是可以,但是,這個屬性也可能會用於其他認證流程,新增一個專用的,可以避免衝突發生,也能讓屬性用途更清楚,讓維運者更好懂。

Update_Guest_Username套用在Web認證成功後。

Use_Guest_Username套用在MAC Cache認證成功後。

回到上個段落有狀況情境:第一臺MAC Cache階段,第二臺進入Web認證。因為Use_Guest_Username,讓第一臺的Username是呈現本來Web認證通過時的username,所以目前Sessions是:

  1. username是username,calling_station_id是mac1。

那換第二臺Web認證,由於Diff MAC Active Session是在認證前查詢,此時username都查到第一臺的Session,得到結果應該是1,因此命中Session大於0的配置,於是第二臺在Web驗證被拒絕。(提示:情境要求同帳號不能有兩個Session在線。)

當然,第一臺可以斷線讓Session回到0,第二臺Web認證就能登入成功,來到兩臺裝置都有MAC Cache的情況。

假設這狀態,是第一臺裝置先連上,於是Session是:

  1. username是username,calling_station_id是mac1。

第二臺連線做MAC認證,由於Diff MAC Active Session是在認證前查詢,而Endpoint:Guest_Username是在Web認證時成功就寫好的,於是以Endpoint:Guest_Username查詢運作下,應該得到1。然後命中Session大於0的情況,也就不該直接配置MAC Cache的Role,給與Captive Portal的Initial Role,讓第二臺裝置跳出Captive Portal,就能完成阻擋。

AI用圖示整理

後記

最近在準備ACX,開始籌備大量LAB與實作。

這篇文章來自於一個Trouble Shooting,因為標準範例不好使。

剛好ACX實作考試要求就是夠快夠準,正好可以練練手感。

我快速識別限制,克服限制,快速造出一個過程,探索是否意外?然後封閉意外可能性。

這過程不簡單,邏輯要好要能模擬,還要改動認證源過濾器。

希望分享給各位參考,增加更多想法上的可能性。