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

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

設定 TLS Tunnel 所使用的憑證

PEAPEAP-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
}
...
}