RADIUS 是一種網路驗證、授權和計費協定,根據 UDP 協定,透過封包 ID、驗證器和屬性值對等欄位實作安全可靠的通訊。在 Linux 系統上,FreeRADIUS 提供了完善的 RADIUS 服務實作。本文從本地驗證開始,逐步引導讀者設定 FreeRADIUS,並探討如何整合 LDAP/LDAPS 後端驗證以提升安全性。此外,文章也涵蓋了 NTLM 和 CHAP 等驗證方法,並解析了與 Active Directory 整合的組態步驟,提供完整的 RADIUS 佈署。
RADIUS 服務基礎:原理與運作解析
RADIUS(Remote Authentication Dial-In User Service)是一種用於網路存取控制的驗證、授權和計費(AAA)協定,廣泛應用於網路裝置、無線網路和 VPN 等場景。本章節將探討 RADIUS 的基本原理、封包結構以及如何使用 Linux 實作 RADIUS 服務。
RADIUS 封包結構解析
RADIUS 使用 UDP 協定進行通訊,由於 UDP 是無連線的,因此需要在封包內容中維護請求與回應之間的關聯。主要欄位包括:
- Packet ID(封包 ID):用於將請求和回應封包進行比對。
- Authenticator(驗證器):每個封包的唯一隨機值,用於增強安全性。
- Attribute-Value Pairs(屬性-值對,AVP):RADIUS 封包的主要內容,包含使用者驗證資訊、網路存取控制引數等。
簡易 RADIUS 請求範例
在一個簡單的 RADIUS 請求中,可能包含以下 AVP:
- User-Name(使用者名稱):以明文傳輸。
- User-Password(使用者密碼):使用 MD5 雜湊演算法進行保護,結合了分享金鑰(Shared Secret)和 Request Authenticator。
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
| Code (1 byte) | Identifier (1 byte) |
| Length (2 bytes) |
| Authenticator (16 bytes) |
| Attribute-Value Pairs (variable) |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
內容解密:
- Code 欄位表示 RADIUS 請求的型別,例如 Access-Request(1)、Access-Accept(2)或 Access-Reject(3)。
- Identifier用於比對請求和回應封包。
- Authenticator欄位確保封包的真實性,防止重放攻擊。
- Attribute-Value Pairs提供擴充套件性,不同的 AVP 可用於不同的驗證和授權需求。
RADIUS 回應機制
RADIUS 回應通常較為簡單,主要包含以下內容:
- Code:2 表示 Access-Accept,3 表示 Access-Reject。
- Packet ID:與請求封包相同,用於比對請求與回應。
- Response Authenticator:根據回應封包內容、請求驗證器和分享金鑰計算得出,用於驗證回應來源的合法性。
簡易 RADIUS 回應範例
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
| Code (2/3) | Identifier (1 byte) |
| Length (2 bytes) |
| Response Authenticator (16 bytes) |
| Attribute-Value Pairs (variable) |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+
內容解密:
- **Code 為 2(Access-Accept)**表示驗證成功,使用者獲準存取網路資源。
- **Code 為 3(Access-Reject)**表示驗證失敗,通常由使用者名稱或密碼錯誤引起。
- Response Authenticator確保回應封包來自合法的 RADIUS 伺服器。
使用 Linux 實作 RADIUS 服務
本文將介紹如何使用 FreeRADIUS 在 Linux 上建立基本的 RADIUS 服務。首先,使用本地驗證方式進行簡易組態。
Step 1:安裝 FreeRADIUS
sudo apt-get install freeradius
Step 2:組態 RADIUS 使用者端
編輯 /etc/freeradius/3.0/clients.conf 檔案,新增網路存取裝置(NAS)的組態資訊,包括裝置名稱、IP 位址和分享金鑰。
client sw-core01 {
ipaddr = 192.168.122.9
nastype = cisco
secret = 7HdRRTP8qE9T3Mte
}
client vwlc01 {
ipaddr = 192.168.122.8
nastype = cisco
secret = uKFJjaBbk2uBytmD
}
內容解密:
client區塊定義了一個 RADIUS 使用者端,即進行驗證請求的網路裝置。ipaddr指定了使用者端的 IP 位址,用於比對請求來源。secret為分享金鑰,用於加密和驗證 RADIUS 請求與回應。nastype可選引數,用於標識裝置型別,便於後續策略制定。
本地驗證的優缺點分析
使用本地驗證的優點是組態簡單,便於測試。然而,在生產環境中存在以下問題:
- 密碼以明文儲存,一旦組態檔案被洩露,所有密碼將被竊取。
- 缺乏非否認性,管理員可取得使用者密碼,無法有效追責。
- 使用者無法自行修改密碼,增加管理複雜度。
因此,在實際應用中,通常會結合後端驗證資料函式庫(如 LDAP 或資料函式庫)來提升安全性和可用性。
RADIUS 服務於 Linux 的進階設定:結合 LDAP/LDAPS 後端驗證
在前面的章節中,我們已經成功地在 Linux 系統上安裝並設定了 FreeRADIUS 服務,並且進行了基本的測試。然而,在實際的企業環境中,我們通常需要將 RADIUS 服務與後端的目錄服務(如 LDAP 或 LDAPS)整合,以實作更為強大的身份驗證和管理功能。本章節將探討如何將 FreeRADIUS 與 LDAP/LDAPS 後端驗證結合,以滿足企業級的安全需求。
為何選擇 LDAP/LDAPS 後端驗證?
使用 LDAP/LDAPS 作為後端驗證儲存有多個優勢。首先,這種方法可以利用現有的目錄服務架構,無需額外維護多套使用者憑證系統。其次,透過將 RADIUS 驗證與 LDAP/LDAPS 整合,可以實作統一的密碼管理,使用者只需記住一套登入憑證。此外,當使用者離開組織或變更許可權時,只需在 LDAP 目錄中進行一次變更,即可同步更新 RADIUS 的驗證結果。
然而,這種方法的缺點也很明顯:使用者往往難以選擇足夠強壯的密碼。這使得攻擊者可以透過憑證填充(credential stuffing)或暴力破解(brute forcing)等手段嘗試取得未授權的存取權。因此,對於面對公網的服務介面,強烈建議實施多因素驗證(MFA)。
攻擊者可能利用的弱點
攻擊者可能會利用以下方法來嘗試取得存取權:
- 憑證填充:攻擊者收集其他洩漏事件中的密碼,或是與目標組織相關的常見密碼,然後嘗試使用這些密碼登入目標系統。這種攻擊往往非常有效,因為許多使用者會重複使用相同的密碼。
- 暴力破解:攻擊者嘗試使用所有可能的密碼組合來登入目標帳戶。這種方法可能耗時較長,但隨著計算能力的提升,暴力破解變得越來越可行。
設定 RADIUS 使用 LDAP/LDAPS 驗證
要將 FreeRADIUS 設定為使用 LDAP/LDAPS 進行驗證,首先需要安裝 freeradius-ldap 套件。執行以下命令進行安裝:
$ sudo apt-get install freeradius-ldap
接下來,需要取得 LDAPS 伺服器所使用的 CA 伺服器公開憑證,並將其儲存在 /usr/share/ca-certificates/extra 目錄中。假設憑證檔案名為 publiccert.crt,可以使用以下命令完成此步驟:
$ sudo mkdir /usr/share/ca-certificates/extra
$ sudo cp publiccert.crt /usr/share/ca-certificates/extra
$ sudo dpkg-reconfigure ca-certificates
在重新設定 CA 憑證的過程中,請確保選取剛剛新增的憑證。
編輯 LDAP 設定檔
接下來,需要編輯 /etc/freeradius/3.0/mods-enabled/ldap 設定檔。如果該檔案不存在,可以參考 /etc/freeradius/3.0/mods-available/ldap 檔案,或是直接連結到該檔案。
在 ldap 設定區塊中,需要指定 LDAP 伺服器的相關資訊,例如伺服器位址、埠號、以及用於查詢的使用者身份等。以下是一個範例設定:
ldap {
server = 'dc01.coherentsecurity.com'
port = 636
identity = [email protected]
# 其他設定...
}
詳細解說:LDAP 設定檔的關鍵引數
在上述設定中:
server指定了 LDAP 伺服器的位址或主機名。port指定了 LDAPS 服務使用的埠號,通常為 636。identity指定了一個具有適當許可權的使用者,用於執行 LDAP 查詢。
設定完成後的測試與驗證
完成上述設定後,請重新啟動 FreeRADIUS 服務,並進行必要的測試,以確保 LDAP/LDAPS 驗證功能正常運作。
$ sudo service freeradius restart
使用 radclient 命令測試 RADIUS 認證是否成功:
$ echo "User-Name=testaccount,User-Password=Test123" | radclient localhost:1812 auth testing123
如果一切設定正確,您應該會收到 Access-Accept 回應,表示認證成功。
RADIUS 與 LDAP/LDAPS 後端驗證整合
在許多組織中,將 RADIUS 連結到 Active Directory(AD)以取得帳戶資訊和群組成員資格是最常見的組態。雖然 Microsoft Network Policy Server(NPS)是免費的,且易於安裝在成員 Windows 伺服器上,但它並沒有簡單的組態來連結到雙因素驗證(2FA)服務,如 Google Authenticator。這使得根據 Linux 的 RADIUS 伺服器與 AD 整合成為需要多因素驗證(MFA)組織的吸引力選擇,同時也能利用 AD 群組成員資格來建立存取許可權。
設定 LDAP/LDAPS 後端驗證
首先,我們需要在 /etc/freeradius/3.0/mods-enabled/ldap 檔案中設定 LDAP 或 LDAPS 後端驗證。以下是一個範例組態:
server = 'ldap://192.168.1.100'
identity = 'CN=ldapuser,CN=Users,DC=coherentsecurity,DC=com'
password = '<password>'
base_dn = 'DC=coherentsecurity,DC=com'
user {
filter = "(samaccountname=%{%{Stripped-User-Name}:-%{User-Name}})"
}
tls {
ca_file = /usr/share/ca-certificates/extra/publiccert.crt
}
內容解密:
server:指定 LDAP 伺服器的 URL。如果使用 LDAPS,則需指定ldaps://。identity:用於連線 LDAP 伺ervcice 的使用者 DN。password:連線 LDAP 伺服器的使用者密碼。base_dn:搜尋使用者的基本 DN。user.filter:用於搜尋使用者的篩選器,使用samaccountname屬性比對使用者名稱。tls.ca_file:指定用於驗證 LDAPS 伺服器證書的 CA 證書檔案。
如果使用 LDAP 而非 LDAPS,則需將埠更改為 389,並移除或註解掉 tls 部分。
@startuml
title RADIUS Authentication Flow with LDAP Backend
participant User
participant "NAS (e.g., Wi-Fi AP)" as NAS
participant "FreeRADIUS Server" as RADIUS
participant "LDAP / Active Directory" as LDAP
User -> NAS: Connects (provides credentials)
NAS -> RADIUS: Access-Request (User-Name, User-Password)
activate RADIUS
RADIUS -> LDAP: LDAP Bind Request (search user)
activate LDAP
LDAP --> RADIUS: User Found / Bind Success
deactivate LDAP
note right of RADIUS: RADIUS validates credentials against LDAP
alt Authentication Successful
RADIUS --> NAS: Access-Accept
NAS -> User: Grant Access
else Authentication Failed
RADIUS --> NAS: Access-Reject
NAS -> User: Deny Access
end
deactivate RADIUS
@enduml
將 PAP 驗證導向 LDAP
接下來,我們需要將 Password Authentication Protocol(PAP)驗證導向 LDAP。為此,我們需要在 /etc/freeradius/3.0/sites-enabled/default 檔案的 authenticate / pap 部分新增以下內容:
pap
if (noop && User-Password) {
update control {
Auth-Type := LDAP
}
}
同時,請確保在同一部分取消註解 ldap 行:
ldap
內容解密:
- 這段組態指示 FreeRADIUS 在進行 PAP 驗證時使用 LDAP 進行身份驗證。
- 當收到使用者的驗證請求時,FreeRADIUS 將根據 LDAP 伺服器驗證使用者憑據。
測試 RADIUS 伺服器
完成上述組態後,我們可以在前台執行 FreeRADIUS 以觀察訊息處理過程中的任何錯誤:
$ sudo freeradius -cx
若需進一步除錯,可以使用以下命令以顯示預設日誌記錄:
$ sudo freeradius –X
當一切正常運作時,重啟 RADIUS 伺服器以套用組態變更:
$ sudo service freeradius restart
測試使用者登入:
$ echo "User-Name=test,User-Password=P@ssw0rd!" | radclient localhost:1812 auth testing123
啟用 LDAP 群組支援
為了啟用根據 LDAP 的群組支援,我們需要在 ldap 檔案中新增一個 group 部分:
group {
base_dn = "${..base_dn}"
filter = '(objectClass=Group)'
name_attribute = cn
membership_filter = "(|(member=%{control:${..user_dn}})(memberUid=%{%{Stripped-User-Name}:-%{User-Name}}))"
membership_attribute = 'memberOf'
cacheable_name = 'no'
cacheable_dn = 'no'
}
內容解密:
- 這段組態允許 FreeRADIUS 使用 LDAP 群組成員資格進行授權決策。
membership_filter用於確定使用者是否為特定群組的成員。
使用 NTLM 驗證(AD)與 CHAP
由於 LDAP 更適合用於授權而非驗證,因此我們可以考慮使用 NT LAN Manager(NTLM)進行驗證。NTLM 是 Active Directory 的基礎協定之一,用於身份驗證。
CHAP 交換流程
Challenge-Handshake Authentication Protocol(CHAP)是一種挑戰-回應驗證協定,其基本交換流程如下: 此圖示顯示了基本的 CHAP 交換過程:
@startuml
title CHAP Exchange Flow
participant Authenticator as A
participant Peer as P
A -> P: Challenge (random value)
activate P
P -> P: Hash(ID + Secret + Challenge)
P --> A: Response (hashed value)
deactivate P
activate A
A -> A: Hash(ID + Secret + Challenge)
note right of A: Authenticator computes its own hash\nand compares it with the Peer's response.
alt Hashes Match
A --> P: Success
else Hashes Do Not Match
A --> P: Failure
end
deactivate A
@enduml
設定 AD 整合(使用 PEAP MS-CHAPv2)
為了設定 FreeRADIUS 以使用 PEAP MS-CHAPv2 與 AD 整合,我們需要安裝 Samba 並組態 ntlm_auth 進行驗證。
首先,安裝 Samba 與 winbind:
$ sudo apt-get install samba winbind
內容解密:
- Samba 提供
ntlm_auth命令,用於與 AD 進行 NTLM 驗證。 - winbind 是 Samba 的一部分,用於將 Linux 系統與 AD 進行整合。
透過上述步驟,我們完成了 RADIUS 與 LDAP/LDAPS 後端驗證的整合,並介紹瞭如何使用 NTLM 與 CHAP 進行身份驗證。這些組態使得根據 Linux 的 RADIUS 伺服器能夠與 Active Directory 無縫整合,提供強大的身份驗證和授權功能。