FreeRADIUS 設定 PEAP/EAP-GTC 與 EAP-TTLS/PAP 雙驗證機制

本篇說明如何在 FreeRADIUS 設定支援 PEAP/EAP-GTC 與 EAP-TTLS/PAP 雙驗證機制。

設定 TLS Tunnel 所使用的憑證

PEAP 與 EAP-TTLS 的 TLS Tunnel 機制是以憑證 (Certificate-base) 為基礎的方式進行驗證,而且只需要驗證 server side 即可,比起 EAP-TLS 需要 server / client side 雙向驗證要來的容易部署許多。

由於 EAP-TLS 的安全強度對於目前來說是最嚴謹的,而且 WPA3-Enterprise with 192 bit mode 只支援這一種 EAP-Type。

憑證簽署

憑證的使用上有很多細節需要注意,包含憑證資訊的正確性、是否有斷鏈情況以及新舊作業系統所支援的憑證階層相容性等。

而在 FreeRADIUS 上使用憑證還有以下的限制要注意:

  • 不能使用萬用憑證 (Wildcard Certificate)。
  • 支援 SNI 憑證,但是在 Windows 平台實測 EAP-TTLS 時,驗證的網域必須要放在 CN 欄位,不能只存在 DNS 欄位,否則驗證過程還是會要你確認憑證是否是可信任的、是否要繼續連線。

所以建議向外部 CA 憑證機構購買 伺服器憑證 進行簽署,並定期更新,也可以省去要在終端設備安裝 Root CA 的種種問題。

  1. 如果有辦法處理各種終端平台的 Onborading 機制,也可以使用 Private CA Server 進行自我簽署。
  2. 可以參考 eduroam wiki 所說明 EAP Server 使用憑證的注意事項 。

憑證合併順序

簽署完畢後,大多數的憑證機構會寄發 X.509 Base64-encoded 格式的檔案,可以將收到的 伺服器公鑰, 中繼憑證以及私鑰都放在同一個檔案裡面,擺放的順序可以參考下面的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----BEGIN RSA PRIVATE KEY-----
...
(憑證私鑰)
...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...
(伺服器憑證公鑰)
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
(中繼憑證)
...
-----END CERTIFICATE-----

不需要將 Root CA 憑證放入。

儲存後記得調整檔案權限。

1
2
3
$ chown root.radiusd /etc/raddb/certs/certificate-combine.pem

$ chmod 640 /etc/raddb/certs/certificate-combine.pem

套用憑證至 EAP 設定檔

所有與 EAP 相關的參數都放置在 /etc/raddb/mods-available/eap 中,設定憑證位置的參數位在 tls-config tls-common {...} 這個 section 內。

/etc/raddb/mods-available/eap
1
2
3
4
5
6
7
8
9
eap {
...
tls-config tls-common {
private_key_password = whatever

# 將憑證路徑設定在以下兩個參數內
# ${certdir} 變數指的是 /etc/raddb/certs
private_key_file = ${certdir}/certificate-combine.pem
certificate_file = ${certdir}/certificate-combine.pem

開啟 PEAP/EAP-GTC 及 EAP-TTLS/PAP 驗證方法

/etc/raddb/mods-available/eap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
eap {
# 將預設值改成 peap
# default_eap_type = md5
default_eap_type = peap

...

gtc {
# 依據需求調整要使用的後端身份驗證機制
# 本範例使用 Perl 撰寫 POP3s 驗證,故將預設 Auth-Type 值改成 Perl,以進行 POP3s 驗證
# auth_type = PAP
auth_type = Perl
}

...

# 啟用 EAP-TTLS/PAP
ttls {
tls = tls-common
# 改成 pap
default_eap_type = pap

# 改成 yes,將 outer tunnel 的 Access-Request attribute 複製到 inner tunnel,以便進行政策判斷
copy_request_to_tunnel = yes
use_tunneled_reply = no
virtual_server = "inner-tunnel"
}

...

# 啟用 PEAP/EAP-GTC
peap {
tls = tls-common
# 改成 gtc
default_eap_type = gtc

# 改成 yes,將 outer tunnel 的 Access-Request attribute 複製到 inner tunnel,以便進行政策判斷
copy_request_to_tunnel = yes
use_tunneled_reply = no
virtual_server = "inner-tunnel"
}
...
}

設定 Virtual Sites

FreeRADIUS 預設會啟動 default 及 inner-tunnel 這兩個 site,而且預設也支援 EAP method,剛好可以區隔 outer / inner,所以就直接使用。

default

/etc/raddb/site-available/default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server default {
...
authorize {
filter_username
preprocess
detail

suffix
eap {
ok = return
}
files
expiration
logintime
pap
}
authenticate {
Auth-Type PAP {
pap
}

# 確認有啟用 eap
eap
}
...
}

inner-tunnel

/etc/raddb/site-available/inner-tunnel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server inner-tunnel {
...
authorize {
filter_username
suffix
update control {
&Proxy-To-Realm := LOCAL
}
eap {
ok = return
}
files

# 如果有額外設定 policy 可以在這邊設定
pop3s
expiration
logintime
pap
}
authenticate {
# 如果有需要用到 Perl 來開發相關身份驗證,可以在這邊設定
Auth-Type Perl {
perl
}
Auth-Type PAP {
pap
}
Auth-Type MS-CHAP {
mschap
}
mschap
eap
}
...
}