Cyber Coding Course

師其意,不泥其跡

用docker建立WPA2/EAP企業用Radius驗證伺服器,後端使用mysql資料庫

AP提供了WPA2/EAP功能,但不會用嗎?
本文介紹我如何透過docker的ubuntu:21.04 image,極速建立Radius伺服器,
與Wifi的WPA2/EAP等相關運用。

先來看看我的試用結果吧:


GitHub放於此處下載:
https://github.com/DevinY/radius

原則上請依README.md進行即可,這裡我會解做更詳細的操作說明:
在開始前,首先我們需要有docker。

一、下載下來後,進入radius目錄中,請透過docker-compose的build功能來建立image。
在目錄不改變的情況下,會產生radius_radius的image。
docker-compose build --no-cache

如果您不想使用此image的名稱,docker-compose.yml內的radius服務記得指定您自己build的image名稱。

二、產生自簽憑證,在radius目錄中執行,會產生兩個檔案server.crt及server.key。
您是可以自行調整subj的內容的,我不想一天到晚改憑證,這裡設定了3650天,
另外在這裡的金鑰是沒密碼的,我想如果您需有有密碼,容器啟動後可到容器中去make,再拷出來用。
openssl req -x509 \
-subj '/C=TW/ST=Taiwan/L=Panchiao/CN=ccc.tc' \
-nodes -newkey rsa:2048 -keyout server.key -out server.crt -days 3650

如果到容器中make,您至少需改三個檔案ca.cnf、client.cnf及server.cnf。
目錄為/etc/freeradius/3.0/certs

三、取得radius設定檔,radius註解很多修改及觀看不容易,在這裡我提了一隻bash可以把設定檔拷出來。
並且移除掉所有的註解,在後面的radius_radius為image的名稱。
./getconfig.sh radius_radius

換句語說,如果您想了解所有的內容或註解說明,您可以進入容器上觀看哦。
docker run --rm -ti radius_radius bash

主要的設定檔放那裡,可以透過cat查看bash內容,應該不難發現。
cat getconfig.sh

另外,在這個repo中,我也方了一個diff.html,可透用瀏覽器開啟,
可以看到我對原始設定檔做了那些變更。:)

四、啟動容器
docker-compose up -d

五、我們可以透過ps來查看是否有正確啟動。
docker-compose ps
Name                   Command             State                       Ports
------------------------------------------------------------------------------------------------------
radius_db_1       docker-entrypoint.sh mysqld   Up      0.0.0.0:33060->3306/tcp
radius_radius_1   /usr/sbin/freeradius -X       Up      0.0.0.0:1812->1812/udp, 0.0.0.0:1813->1813/udp

六、確認db是up的情況,就能來建立DB了。
-h db為資料庫容器的服務名稱,有些環境下需要,有些環境下不需要,必免不必要的問題,就打上吧。
docker-compose exec db mysql -h db -e "create database radius"
docker-compose exec db mysql -h db -e "grant all on radius.* to 'radius'@'%' identified by 'hlOTg2ZmNk'"

第一行指令,建立了radius資料庫,第二行則是授權radius使用者,有完整的權限可存取radius資料庫。
資料庫的密碼,請自行調整。

七、進入radius容器內,建立schema
完成上方的資料庫建立,我們就能來建立radius伺服器後端資料庫mysql的schema啦,執行下方進入
radius的容器服務。
docker-compose exec radius bash

八、可以先來測看看,連db服務是否有問題。
mysql -uradius -phlOTg2ZmNk -h db

密碼與參數可以不需空格,所以上方指令沒打錯喔,「hlOTg2ZmNk」為密碼,正常進入後,
我們能用control+d跳離。


貼上下方指令,就能建立所有需要的table到radius資料庫囉,如果您在第六步中使用了自訂的密碼
,記得要調整下方指令,密碼的部份。
mysql -uradius -phlOTg2ZmNk -h db radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql

九、建立帳號
回到host端,我這個repo,我提供一個簡單的指令,來產生radius的帳號及密碼。
第一個參數是帳號及第二個參數是密碼。
./adduser.php devin test

radius提供了相當多的attribute類型,如下表:
       Header	    Attribute		Description
------	    ---------		-----------
{clear}	    Cleartext-Password	Clear-text passwords
{cleartext}  Cleartext-Password	Clear-text passwords
{crypt}	    Crypt-Password	Unix-style "crypt"ed passwords
{md5}	    MD5-Password	MD5 hashed passwords
{base64_md5} MD5-Password	MD5 hashed passwords
{smd5}	    SMD5-Password	MD5 hashed passwords, with a salt
{sha}	    SHA-Password	SHA1 hashed passwords
SHA1-Password	SHA1 hashed passwords
{ssha}	    SSHA-Password	SHA1 hashed passwords, with a salt
{sha2}	    SHA2-Password	SHA2 hashed passwords
{sha224}     SHA2-Password	SHA2 hashed passwords
{sha256}     SHA2-Password	SHA2 hashed passwords
{sha384}     SHA2-Password	SHA2 hashed passwords
{sha512}     SHA2-Password	SHA2 hashed passwords
{ssha224}    SSHA2-224-Password	SHA2 hashed passwords, with a salt
{ssha256}    SSHA2-256-Password	SHA2 hashed passwords, with a salt
{ssha384}    SSHA2-384-Password	SHA2 hashed passwords, with a salt
{ssha512}    SSHA2-512-Password	SHA2 hashed passwords, with a salt
{nt}	    NT-Password 	Windows NT hashed passwords
{nthash}     NT-Password 	Windows NT hashed passwords
{md4}	    NT-Password 	Windows NT hashed passwords
{x-nthash}   NT-Password 	Windows NT hashed passwords
{ns-mta-md5} NS-MTA-MD5-Password Netscape MTA MD5 hashed passwords
{x- orcllmv} LM-Password 	Windows LANMAN hashed passwords
{X- orclntv} NT-Password 	Windows NT hashed passwords

我選擇後端採用mysql就是因為這我覺的要更新比較方便,至少我自己覺的會比ldap來的容易..:p
當然在Radius的環境下,後端資料庫是有多種平台可以選擇的。

十、修改clients.conf
您可以變更您想用的secret。
由於在容器中ip是隨機,所以我用*。如果您想使用一個特定IP,需視您執行的環境而定。
如果您對docker有一定的了解,我想絕對不難才是,當您的host在Linux環境下,
可透過network_mode: host進行,當然您是需要自行調整docker-compose.yml,
如果您不了解相關,那別浪費時間了,讓他是ipaddr = *號就沒錯了。
client wifi {
ipaddr = *
secret = testing123
}

十一、修改sql檔
dialect及driver刪掉,貼上下面五行。
原內容
dialect = "sqlite"
driver = "rlm_sql_null"

變更為(資料庫密碼於第六步若有變更,請自行調整)
dialect = "mysql"
driver = "rlm_sql_${dialect}"
server = "db"
port = 3306
login = "radius"
password = "hlOTg2ZmNk"

十二、重啟測試囉
重啟容器使用參數--remove-orphans在啟動時看起來較沒問題。
有時會啟動失敗,不太清楚為何。
docker-compose down --remove-orphans
docker-compose up -d

十三、檢視服務功能
我們能用下方指令查看狀態,看到兩個Up,我想大概沒啥問題了。
docker-compose ps
Name                   Command             State                       Ports
------------------------------------------------------------------------------------------------------
radius_db_1       docker-entrypoint.sh mysqld   Up      0.0.0.0:33060->3306/tcp
radius_radius_1   /usr/sbin/freeradius -X       Up      0.0.0.0:1812->1812/udp, 0.0.0.0:1813->1813/udp

如果radius,沒啟動成功,可以重新執行第十二部看看,或是先看一下log,指令如下:
docker-compose logs -f radius

例如,我碰過在我家的Synology NAS上安裝,檔案權限太開放啟動失敗,這時可以透過
「chmod 750 檔名」調整,特別是eap、clients.conf、default等檔案。

最後,我們可以透過上方的logs模式,觀察Client的連線結果是否正常,在AP的設定如下,示意圖:


在MacOS及iOS環境會需要有Apple Configurator2的描速檔才能正常連線。
大至內容如下:


額外測試EAP-TTLS功能
一、進入radius容器內
docker-compose exec radius bash
二、安裝需要的檔案
apt install -y build-essential pkg-config libnl-3-dev libssl-dev libnl-genl-3-dev
三、取得測試的souce,並依次貼下指令
#下載souce
wget https://w1.fi/releases/wpa_supplicant-2.7.tar.gz

#解壓縮並進入目錄中
tar zxvf wpa_supplicant-2.7.tar.gz&&cd wpa_supplicant-2.7/wpa_supplicant

#建立並變更.config啟動CONFIG_EAPOL_TEST=y
sed 's/#CONFIG_EAPOL_TEST=y/CONFIG_EAPOL_TEST=y/g' defconfig > .config

#編譯及安裝eapol_test
make eapol_test;cp eapol_test /usr/local/bin

四、建立test.conf測試檔。內容請使用自己建立的帳號及密碼。
network={
     ssid="SSID_OF_THE_WIFI_NETWORK"
     key_mgmt=WPA-EAP
     eap=TTLS
     identity="devin"
     anonymous_identity="anonymous"
     password="test"
     phase2="auth=PAP"
     eapol_flags=3
}
五、執行指令測試
eapol_test -c test.conf -a 127.0.0.1 -p 1812 -s testing123
執行結果,看到SUCCESS,代表測試成功:)


 

作者: Devin Yang