802.1X 賬號密碼+設備信息雙重認證


名詞解釋

802.1X:

IEEE802 LAN/WAN 委員會為解決無線局域網網絡安全問題,提出了 802.1X 協議。后來,802.1X協議作為局域網端口的一個普通接入控制機制在以太網中被廣泛應用,主要解決以太網內認證和安全方面的問題。802.1X 協議是一種基於端口的網絡接入控制協議(port based network access control protocol)。“基於端口的網絡接入控制”是指在局域網接入設備的端口這一級對所接入的用戶設備進行認證和控制。連接在端口上的用戶設備如果能通過認證,就可以訪問局域網中的資源;如果不能通過認證,則無法訪問局域網中的資源。

EAP協議:

EAP(Extensible Autllentication Protocol) 協議是 802.1X協議定義的一種報文封裝格式,主要用於在客戶端和設備端之間傳送EAP協議報文,以允許EAP協議報文在LAN上傳送。目前可以采用的EAP類型包括:EAP-MD5、LEAP、PEAP、EAP—TLS 等方式。本文主要使用的協議為EAP-MD5協議,進行802.1X網絡認證。

FreeRADIUS:

RADIUS認證服務器(Remote Authentication Dial In User Service,遠程用戶撥號認證系統)是目前應用最廣泛的AAA協議(AAA=authentication、Authorization、Accounting,即認證、授權、計費),FreeRADIUS包含一個radius服務器和radius-client,可以對支持radius協議的網絡設備進行鑒權記賬。

RSA非對稱加密:

對稱加密算法在加密和解密時使用的是同一個秘鑰,與對稱加密算法不同,非對稱加密算法需要兩個密鑰:[公開密鑰](publickey)和[私有密鑰](privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那么只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。

問題&&現狀

目前802.1X網絡認證中EAP-MD5協議主要流程就是客戶端發送用戶賬號和經過MD5加密后的密碼到RADIUS認證服務器,RADIUS服務通過調用 OpenLDAP/Mysql 等組件,查詢對應的用戶是否存在,並校驗密碼是否一致,來判斷用戶是否合法,然后回應認證成功/失敗報文到接入設備,接入設備根據RADIUS服務器響應的報文,向客戶端響應成功/失敗狀態,並設置端口授權狀態,從而控制用戶是否能通過端口訪問網絡。

僅針對賬號密碼進行認證,這樣的驗證方式單一而且缺乏力度,忽略了終端安全。按照目前的認證方式,一旦用戶密碼不慎泄漏,非法用戶可以通過不可信的終端接入網內,從而存在很多安全隱患。在服務器、網絡、終端這樣三位一體的計算機通信系統上,終端是最為龐大的主體,而且攻擊也多半是從終端發起的。終端將成為我們安全體系中越發不可忽視的一環。只要保證目前系統中的所有主體都是安全可信賴的,而新的主體在加入網絡時也通過了安全性驗證,那么無論網絡規模如何發展,整個體系的安全性都能得到很好的保障。

技術方案

為了滿足網絡准入安全性要去,本方案主要是在原有的EAP-MD5協議賬號密碼單一認證基礎上,再通過驗證終端設備的硬件信息(MAC地址,CPU序列號,硬盤序列號等),在進行802.1X網絡認證的時,實現 賬號密碼+設備信息 雙重認證,從而提高對接入用戶與終端設備的可信性和可控性管理。

整體設計

802.1X賬號密碼+設備信息認證總體可以划分為下面幾個模塊

  1. 設備認證服務模塊:進行設備信息的錄入,並進行設備證書校驗等功能
  2. 客戶端模塊:客戶端模塊主要是發起經過改造后的802.1X認證協議
  3. freeradius認證服務模塊:freeradius服務模塊主要負責調用OpenLDAP/Mysql進行賬號密碼認證,並轉發EAP-MD5協議相關信息到設備認證服務端模塊,從而完成設備信息的校驗

改造前 EAP-MD5認證 流程如下

如圖所示:
avatar

  1. 當用戶有訪問網絡需求時打開 802.1X 客戶端程序,輸入已經申請、登記過的用戶名和碼,發起連接請求(EAPOL-Start 報文)。此時,客戶端程序將發出請求認證的報文給設備端,開始啟動一次認證過程。
  2. 設備端收到請求認證的數據幀后,將發出一個請求幀(EAP-Request/Identity 報文)要求用戶的客戶端程序發送輸入的用戶名。
  3. 客戶端程序響應設備端發出的請求,將用戶名信息通過數據幀(EAP-Response/Identity 報文)發送給設備端。設備端將客戶端發送的數據幀經過封包處理后(RADIUS Access-Request 報文)送給認證服務器進行處理。
  4. RADIUS 服務器收到設備端轉發的用戶名信息后,將該信息與數據庫中的用戶名表對比,找到該用戶名對應的密碼信息,用隨機生成的一個加密字對它進行加密處理,同時也將此加密字通過 RADIUS Access-Challenge 報文發送給設備端,由設備端轉發給客戶端程序。
  5. 客戶端程序收到由設備端傳來的加密字(EAP-Request/MD5 Challenge 報文)后,用該加密字對密碼部分進行加密處理(此種加密算法通常是不可逆的),生成 EAP-Response/MD5 Challenge 報文,並通過設備端傳給認證服務器。
  6. RADIUS 服務器將收到的已加密的密碼信息(RADIUS Access-Request 報文)和本地經過加密運算后的密碼信息進行對比,如果相同,則認為該用戶為合法用戶,反饋認證通過的消息(RADIUS Access-Accept 報文和 EAP-Success 報文)。

改造后 賬號密碼+設備信息認證 流程如下

如圖所示:
avatar

  1. 在客戶端發起802.1X網絡認證之前,設備認證服務端需要主動采集終端設備相關信息(MAC地址,CPU序列號,硬盤序列號等),通過SHA256摘要算法,生成設備信息摘要,將設備相關信息保存到設備認證服務端數據庫中
  2. 通過改造原有802.1X 客戶端程序,在改造前流程第5步,發送 MD5 Challenge 的同時,讀取出端設備相關信息並生成設備信息摘要,並通過RSA非對稱加密算法,加密摘要信息,通過EAP-MD5協議擴展字段 EAP-MD5 Extra Data 傳遞到freeradius認證服務器
  3. freeradius認證服務器通過配置開啟自身rlm_rest模塊,將加密后的設備摘要信息轉發到設備認證服務模塊
  4. 設備認證服務模塊讀取加密后的摘要信息,通過私鑰進行解密,然后在認證服務端數據庫中進行查詢,如果可以匹配到同樣的摘要信息,則表示該終端設備信息合法,返回成功狀態碼給freeradius認證服務器,freeradius認證服務器會結合賬號密碼認證結果統一判斷,如果 賬號密碼+設備信息 都認證通過,則允許用戶訪問網絡,否則不允許用戶訪問網絡

關鍵代碼

客戶端相關代碼

func (h *Handle) SendResponseMD5Chall(id uint8, salt, user, pass []byte) error { // MD5 Challenge MD5加密后的密碼信息 plain := []byte{id} plain = append(plain, pass...) plain = append(plain, salt[:0x10]...) cipher := md5.Sum(plain) data := append([]byte{uint8(len(cipher))}, cipher[:]...) //初始化密鑰對 rsaCryptoKey := GenRasKeyFromPem("./config/client_private.pem", "./config/server_public.pem") //獲取設備信息摘要(64位字符串) deviceInfo := GetSHA256DeviceInfo() //加密設備信息摘要 enc, err := rsaCryptoKey.RsaEncrypt([]byte(deviceInfo)) if err != nil { return err } //base64編碼 base64ExtarData := base64.StdEncoding.EncodeToString(enc) //將加密后的設備信息摘要加入到EAP請求包內 data = append(data, []byte(base64ExtarData)...) eth := layers.Ethernet{ SrcMAC: h.srcMacAddr, DstMAC: h.dstMacAddr, EthernetType: layers.EthernetTypeEAPOL, } eapol := layers.EAPOL{ Version: 0x01, Type: layers.EAPOLTypeEAP, Length: uint16(5 + len(data)), } eap := layers.EAP{ Code: layers.EAPCodeResponse, Id: id, Type: layers.EAPTypeOTP, TypeData: data, Length: eapol.Length, } if err := h.send(&eth, &eapol, &eap, &fillLayer); err != nil { return err } return nil } 

設備認證服務模塊

//授權操作 // http.StatusNoContent 對應freeradius ok 狀態 // http.StatusUnauthorized 對應freeradius reject 狀態 func Authorize(c *gin.Context) { var ( err error = nil data []byte = nil auth model.AuthorizeInfo = model.AuthorizeInfo{} ) //讀取freeradius rest模塊轉發的消息 data, err = ioutil.ReadAll(c.Request.Body) if err != nil { c.JSON(http.StatusUnauthorized, model.ErrResultModel(model.ParamErr, err.Error())) return } log.Info("Authorize data:%v", string(data)) err = json.Unmarshal(data, &auth) if err != nil { c.JSON(http.StatusUnauthorized, model.ErrResultModel(model.ParamErr, err.Error())) return } if len(auth.EAPMessage) <= 46 { c.JSON(http.StatusUnauthorized, model.ErrResultModel(model.ParamErr, "Authorize wrong length")) return } //EAPMessage消息結構:前14位為請求頭信息,15-46中間32位是MD5加密后的密碼信息,46-末尾是Extra Data 擴展字段的信息 extarData := auth.EAPMessage[46:] log.Info("Authorize extarData:%v", extarData) //解析設備摘要信息 decHexExtarData, err := hex.DecodeString(extarData) if err != nil { c.JSON(http.StatusUnauthorized, model.ErrResultModel(model.ParamErr, err.Error())) return } decBase64ExtarData, err := base64.StdEncoding.DecodeString(decHexExtarData) if err != nil { c.JSON(http.StatusUnauthorized, model.ErrResultModel(model.ParamErr, err.Error())) return } //解密設備摘要信息 deviceInfo, err := config.RsaCryptoKey.RsaDecrypt(decBase64ExtarData) if err != nil { c.JSON(http.StatusUnauthorized, model.ErrResultModel(model.ParamErr, err.Error())) return } //校驗設備摘要信息是否在數據庫內 _, err = dao.IsExist(deviceInfo) if err != nil { c.JSON(http.StatusUnauthorized, model.ErrResultModel(model.ParamErr, err.Error())) return } //校驗設備摘要信息通過則響應 http.StatusNoContent 204 狀態 c.JSON(http.StatusNoContent, model.OkResultModel("success")) return } 

freeradius認證服務模塊

freeradius認證服務模塊主要為相關配置,以實現認證消息轉發的功能

編譯安裝

rlm_rest 模塊默認是不會安裝的,需要手動編譯安裝 freeradius 服務,編譯安裝freeradius-rest 模塊時,需要進入 /src/modules/rlm_rest 模塊執行 ./configure 檢查是否確少依賴包,安裝完對應的依賴包,否則會導致 freeradius 安裝成功,而 rlm_rest 模塊編譯失敗的問題

配置rest模塊

  1. 通過軟連接啟用rest模塊
ln -s /usr/local/etc/raddb/mods-available/rest /usr/local/etc/raddb/mods-enabled/rest 
  1. 修改rest相關配置
vim /usr/local/etc/raddb/mods-enabled/rest //設備認證服務網關 connect_uri = "http://127.0.0.1:2017" //設置轉發參數和具體URL authorize { uri = "${..connect_uri}/user/authorize" method = 'post' body = 'json' data = '{"user_name":"%{User-Name}","eap_message":"%{EAP-Message}","mac_id":"%{Calling-Station-Id}"}' tls = ${..tls} } 
  1. 修改default文件,認證流程添加rest模塊
vim /usr/local/etc/raddb/sites-enabled/default authorize{ rest } authenticate{ Auth-Type rest{ rest } } accouting{ rest } 
  1. 重啟 freeradius認證服務 即可實現認證請求的轉發

實驗驗證

環境搭建:需要一台UOS客戶端兩台(一台設備信息已錄入,一台設備信息未錄入,安裝經過改造后的802.1X協議的客戶端),一台UOS服務端(編譯安裝freeradius),一台支持802.1X協議交換機(設置端口開啟802.1X協議認證)

場景一:測試 賬號密碼正確+設備信息未登記 場景

如圖所示:
avatar

客戶端2發起802.1X認證請求,賬號為:yangyi,密碼為:testing,設備摘要信息為:a4de2da2c87361550d24110dd18eb4c021e20db461102e677683aab5490e3484,在 EAP-MD5 請求 Response MD5-Challenge 節點,將經過加密后的摘要信息發送到設備認證服務器端,因為此設備摘要信息未在設備認證服務器端登記,所以交換機響應 Failure 狀態,用戶入網失敗

場景二:測試 賬號密碼正確+設備信息已登記 場景

如圖所示:
avatar

客戶端1發起802.1X認證請求,賬號為:yangyi,密碼為:testing,設備摘要信息為:21e20db461102e677683aab5490e3484a4de2da2c87361550d24110dd18eb4c0,在EAP-MD5 請求 Response MD5-Challenge 節點,將經過加密后的摘要信息發送到設備認證服務器端,因為此設備摘要信息已在設備認證服務器端登記,所以交換機響應 Success 狀態,用戶入網成功

小結

以上介紹了802.1X基於端口訪問控制協議的相關技術,提出並實現基於賬號密碼+設備信息雙重認證的方案,以及對802.1X協議的擴展。整個系統是在Linux平台上基於802.1X認證的開源客戶端工具和服務器端軟件FreeRADIUS進行新功能開發和改進,並最終實現了用戶賬號密碼認證和設備信息雙重認證的功能。所實現的系統在用戶發起入網請求時,客戶端軟件會自動獲取終端設備信息,並生成設備信息摘要,和經過MD5加密后密碼,一起發送到FreeRADIUS認證服務器,使得FreeRADIUS服務器在完成對用戶身份驗證的同時也可以完成對終端設備信息的可信認證。最后的測試結果顯示,該方案可以滿足可信網絡連接的基本功能需求,將來可以實際應用於可信網絡的接入控制。

但目前的該方案也存在以下一些不足之處:

  • EAP—MD5協議目前只能支持有線網絡接入認證,對於無限網絡接入認證,還需要進一步的研究
  • 設備擴展信息雖然通過RSA非對稱加密后的密文進行傳輸,但公鑰保存在客戶端,可能存在泄漏的風險,可以考慮對公鑰進行密碼保護,或者需要管理員權限才可以讀取到公鑰信息,或者直接由服務端下發證書給客戶端的方案

參考資料

轉自:https://www.cnblogs.com/MR-YY/p/13728536.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM