近來嘗試在公司架設 WPA-Enterprise 無線網路,並讓使用者利用 LDAP 帳號登入。由於過程高潮迭起,不做個筆記就太可惜了。
無線網路的加密與認證
與使用實體線路的有線網路不同,無線網路的傳遞介質是空氣,壞小孩只要在訊號傳輸範圍內放置天線,便可以輕易竊聽甚至偽造無線訊號。因此架設無線網路服務時,強制使用加密連線已經成為常識中的常識。
無線網路的加密方式又分為幾種,其中 WEP 已被證實有嚴重弱點,因此你不應該再使用它了。取而代之的是 WPA 與 WPA2,後者使用了較強的編碼演算法,在 2014 年的現在你應該把不支援 WPA2 的裝置送去回收。
WPA Personal / Enterprise
為了排除偷接網路的鄰居,WPA 只接受認證過的使用者連上無線網路,而這邊的認證方式又分成兩大類:Personal 與 Enterprise。其中最常用的是 Personal,又稱為 PSK (Pre-Shared Key),它的認證方式很簡單:只要使用者輸入一組共用的密碼就可以連上網路了。因為設定起來非常容易,因此在家庭、咖啡店或是沒有 MIS 的小公司中幾乎都使用 WPA-Personal 作為認證方式。
然而許多情況下,使用共用密碼是很危險的。比如說無線網路若連接到公司內部資源,那麼密碼洩露就很麻煩了,換密碼還會被使用者抱怨。因此 WPA-Enterprise 採用一種可擴充的協定,讓使用者可以用各種方式——包括帳號密碼、憑證甚至手機 sim 卡 ,來驗證自己的身份。
RADIUS
現在的無線網路 AP 都支援 WPA-Enterprise,但是它們本身並不會認證使用者。相反的,它們假設你的網路環境中有個伺服器會處理認證工作,而他們只是把使用者提供的資訊轉送給它,並詢問這個使用者是否能通過驗證,這個伺服器稱之為 RADIUS。使用 RADIUS 有個好處:當我們要架設多個 AP 時,就不需要在每個 AP 一一設定使用者帳號,只要叫它們都去詢問同一台 RADIUS 伺服器即可。
架設 RADIUS 伺服器並不難,已經有個 open source 軟體稱之為 FreeRADIUS 提供了完整的功能。在 Linux 上只要用 apt 或 yum 即可安裝。在接下來的範例中我們還希望 FreeRADIUS 能夠使用 LDAP 內的帳號密碼,因此也一併安裝 LDAP 模組:
設定 FreeRADIUS
WPA-Enterprise 可以採用多種方式進行使用者認證,而我們希望使用者以 LDAP 帳號密碼來驗證,因此我們得採用 PEAP-MSCHAPv2。這是廣受各家 OS 支援的協定。
需要注意的是,依照 MSCHAPv2 的設計,LDAP 中必需存有密碼明碼或是 MD4 hash 才能對客戶端進行驗證。幸運的是我們的 LDAP 同時也對 SAMBA 提供帳戶資訊,而 sambaNtPassword 這個欄位正是密碼的 MD4 hash。如果你的 LDAP 資料庫中沒有 SAMBA 密碼,就得想辦法讓使用者更新密碼了。
首先編輯
/etc/freeradius/modules/ldap
,前面幾項當然是照著 LDAP 伺服器的設定去改,其它部份照預設值就好。
接著是
/etc/freeradius/sites-enabled/default
,編輯 authorize 與 authenticate 區段,分別留下以下的內容即可:
接著是
/etc/freeradius/sites-enabled/inner-tunnel
,同樣編輯 authorize 與 authenticate 區段:
接下來是
/etc/freeradius/clients.conf
,在這邊把無線網路 AP 的 IP 列進去:
其中的
PASSWORD
是共用密碼,只有知道這組密碼的 AP 才能存取我們的 RADIUS 伺服器。這樣我們就能設定 AP 了:
在 AP 的設定中選擇以 WPA Enterprise 進行驗證,並且填入 RADIUS 伺服器的資訊後,用戶端就可以用 LDAP 帳號登入無線網路了。
用戶端設定方式
大部份的用戶端軟體會聰明地從 RADIUS 伺服器提供的資訊選擇使用 PEAP-MSCHAPv2 進行驗證,因此只要輸入帳號密碼就能開始使用無線網路,但有些作業系統則需要額外的設定。
Android
Android 不會自動選擇 EAP 認證方式,因此需要手動選擇 EAP 方法為 PEAP、階段 2 認證為 MSCHAPv2,才會出現帳號密碼欄位。(「匿名識別」只要留白即可)
Windows
相較於其它作業系統,Windows 在 WPA-Enterprise 上的設定顯得非常麻煩。在 PEAP 建立 TLS 通道的時候,Windows 就會試圖驗證 RADIUS 伺服器的憑證,而驗證失敗的時候卻完全不會有任何可供參考的錯誤訊息。由於我還沒有成功做出一份可以驗證通過的憑證(即使我在用戶端上安裝了自己的 root CA),因此只好跳過憑證檢查,以下是設定方法:
- 打開控制台的「網路與共用中心」,按下「設定新的連線或網路」,並選擇「手動連線到無線網路」。
- 輸入無線 AP 的 SSID,安全性選擇「WPA2-Enterprise」。
- 按下下一步後,選擇「變更連線設定」。
- 選擇「安全性」分頁,確定網路驗證方法是「Microsoft: Protected EAP (PEAP)」,並按下旁邊的「設定」。
- 關閉「透過驗證憑證來確認伺服器身份識別」,並確認下面的驗證方式是「Secured password (EAP-MSCHAP v2)」。
- 回到上一層後,按下「進階設定」,在「802.1X 設定」中勾選「指定驗證模式」,並選擇「使用者驗證」。
完成以上步驟後,就可以使用帳號密碼來登入無線網路了。然而這些步驟實際做起來相當複雜,對一般使用者來說很不友善,因此我們可以用
netsh
匯出設定檔:
這個指令會把指定的 SSID 設定內容寫進 XML 檔案中,而在其它電腦上只需要用以下指令就可以匯入這些設定:
參考資料
- Setting up RADIUS + LDAP for WPA2 on Ubuntu
這篇文章解釋為什麼 LDAP 內會需要 SAMBA 密碼,以及 EAP-TTLS/PAP 這個替代方案。 - FreeRADIUS Wiki: Certificate Compatibility
解釋 Windows 憑證檢驗為何讓 WPA-Enterprise 變得如此難搞。