返回文章列表

RADIUS 服務原理與 Linux 實作

本文深入解析 RADIUS 協定原理、封包結構,並逐步指導如何在 Linux 系統上使用 FreeRADIUS 建立服務,包含本地驗證與 LDAP/LDAPS 後端驗證整合,以及 NTLM 和 CHAP 驗證方法,最後探討 RADIUS 與 Active Directory 的整合方案,滿足企業級網路安全需求

網路安全 系統管理

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)     |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+

內容解密:

  1. Code 欄位表示 RADIUS 請求的型別,例如 Access-Request(1)、Access-Accept(2)或 Access-Reject(3)。
  2. Identifier用於比對請求和回應封包。
  3. Authenticator欄位確保封包的真實性,防止重放攻擊。
  4. 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)     |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
+

內容解密:

  1. **Code 為 2(Access-Accept)**表示驗證成功,使用者獲準存取網路資源。
  2. **Code 為 3(Access-Reject)**表示驗證失敗,通常由使用者名稱或密碼錯誤引起。
  3. 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
}

內容解密:

  1. client 區塊定義了一個 RADIUS 使用者端,即進行驗證請求的網路裝置。
  2. ipaddr 指定了使用者端的 IP 位址,用於比對請求來源。
  3. secret 為分享金鑰,用於加密和驗證 RADIUS 請求與回應。
  4. 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 無縫整合,提供強大的身份驗證和授權功能。