December 31, 2013

使用 freeRadius 設置 802.1X 認證環境(三)EAP-TLS篇

本系列文利用真實世界的例子,示範如何使用 freeRadius 設置 802.1X 認證環境。


目錄


(一) 事前作業

在上一篇文章中,我們完成了下面幾點

  • 在 Authentication Server 安裝 freeRadius
  • 設定 freeRadius 可接受的 Clients 與 Users
  • 設定 Authenticator ( Asus RT-N16 AP) 的內外部 IP、認證機制( WPA2-Enterprise )、Authentication Server 位置
  • 成功讓 Supplicant 透過 EAP-MD5 認證方式被 freeRadius Server 認證

這篇文章中,我們要以 EAP-TLS 取代剛剛的 EAP-MD5 認證方式,模擬情境與架構圖與上篇文章完全相同。

我們需要建立三個 certificates:

  1. 自己的 CA
  2. 用自己的 CA 簽章的 Server Certification (之後放到Server)
  3. 用自己的 CA 簽章的 Client Certification (之後發給使用者)

當我們第一次用 root 執行 radiusd -X 時,就會自動產生 CA certificate 與 server certificate。

Radius 的 Certificates 放在下列資料夾,資料夾內的 README 檔案內有詳細說明如何建立 CA certificate, Server certificate 與 Client certificate,建議自行閱讀。


(二) 建立自己的 CA

為了怕等等出錯,先把目前的 certs 備份起來:

mkdir ~/backup_cert
sudo cp certs/* ~/backup_cert/

移除預設的 certificates

rm -f *.pem *.der *.csr *.crt *.key *.p12 serial* index.txt*

修改 input_password, output_password, [certificate_authority]

vim ca.cnf

# This step creates the CA certificate.
make ca.pem
# This step creates the DER format of the self-signed certificate.
make ca.der

這兩個 make 指令其實就是圖中那兩個 openssl 指令。


(三) 建立用自己的 CA 簽章的 Server Certification

接下來產生 server certificate

vim ca.cnf

input_password, output_password, [certificate_authority]

最重要的 CN (Common Name),不可以跟 CA 重複,input_password、output_password 之後簽 client certificate 時會用到,其他資料隨便填寫即可,畢竟我們這裡只是測試用。

make server.pem

想知道這個 make 在做什麼的可以

  • man openssl
  • man ca
  • man pkcs12
  • 第一步先產生 server.csr
  • 第二步用剛剛的 CA 去簽 server certificate,產生 server.crt
  • 第三步用 server.crt 產生 server.p12
  • 第四步用 server.p12 產生 server.pem

注意這邊是用 grep | out_password


(四) 建立用自己的 CA 簽章的 Client Certification

接下來產生 client certificate

vim client.cnf

改 input_password, output_password, [certificate_authority]

最重要的 CN (Common Name),不可以重複,Be sure that the commonName field here is the User-Name that will be used for logins!

input_password、output_password 之後要給使用這個 client certificate 的使用者(cchien)。

make client.pem

  • 第一步先產生 client.csr
  • 第二步用剛剛的 CA 去簽 client certificate,產生 client.crt
  • 第三步用 client.crt 產生 client.p12
  • 第四步用 client.p12 產生 client.pem
  • 第五步將 client.pem複製一份重新命名為 “$emailAddress”.pem (最後一行)

注意這邊是用 grep | out_password

最後要發給使用者的就是這個 certificate (cchien@wire.cs.nctu.edu.tw.pem) 以及剛剛的 input_password、output_password、還有 root CA 的 ca.pem

若要再製作更多 client certificate,just repeat the steps for making a client certificate.
Be sure to enter a different login name for “commonName”, and a different password.


(五) 設定 Raduis

當 Server、Client 的 certificate 都製作完成後,就可以開始用 TLS 認證了。

記得!
Once the final certificates have been created, you can delete the “bootstrap” command from this directory,
and delete the “make_cert_command” configuration from the “tls” sub-section of eap.conf.

反正我們之前有備份,所以直接砍掉 bootstrap 吧

rm

接下來去編輯 eap.conf,裡面有很多說明,自己看,我們比較要注意的是 EAP-TLS 部分。預設的 eap type 為 md5 ,將 md5 改為 tls。

因為我們已經自己 generate 出 CA、Server certificate 和 Client certificate,不再需要 臨時(snake-oil) 的 certificates,所以把 make_cert_command 註解掉。

想要更詳細說明,請直接閱讀 檔案內的 EAP-TLS 部分。

接著重新開啟 radiusd -X。

會出現這樣的錯誤
rlm_eap: SSL error error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

rlm_eap_tls: Error reading private key file /usr/local/etc/raddb/certs/server.pem

rlm_eap: Failed to initialize type tls

明明就照著 README 做啊,為啥會不行?提示就在文字中:從 server.pem 讀取 private key 時出了問題。

回到 eap.conf 中,找到 tls 欄位:

然後看看 cert 資料夾內的檔案:

重新指定 private_key_file 檔案,private_key_password 也要更改成剛剛設定的東西。

這樣就可以啟動 radiusd -X 了。


(六) 設定 Supplicant

開啟 Supplicant ,將 client certificate、client key 、CA certificate 弄到那台筆電內,下圖模擬:用你認為安全的方式 將這些檔案交給使用者。

為什麼 CA certificate 也要一起丟給 supplicant 呢?

用 Supplicant 連 AP,AP 會連上 Radius Server,要求 Server 認證 Supplicant。

TLS (或 TTLS) 會建立 TLS Tunnel,建立 TLS Tunnel 之前,supplicant 會需要先認證 Server,也就是認證 server certificate。

還記得前幾個步驟嗎?

我們的 Radius 的 server certificate 是由我們自行 generate 之 CA certificate 簽名的,supplicant 理論上不認識這個 CA certificate,故不會信任此 CA sertificate 所核可的 server certificate。所以我們要手動將 CA certificate 加入 supplicant 的 “我可以信任之CA” 列表內,這樣 supplicant 才能信任 server certificate,TLS Tunnel 才能建立起來。

在 Ubuntu 要手動加入 Root CA 可以參考這篇文章

vim /etc/ca-certificates.conf

update-ca-certificates

開啟網路連線,認證方式選擇 TLS:

  • Identity 就是剛剛建立 client certificate 填寫的 CN ( common name )
  • User certificate 就是剛剛的 client certificate
  • CA certificate 就是剛剛的 CA certificate
  • Private Key 就是剛剛的 client private key
  • Private Key password 就是剛剛建立 client certificate 填寫的 output_password

要有這個 private key password 才能解密你的 private key,可以多一層保障。

最後 Radius 認證成功的話,Supplicant 就可以連上 Internet 了。

到這邊我們已經成功以 EAP-TLS 完成 802.1X 認證了。


Tips: 有時候系統會自動紀錄無線網路連線,這會讓我們做實驗時造成困擾,可以手動刪掉紀錄。


本系列文利用真實世界的例子,示範如何使用 freeRadius 設置 802.1X 認證環境。