A single user account can only be used on two devices at the same time to connect to the Wi-Fi network.
這個構想相當常見,但卻沒那麼簡單,下面會講到要如何實踐這需求的關鍵知識。
- 需經帳密認證才能存取的無線網路,並且啟用RADIUS Accounting功能。
- 具備RADIUS Accounting功能的RADIUS Server
- 能查詢RADIUS Accounting資料庫作為授權(Authoritzation)的RADIUS Server
- 支援 RADIUS Change of Authorization(CoA) 功能的無線網路與RADIUS Server
功能運作流程:
將使用者透過帳密連線無線網路時,認證伺服器會去查詢目前計量中使用該帳號正在連線的數量,如果在特定值之下則認證通過,反之拒絕。
通過認證後,設下配置,之後若偵測到該使用者的連線數大於特定值,則透過RADIUS CoA讓其一設備連線中斷。被中斷連線的設備將因使用者連線數大於特定值而無法馬上通過驗證,除非有使用者帳號的連線數下降。
網路與服務極具有分工的概念,什麼用途(服務)讓什麼設備提供。
專業分工、角色明確是有助於提升網路效能,最重要的是使人好理解跟好管理。
有些人覺得限制一使用者能同時連線數目是很簡單的概念,是不是可以透過無線網路控制器去做到?但無線網路控制器本身主要任務是管理AP與設定,使得大多數控制器並沒有完整的RADIUS功能,於是只憑控制器是做不到限制。
回到正題,接下來會用ClearPass去配置。而Mobility Gateway(俗稱控制器)這部份設定,我想適合這篇文章的人,應該都具有能力會設定。
在ClearPass中,有幾點需要使用的。
- insight功能啟用
- 調整認證源中insight的篩選器,優化篩選語法
- 建立一條Enforcement Profile,在通過驗證後,若檢查該User Active Sessions超過2,則透過CoA中斷連線。
- 設定Policy以insight中的Action-Sessions作為判斷條件去決定認證是否通過並套上上步驟的Enforcement Profile。
- 讓Service(服務)使用insight作為授權,並且套用上步驟的Policy。
- 用一裝置測試,連上後檢查insight授權源Active-Sessions是否能正常顯示。然後手動使用CoA中斷連線,測試CoA功能要為正常。
insight功能啟用
CPPM > 管理 > 服務器管理器 > 服務器配置,勾選「啟用Insight」。

調整認證源中insight的篩選器,優化篩選語法
配置 > 身份驗證 > 源 > Inshigt Repository。調整Active Sessions,將查詢語法修改。
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 start_time <= NOW() AND end_time is NULL;
跟原本的不同之處,在於條件多了「start_time <= NOW()」。由於開始查詢到得到回覆會有時間差,這其間RADIUS Accounting可能會進入,因此查詢的數字是不穩定的。(實測多半會納入本次驗證的連線的查詢結果。)
加入新條件,目的是希望得到認證前就已經存在的連線數,也避免新認證會在認證流程完成前就影響查詢到的連線數。
假設要限制只有兩台設備能同時上線,第三台設備趁時間差不小心上線了。這時候如果要斷一台設備連線,是希望讓第三台無法上線。
不過要是這時候全部設備斷線,那麼利用Active-Sessions的授權去判斷,就會同時顯示3,然後同時都過不了驗證,全部都不能用。
因此,如果設備MAC屬於Active-Sessions中的前兩台設備MAC,那麼就可以通過驗證。這樣子第三台設備在再次認證時會失敗。如此能避免意外導致三台設備同時連不上。
再新增一個篩選器 Active Sessions MACs Top2,語法中的Limit可以限制回傳行數,由於資料庫是順序寫入,因此這結果不做排序,也會是由舊到新排列。
SELECT calling_station_id FROM radius_acct WHERE (username = '%{Authentication:Username}' OR calling_station_id = '%{Connection:Client-Mac-Address-NoDelim}') AND start_time >= NOW() - INTERVAL '2 day' AND start_time <= NOW() AND end_time is NULL Limit 2;



建立一條Enforcement Profile,在通過驗證後,若檢查該User Active Sessions超過2,則透過CoA中斷連線。

設定Policy以insight中的Action-Sessions作為判斷條件去決定認證是否通過並套上上步驟的Enforcement Profile。
第一條是以Active-Sessions中,兩個最早建立Session的MACs可以通過驗證。
第二條則是Active-Sessions未達數目限制時,這時候存在同時認證的時間差漏洞可鑽,後續仍需檢查User Active Session,超過就會斷線。
第三條是超出數目限制,不加這條也可以。

讓Service(服務)使用insight作為授權,並且套用上步驟的Policy。
在設定Aruba無線網路的規則時,使用Aruba-Essid-Name會比較直觀。若所有Profile都是使用SSID,往後在管理時會相當清楚各Profile的用途。

用一裝置測試,連上後檢查insight授權源Active-Sessions是否能正常顯示。然後手動使用CoA中斷連線,測試CoA功能要為正常。
設定完成後,測試連線。需要看到授權屬性有出現,如果跳出警報,那就需要修正警報所提示的部分。
(因為測試用的CPPM內建Insight資料庫認證源有異常,於是這邊複製正常設定取名為2。)



注意事項
判斷設備能不能連線成功的依據是查詢Radius計量資料庫。
這時會受到緩存影響,以及時間差影響,所以沒辦法即時斷線後就能讓另外一臺使用。
Aruba無線控制器在終端設備斷線後,預設會保留五分鐘的Cache,避免反覆驗證。
因此Radius計量會在斷線發生五分鐘之後,才會從控制器發出計量終止的訊息。
而CPPM也有緩存機制,端點策略緩存預設保存五分鐘,也能避免反覆重新驗證。
想做實測的話,就會因為緩存機制得等待釋放,保守得等上兩倍時間,也就是十分鐘。
如果想要馬上看出效果,在Aruba無線控制器CLI中,使用「AAA User Delete」,除了斷開符合條件的使用者連線,清除無線控制器上的認證Cache,還可以立刻傳送Radius計量終止訊息。接下來只要去CPPM中清除掉緩存,就能不等待緩存過期釋放出來。