壹. RADIUS 基礎
RADIUS全名為遠端認證撥接使用者服務(Remote Authentication Dial In User Service),RADIUS協定最初是由一家Livingston公司所發展,原始目的是替撥號用戶進行驗證和記帳用途,隨後也成為了IETF的標準(RFC 2865、RFC2866),它是目前最被廣泛使用的IETF標準的AAA (驗證-Authentication、授權-Authorization與權責歸屬-Accounting)協定,提供了網路連接存取的集中驗證(Central Authentication)以及記錄帳戶資訊(Accounting)的功能,採用了主從架構協定共且分別利用UDP傳輸層協定連接埠1812與 1813來集中驗證與記錄帳戶資訊。
由於RADIUS協定可以使用一個集中儲存與管理的使用者安全性資料庫,因此讓網路擴充彈性更加容易且安全性亦較高,例如下圖所示,只需由企業組織建置一部RADIUS伺服器並維護一個具有容錯能力的安全資料庫後,日後舉凡撥號連線,VPN連線、無線或有線用戶使用者均可透過它來實現集中驗證,另一方面,若企業組織打算建構一個單一登入的驗證(SSingle Sign On;SSO)環境,則RADIUS伺服器更是必備的服務,其在企業資安上所扮演的重要地位不可言諭。
一. RADIUS 驗證與記錄的基本訊息流程
當一部網路存取用戶端請求連線驗證時,網路連線用戶端、 RADIUS 用戶端(網路存取伺服器)和 RADIUS 伺服器三者之間的訊息傳遞流程如下圖所示,由圖中流程可知,首先,NAS 傳送 Access-Request 訊息給 RADIUS 伺服器,包括了使用者名稱,加密密碼訊息,IP位址、網路存取伺服器的IP位以及服務類型等資訊,而RADIUS伺服器則回應予 Access-Accept, Access-Reject或 Access-Challenge 三種訊息之一,若完成驗證後,NAS伺服器還可以送出記錄請求訊息Accounting Request,而RADIUS伺服器則回應以Accounting Response訊息。
二. RADIUS 封包格式
RADIUS利用UDP協定來傳輸訊息,而傳遞的封包結構如下圖所示:
- Code:一個位元組長度,用以指示RADIUS封包的類型,有效的值包括了Access-Request(1)、 Access-Accept(2)、 Access-Reject(3)、 Accounting-Request(4)、 Accounting-Response(5)、 Access-Challenge(11)、Status-Server(12)、Status-Client(13)。
- Identifier:一個位元組長度,由用戶端產生用以辨別是否相符合的請求與回應封包類型,因為類型一致的請求封包和回應封包的 Identifier 值相同。
- Length:二個位元組長度,表示整個RADIUS 封包(包括 Code 、 Identifier 、 Length 、 Authenticator 和 Attribute )的長度。,範圍可從20至4096位元組間。
- Authenticator:此欄位有16個位元組,包括了RADIUS用戶端和伺服器用來驗證彼此的訊息,根據用戶請求或伺服端回應的不同, Authenticator 又可包括了二種類型: Request Authenticator 和 Response Authenticator,其中Request Authenticator為不可重複的隨機數, Response Authenticator則是回應封包不同欄位的MD5雜湊值和共用密碼。
- Attribute:變動長度,用於攜帶專門的認證、授權和計錄資訊,提供請求和回應封包的配置細節。 Attribute 欄位中可以包括多個屬性,每一個屬性結構乃採用(Type 、 Length 、 Value)三元素格式來表達。
三. RADIUS 安全性機制
RADIUS協定利用一個稱為共用密碼(Shared Secret)的文字字串做為密碼以驗證RADIUS訊息,舉凡RADIUS用戶端和(代理)伺服器、代理伺服器與伺服器之間的RADIUS訊息均需透過共用密碼來加以驗證,此外,共用碼也提供訊息完整性並且用來加密某些RADIUS屬性(如使用者密碼或通道密碼),此外,為了避免偽裝的Access-Request訊息以及訊息篡改的攻擊,必要時也可利用RADIUS訊息確認屬性( Message Authenticator attribute)來進一步保護每個RADIUS訊息,不過這項定義於RFC2869的RADIUS擴充並非為所有的RADIUS用戶端或伺服器所支援,使用之前需先予以確認。
貳. 架設Windows RADIUS伺服器 (使用Windows Server 2012 網路原則服務)
微軟Windows S伺服器作業系統為了支援其路由及遠端存取服務(RRAS)的專屬驗證架構,所以早從NT4 Option Pack 即開始提供了微軟的第一代RADIUS伺服服務--網際網路驗證服務(Internet Authentication Service;IAS),而Windows Server 2008後之版本則以網路原則服務(Network Policy Service;NPS)取代了網際網路驗證服務用以執行所有VPN、有線或無線的802.1x集中驗證及記錄功能。
一. 簡介Windows Server 2012 網路原則服務
目前最新的Windows Server 2012作業系統的網路原則服務可以提供三項主要的功能服務:
- RADIUS伺服器:執行線無線基地台、交換器、撥號與VPN連線的集中驗證、授權與記錄(AAA)功能。
- RADIUS 代理伺服器(RADIUS Proxy):可以將特定的連線請求轉送至其它RADIUS伺服器。
- NAP原則伺服器 (Network Access Protection Policy Server):NPS用以評估企圖連接網路的NAP能力用戶端所送來的健康狀態(Statement of Health, SOH) 。
微軟的網路原則服務最主要的特性在於提供管理員可以透過『連線要求原則』與『網路原則』二種原則來讓管理員可以彈性的控制與管理各種連線的條件與設定:
- 連線要求原則 (Connection Request Policy):連線要求原則可讓管理員設計一組符合某條件與設定的RADIUS用戶端來向NPS請求驗證時,應該由本機直接處理連線要求,或是轉寄至其它的RADIUS伺服器。常用的條件包括框架協定、服務類型、通道類型與時間限制,常用的設定包括驗證方法、轉寄要求和屬性 。
- 網路原則 (Network Policy):網路原則可以將符合某些條件(conditions)的網路存取用戶端,限制(constraints)其應該要採用某種連線方式,一旦符合所預設的條件與限制,就會強制套用某些網路組態設定(settings),例如您可以自訂網路原則,特別針對公司高階主管於下班時段(使用群組和時間條件),限制其連線時只能使用MS-CHAPv2驗證方法,一旦符合此連線要求之後將會採用最強加密方法並設定只有特定協定流量輸入(設定)以確保安全。
NPS 支援的驗證方法包括了密碼基礎的驗證方法以及憑證基礎的驗證方法,較簡單而普遍的密碼基礎驗證方法包了MS-CHAPv2、MS-CHAP、CHAP、PAP等,由於密碼式驗證方法並非屬於高度安全性,因此微軟建議使用憑證為基礎的驗證方法,如PEAP-MS-CHAP v2 或 PEAP-TLS ,不過前者只需要伺服器憑證、後者除了伺服器憑證之外,還需要用戶端伺憑證,一旦使用憑證時還得注意憑證的有效性--由可信任的CA發行、使者者憑證主體名稱應包括UPN、電腦憑證主體名稱應包括FQDN等條件。
二. 安裝並設定網路原則服務為RADIUS伺服器
底下將逐步說明如何架設Windows Server 2012的網路原則服務成為RADIUS伺服器,得以同時支援公司的VPN伺服器以及無線基地台的802.1x驗證,實作前請先規劃好每部用戶端使用的共用密碼、所要支援的驗證方法以及加密強度,因為這些均牽涉到RADIUS的使用安全性。
- 首先,由【伺服器管理員】工具中啟動『新增角色及功能精靈』程式並安裝『網路原則及存取服務』角色下的『網路原則伺服器』服務。
- 一旦安裝完成後,請由【伺服器管理員】工具的『管理』選單上選取並啟動『網路原則伺服器』主控台。
- 接下來請於工具『NPS (本機)』節點的右側窗格,於標準設定中,選取『撥號或VPN連線的RADIUS伺服器』並按一下底下的『設定VPN或撥號』。
- 接下來的『選取撥號或虛擬私人網路連線類型』設定頁中請核選『虛擬私人網路(VPN)連線』。
- 新增RADIUS的用戶端電腦或裝置的IP位址或主機名稱,並輸入或自動產生一個雙方驗證所需的共用密碼。
- 接下來請選擇VPN遠端存取時支援的驗證方法,若要使用PEAP或其它憑證驗證方法,則您需要預先在NPS伺服器上安裝好有效的電腦憑證。
- 『指定使用者群組』設定頁用來限制VPN使用者,此處的設定乃是根據『網路原則』的『存取權限』設定(允許或拒絕)來允許或拒絕群組內的使用者可否存取網路。
- 『輸入篩選器』設定頁中,用以控制傳送和接收的網路流量類型,即讓管理人員藉以控制此網路可被處理和轉送的封包類型,設定時可採用輸入和輸出二種不同方向的流量控制,還可以採用正面列表或負面列表其中之一的方式,新增封包過濾規則來限制可存取的資源,例如下圖採正面列表(預設為拒絶)的方式限制VPN用戶端只能存取共用資料夾(TCP 445)、SQL伺服器(1433)並讓管理員使用遠端桌面管理(3389)。
- 『指定加密設定』 設定頁上,選擇加密的強度,若基於用戶端連線軟體的相容性考量可以勾選40位元和56位元的金鑰長度,否則基於安全性的考量應該如下圖所示只勾選允許128位元長度的金鑰加密技術。
- 接下來的『指定領域名稱』設定頁(Realm Name),可以用來指出驗證中用以識別的領域名稱(如網域名稱),在大部份情況下並無需設定,直接按下一步即可。
- 最後,完成設定,精靈程式會根據您的設定,新增RADIUS用戶端並且建立『連線要求原則』與『網路原則』二條原則。
若NPS需要支援無線基地台的802.1X驗證,則您仍需使用如上述的步驟,唯一不同之處在於步驟1時,於『NPS (本機)』節點的右側窗格的標準設定中,選取『802.1X無線或有線連線的RADIUS伺服器』再按一下底下的『設定802.1X』選項,接下來於下一頁的『802.1X 連線類型』設定時核選『安全的無線連線』,其餘步驟皆與VPN設定相同。
透過上述精靈程式的做法來完成架設NPS RADIUS伺服器並設定其用戶端為最直接且簡單的方式,但其主要的缺點為精靈程式所提供的設定項目均是較為普遍常用的設定,若需要設定一些進階或少用的選項、條件與組態則需要進一步的編輯『連線要求原則』與『網路原則』的內容,例如若要支援更多的驗證方法,則需要自行編輯『網路原則』的內容,一般而言,基於使用者的方便性(無需用戶端憑證)和伺服器安全上的考量(需要伺服端憑證確保正確的伺服器來源)雙重考量,以及一般手機的支援性,所以建議採用PEAP-MS-CHAP v2驗證類型,因此您需要如下圖所示加入EPAP驗證類型 (請先架設好憑證授權單位,並註冊安裝好電腦憑證):
三. 在Active Directory中登錄RADIUS伺服器
為了能夠讓NPS使用Active Directory網域使用者帳戶驗證,您還必需授權NPS電腦可以讀取網域帳戶的撥入內容,因此接下來您需要在網路原則伺服器主控台的NPS(本機)的右鍵功能表選取在ActiveDirectory中登錄伺服器選項。
假若您需要驗證的安全性資料庫並非微軟的Active Directory資料庫而是外部的資料庫,或者是您設計了多部RADIUS伺服器的負載平衡機制,這時候就需要將NPS設定為RADIUS Proxy,而將用戶端請求轉寄到網路上其它伺服器。
四. 設定為Radius Proxy
NPS 欲做為Radius Proxy時,您需要設定連線要求原則以便指示那個連線請求將被轉送到網路上某特定的其它的Radius伺服器,而設定Radius Proxy常見的理由可能為:
- 驗證與授權的使用者帳戶並不在Active Directory或不在Windows 使用者帳戶資料庫。
- 多部Radius伺服器之間的負載平衡連線請求。
- 支援委外的撥號、VPN或無線連線服務。
NPS 的Radius Proxy設定步驟為:
- 由【網路原則伺服器】主控台工具右側的『遠端RADIUS伺服器群組』節點新增伺服器群組。
- 接下來,如下圖所示,先建立轉寄的伺服器群組並一一加入伺服器,除了輸入名稱並設定連線共用密碼之外,還可設定好負載平衡的權數與優先權。
- 最後,請於『連線要求原則』節點內選擇適當的連線要求原則後,並由右鍵功能表內按『內容』選項,然後按一下『設定』標籤底下右側的『驗證』項目,最後核選第二項『』選擇上述所建立的伺服器群組即完成設定。
參. 架設Linux RADIUS驗證伺服器 (使用Centos Linux FreeRadius 網路原則服務)基礎
FreeRADIUS為一功能強大的開放原始碼RADIUS伺服軟體,可安裝在各種UNIX/Linux平台並且支援PAP、CHAP、MS-CHAP與EAP等多種驗證協定,具有完整的AAA能力,再加上其模組化的設定,易於維護管理,因此成為Linux系統上架設RADIUS服務的首選軟體套件。
由於FreeRADIUS的普遍性,因此許多 Linux 安裝套件預設上均已提供 FreeRADIUS 的二進位安裝套件檔案,包括RedHat/CentOS/Fedora可以利用yum工具來安裝、Suse可藉助zypper進行安裝,Ubuntu則是使用apt-get工具即可完成安裝,底下將說明如何在CentOS Linux下安裝並設定為RADIUS伺服器。
一. 安裝 FreeRADIUS
在CentOS 上安裝FreeRADIUS軟體相當簡單,利用yum 命令由官方的yum儲存庫安裝即可,其中儲存庫內的 freeradius與freeradius-utils為必需安裝的二個套件,倘若您需要支援更多驗證方法,就需要安裝其它相關的套件(如freeradius-krb5、freeradius-ldap):
# yum –y install freeradius freeradius-utils
二. freeradius 相關組態檔
架設FreeRadius需要修改相關的組態檔,而CentOS下的freeradius相關組態檔位於 /etc/raddb 目錄下,雖然目錄底下的組態檔案不少,但倘若您只需要建置一個最簡單的RADIUS伺服器,則通常只會有數個檔案可能需要進一步修改便得以符合使用所需,而clisnts.conf和users二個檔案通常就是最常需要變動和修改的檔案。
- radiusd.conf:主要系統設定檔,用以定義基本啟動組態以及將使用哪些模組,由於預設安裝的組態值已經符合大多數的環境需求,因此需修改之處很少。
- clients.conf:用來定義及認證FreeRadius客戶端的設定檔,任何NAS在使用之前均需要定義在此檔案。
- proxy.conf:定義請求將被代理轉寄的領域 。
- eap.conf:EAP驗證相關設定檔。由於越來越多NAS設備裝置支援EAP驗證協定,因此這個檔案亦越來越重要。
- users:帳號與處理方式設定檔 。
底下特別針對clisnts.conf和users這二個檔案的設定組態來加以說明其基本用法。
◎ 定義RADIUS用戶端:clients.conf
clients.conf 這個重要的組態檔用來定義FreeRadius的客戶端,通常利用 "client" 區段來定義每一部網路存取伺服器,而client設定段的基本語法為:
client 短名稱> { <屬性1> = <值1> <屬性2> = <值2> <屬性3> = <值3> ..... } |
一般而言,client 設定區段最常定義的屬性包括了用戶端的IP位址、連線的共用密碼(Shared Secret)、NAS類型以及是否啟用訊息碼認功能:
client <用戶短名稱> { ipaddr = <IP位址> netmask = <網路遮罩> secret = <共用密碼> require_message_authenticator = no | yes nastype = <NAS 型號 > } |
若您希望某個範圍的網段的IP位址的NAS裝置均使用相同的設定,則可以使用 ipaddr = 192.168.1.0 附加上netmask = 24如此的撰寫方式。
預設的clients.conf檔案內只存在一個的本機(localhost)用戶端區段:
client localhost { ipaddr = 127.0.0.1 secret = testing123 require_message_authenticator = no nastype = other } |
本範例假設企業網路環境內存在二部需要使用RADIUS驗證的設備,一部為無線基地台,另一部則為VPN設備,所以定義二個client 設定區段如下(基於安全性考量,建議不同的RADIUS用戶端設定不一樣的共用密碼):
client wap1 { ipaddr = 192.168.2.9 secret = mysecre1 require_message_authenticator = no nastype = other } client vpn1 { ipaddr = 192.168.2.169 secret = mysecret2 require_message_authenticator = no nastype = other } |
◎ 定義驗證的使用者帳戶:users
/etc/raddb/users 檔案非常重要,主要是用來決定如何驗證和授權每位使用者的請求,亦即users檔案設定驗證使用者資料庫的來源並指出驗證檢查條件以及驗證屬性,就企業而言,維護一個使用者帳戶的安全性資料庫為各種系統驗證使用為較理想的方式,也符合單一登入的企業目標,這通常可以由目錄服務來達成,例如微軟的Active Directory 、Novell's eDirectory或Linux OpenLDAP,小型企業或SOHO環境若沒有目錄服務的安全性資料庫可用,則直接使用Linux的系統帳戶來驗證應是最簡單方便的做法,另外,利用SQL維護使用者資料庫亦是另一個可行的方式,不過在許多場合,管理員可能會透過多種不同的帳戶資料庫來源來進行驗證工作。
欲新增一個使用者至users檔案內,您需要定義使用者名稱,然後附加上零至多個逗號隔開的檢查項目,最後再加至多個以逗號隔開的TAB縮入行之回應項目:
< 帳號名稱 > < 驗證檢查項目列 > <回應項目列> |
radiusd在處理users檔案時的重要規則如下:
- 由上而下比對至第一組完全符合者,且此組又無回應項目 Fall-Through = yes存在時就會停止不會再繼續
- 若使用多個項目時,則項目之間須用逗號區隔。
- 常用設定運算子:
屬性 = 資料 →在該屬性若沒有被其它項目設定時,則新增該屬性資料,不能做為檢查項目運算子
屬性 := 資料 →直接設定並取代該屬性資料
屬性 == 資料 →判斷該屬性的內容是否與指定的資料內容相符合
屬性 != 資料 →判斷該屬性的內容是否與指定的資料內容不相符
屬性 =~ 正規表示式 → 判斷屬性的內容是否符合正規表達方式的規則
屬性 !~ 正規表示式 →判斷屬性的內容是否不符合正規表達方式的規則
使用 Linux 系統帳戶
使用linux系統帳戶做為驗證的來源帳戶是最簡單而直接的方式,由於DEFAULT這個特殊的名稱代表示所有使用者名稱,因此您只需要在users檔中加入如下的一行,就可以利用Linux的 System 帳戶來進行驗證:
DEFAULT Auth-Type = System |
另一種方法啟動系統使用者的的方法則是將系統使用者包含入freeradius的預設使用者存放區,做法很簡單,只要編輯 /etc/raddb/sites-enabled/default 這個檔案,並在 authorize設定區段內,註銷 unix這一行的註解(把前面的#符號刪除)即可,然後以radiusd -X 指令啟動除錯模式,再利用radtest命令測試是否可接受驗證。
由於FreeRADIUS文件中建議使用非特權使用者執行radiusd,而CentOS預設安裝的/etc/raddb/radiusd.conf檔內的 user = radiusd 和 group = radiusd二行的所使用的帳戶亦是較安全的非特權帳戶,但radiusd帳戶並沒有權利存取/etc/shadow檔案,因此您必需重新設定/etc/shadow檔案的群組和讀取權限,以讓radiusd帳戶可以存取shadow檔案來進行驗證工作。
最後,特別值得留意的一點乃是系統使用者只能使用PAP驗證協定,而較安全的CHAP或MS-CHAP協定無法使用系統帳戶。
users 設定檔內帳號
管理員也可以直接將驗證的使用者資訊寫入檔案內(雖然這並非建議的方式),其基本語法格式為:
< 帳號名稱 > Auth-Type := Local, < 驗證的檢查項目 > |
範例一: 使用者帳號 frank ,其密碼為 mypassword
frank Auth-Type := Local, User-Password == "mypassword"
範例二:使用者帳號 frank ,其密碼為 mypassword,限制只能夠從192.168.0.18主機連線
frank Auth-Type := Local, Client-IP-Address == "192.168.0.18", User-Password == "mypassword"
範例三:使用者帳號alice,其密碼為 mypassword,限制登入時間為每天上什八點至下午六點, 且同時登入數最大為一。
alice Auth-Type := Local, Login-Time := 'Al0800-1800', Simultaneous-Use := '1', User-Password == "mypassword"
至於若要使用ldap、SQL或Active Directory目錄服務的資料庫來進行驗證工作,則需要分別設定Openldap、SQL伺服器或將Linux加入網域,這些作業較為複雜,超出本文範圍,在此不及述及。
肆. 架設 Freeradius支援無線網路驗證伺服器實務
本節將嘗試架設Freeradius做為無線網路WAP企業層級安全性中用以支援802.1X驗證的驗證伺服器。
一般而言,IEEE 802.1X 的標準驗證機制選擇了「可延伸驗證通訊協定」(EAP,Extensible Authentication Protocol),而EAP 是一種「點對點通訊協定」(PPP,Point-to-Point Protocol) 架構的驗證技術,通常使用於點對點 LAN 區段上,無線連線的802.1x EAP驗證標準協定包括了 EAP-MD5、EAP-LEAP、EAP-TLS、EAP-TTLS、EAP-PEAP 等多種常見的認證協定。由於企業無線網路的用戶端平台多為Windows或android手機,因此為了避免使用用戶端憑證的麻煩,所以決定採用PEAP/EAP-MSCHAPv2認證協定,因此freeradius相關檔案設定說明如下。
一. 設定連線使用者—/etc/raddb/users
由於無線網路使用者用採用EAP驗證協定,因此預設的系統帳戶無法直接搭配使用,故直接在users檔案建立二個連線帳帳戶。
# vi /etc/raddb/users guest1 Cleartext-Password := "yoursecret" guest2 Cleartext-Password := "yoursecret" |
二. 設定NAS用戶端(無線基地台)—/tec/raddb/clients.conf
# vi /etc/raddb/clients.conf client 192.168.2.100 { secret = sharedsecret shortname = wap1 } |
三. 設定EAP預設類型為peap –/etc/raddb/eap.conf
為了符合微軟EAP內不需要用戶端憑證的預設驗證類型(PEAP/EAP-MSCHAPv2),因此您需要將freeradius的EAP驗證協定的預設類型改為peap。
# vi /etc/raddb/eap.conf default_eap_type = peap |
四. 啟用和設定 mschap-v2 –/etc/raddb/modules/mschap
啟用安全性較高的mschapv2以取代無相互驗證能力的mschapv1 乃是不希望採用用戶端憑證下的首要選項,因此變更模組目錄下的mschap檔案如下:
# vi /etc/raddb/modules/mschap use_mppe = yes require_encryption = yes require_strong = yes with_ntdomain_hack = yes # 請重新載入模組 # ldconfig |
五.啟動radiusd 於除錯模式並測試用戶端連線
為了方便初次測試與診問題,您可以利用 "radiusd –X" 命令來啟動radiusd 於除錯模式,接下來設定好無線基地台使用WPA/WPA2 企業驗方式,然後再使用Windows或android手機連線無線基台來確認是否如預期的執行驗證工作。
下圖為設定無線基地台採用WAP-企業驗證方法並且指定freeradius伺服器、連接埠以及共用密碼。
最後,分別利用Windows 8和android系統來連線至無線網路,測試是否可以正常運作,下圖為二種平台上的無線網路連線設定。
結語
對許多企業組織而言,為了因應各種不同工作型態的員工能夠存取企業網路資源,因此經常必需同時支援多種連接企業網路方式,除了傳統的有線網路以及逐漸廣泛使用的無線網路,可能還包括了VPN或撥號連線方式,因此有必要提供一個集中驗證、授權與記帳處理的機制,而目前存在的方案可能包括Radius、Diameter 或 TACACS+,毫無疑問的,工業標準的RADIUS協定仍是目前最廣泛被支援的AAA協定,因此只要網路存取環境較為多樣化或單一登入需求的企業網路環境,架設一部或多部RADIUS伺服器幾乎成為了最常見的選擇方案。
本文說明了如何透過Windows與Linux系統上內建的Radius 服務軟體--網路原則服務與FreeRadius套件來建構企業的集中驗證與記帳伺服器,冀望在越來越多複雜的企業連接存取環境下以最低成本和管理負荷要求下,提供有效率的安全性集中驗證工作。