本檔案介紹兩種RADIUS安全機制:
本文檔介紹這些安全機制的用途、使用方式以及驗證失敗預期發生時間。
根據RFC 2865,驗證器標頭長度為16位元組。在訪問請求中使用時,稱為請求驗證器。當它用於任何型別的響應時,它稱為響應驗證器。它用於:
如果伺服器使用正確的響應身份驗證器進行響應,則客戶端可以計算該響應是否與有效請求相關。
客戶端傳送帶有隨機身份驗證器標頭的請求。然後,傳送響應的伺服器將使用請求資料包以及共用金鑰來計算響應身份驗證器:
ResponseAuth = MD5(Code + ID + Length + RequestAuth + Attributes + Secret)
接收響應的客戶端執行相同的操作。如果結果相同,則表示資料包正確。
如果交換機不再快取請求(例如,由於超時),則會出現驗證失敗。 當共用金鑰無效時,您也可能遇到此情況(是 — Access-Reject也包含此標頭)。 如此,網路存取裝置(NAD)可以偵測共用密碼不相符。通常,身份驗證、授權和記帳(AAA)客戶端/伺服器會將其報告為共用金鑰不匹配,但不會顯示詳細資訊。
身份驗證器標頭也用於避免以純文字檔案格式傳送使用者密碼屬性。首先計算消息摘要5(MD5 - secret, authenticator)。然後執行多個帶有密碼塊的XOR操作。此方法容易受到離線攻擊(彩虹表),因為MD5不再被視為一個強大的單向演算法。
以下是用於計算使用者密碼的Python指令碼:
def Encrypt_Pass(password, authenticator, secret):
m = md5()
m.update(secret+authenticator)
return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(password.ljust
(16,'\0')[:16], m.digest()[:16]))
如果RADIUS Access-Request中的任何屬性已更改(例如RADIUS ID、使用者名稱等),應生成新的Authenticator欄位,並應重新計算依賴該欄位的所有其他欄位。如果是重傳,則無需更改。
Access-Request和Accounting-Request的Authenticator Header的含義不同。
對於Access-Request,Authenticator是隨機生成的,它需要接收響應,並且ResponseAuthenticator計算正確,這證明了響應與該特定請求相關。
對於Accounting-Request,Authenticator不是隨機的,但它是計算的(根據RFC 2866):
RequestAuth = MD5(Code + ID + Length + 16 zero octets + Attributes + Secret)
這樣,如果重新計算的值與Authenticator值不匹配,伺服器可以立即檢查記帳消息並丟棄資料包。身份服務引擎(ISE)返回:
11038 RADIUS Accounting-Request header contains invalid Authenticator field
此問題的典型原因是共用金鑰不正確。
Message-Authenticator屬性是在RFC 3579中定義的RADIUS屬性。其用途類似:進行簽名和驗證。但這一次,它不是用於驗證響應,而是用於驗證請求。
傳送存取要求的使用者端(也可以是回應Access-Challenge的伺服器)會根據自己的封包計算基於雜湊的訊息驗證碼(HMAC)-MD5,然後新增訊息驗證器屬性作為簽名。然後,伺服器可以驗證它是否執行了相同的操作。
此公式類似於身份驗證器標頭:
Message-Authenticator = HMAC-MD5 (Type, Identifier, Length, Request Authenticator,
Attributes)
HMAC-MD5函式有兩個引數:
每個資料包都必須使用Message-Authenticator,其中包括可擴展身份驗證協定(EAP)消息(RFC 3579)。 這包括傳送訪問請求的客戶端和使用Access-Challenge進行響應的伺服器。如果驗證失敗,另一端應靜默丟棄資料包。
當共用金鑰無效時,將發生驗證失敗。然後,AAA伺服器無法驗證請求。
ISE報告:
11036 The Message-Authenticator Radius Attribute is invalid.
這通常發生在附加EAP消息的較後階段。802.1x作業階段的首個RADIUS封包不包括EAP訊息;沒有Message-Authenticator欄位,並且無法驗證請求,但在此階段,客戶端可以使用Authenticator欄位驗證響應。
以下範例顯示如何手動計數值,以確保正確計算值。
已選擇資料包編號30(Access-Request)。它位於EAP會話的中間,資料包包括Message-Authenticator欄位。目的是驗證Message-Authenticator是否正確:
pluton # cat packet30-clear-msgauth.bin | openssl dgst -md5 -hmac 'cisco'
(stdin)= 01418d3b1865556918269d3cf73608b0
使用Python指令碼可以計算相同內容:
pluton # cat hmac.py
#!/usr/bin/env python
import base64
import hmac
import hashlib
f = open('packet30-clear-msgauth.bin', 'rb')
try:
body = f.read()
finally:
f.close()
digest = hmac.new('cisco', body, hashlib.md5)
d=digest.hexdigest()
print d
pluton # python hmac.py
01418d3b1865556918269d3cf73608b0
上例展示如何從Access-Request計算Message-Authenticator欄位。對於Access-Challenge、Access-Accept和Access-Reject,邏輯完全相同,但必須記住應使用Request Authenticator,這在前一個Access-Request資料包中提供。
修訂 | 發佈日期 | 意見 |
---|---|---|
1.0 |
20-Jan-2016 |
初始版本 |