electronic_blue

用了 octopress 就沒理由再不寫 blog

使用 FreeRADIUS 與 LDAP 架設 WPA Enterprise 無線網路

|

近來嘗試在公司架設 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 模組:

1
# apt-get install freeradius freeradius-ldap

設定 FreeRADIUS

WPA-Enterprise 可以採用多種方式進行使用者認證,而我們希望使用者以 LDAP 帳號密碼來驗證,因此我們得採用 PEAP-MSCHAPv2。這是廣受各家 OS 支援的協定。

需要注意的是,依照 MSCHAPv2 的設計,LDAP 中必需存有密碼明碼或是 MD4 hash 才能對客戶端進行驗證。幸運的是我們的 LDAP 同時也對 SAMBA 提供帳戶資訊,而 sambaNtPassword 這個欄位正是密碼的 MD4 hash。如果你的 LDAP 資料庫中沒有 SAMBA 密碼,就得想辦法讓使用者更新密碼了。

首先編輯 /etc/freeradius/modules/ldap,前面幾項當然是照著 LDAP 伺服器的設定去改,其它部份照預設值就好。

1
2
3
4
5
6
ldap {
    server = "localhost"
    basedn = "ou=user,dc=yourcompany,dc=com"
    filter = "(uid=%u)"
    ...
}

接著是 /etc/freeradius/sites-enabled/default,編輯 authorize 與 authenticate 區段,分別留下以下的內容即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
authorize {
    preprocess
    suffix
    eap {
        ok = return
    }
    expiration
    logintime
}

authenticate {
    eap
}

接著是 /etc/freeradius/sites-enabled/inner-tunnel,同樣編輯 authorize 與 authenticate 區段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
authorize {
    mschap
    suffix
    update control {
        Proxy-To-Realm := LOCAL
    }
    eap {
        ok = return
    }
    ldap
    expiration
    logintime
}

authenticate {
    Auth-Type MS-CHAP {
        mschap
    }
    eap
}

接下來是 /etc/freeradius/clients.conf,在這邊把無線網路 AP 的 IP 列進去:

1
2
3
4
client 192.168.1.254 {
    secret = PASSWORD
    shortname = Wireless-AP
}

其中的 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),因此只好跳過憑證檢查,以下是設定方法:

  1. 打開控制台的「網路與共用中心」,按下「設定新的連線或網路」,並選擇「手動連線到無線網路」。
  2. 輸入無線 AP 的 SSID,安全性選擇「WPA2-Enterprise」。
  3. 按下下一步後,選擇「變更連線設定」。
  4. 選擇「安全性」分頁,確定網路驗證方法是「Microsoft: Protected EAP (PEAP)」,並按下旁邊的「設定」。
  5. 關閉「透過驗證憑證來確認伺服器身份識別」,並確認下面的驗證方式是「Secured password (EAP-MSCHAP v2)」。
  6. 回到上一層後,按下「進階設定」,在「802.1X 設定」中勾選「指定驗證模式」,並選擇「使用者驗證」。

完成以上步驟後,就可以使用帳號密碼來登入無線網路了。然而這些步驟實際做起來相當複雜,對一般使用者來說很不友善,因此我們可以用 netsh 匯出設定檔:

1
C:\> netsh wlan export profile WIRELESS-SSID

這個指令會把指定的 SSID 設定內容寫進 XML 檔案中,而在其它電腦上只需要用以下指令就可以匯入這些設定:

1
C:\> netsh wlan add profile filename=WIRELESS-SSID.xml

參考資料

迴響