1 TACACS+概述
1.1 什么是TACACS+
TACACS+(Terminal Access Controller Access Control System,終端訪問控制器控制系統協議)是在TACACS協議的基礎上進行了功能增強的安全協議。該協議與RADIUS協議的功能類似,采用客戶端/服務器模式實現NAS與TACACS+服務器之間的通信。
1.2 TACACS+的用途
TACACS+協議主要用於PPP和VPDN(Virtual Private Dial-up Network,虛擬私有撥號網絡)接入用戶及終端用戶的AAA。
AAA是Authentication、Authorization、Accounting(認證、授權、計費)的簡稱,是網絡安全的一種管理機制,提供了認證、授權、計費三種安全功能。
認證:確認訪問網絡的遠程用戶的身份,判斷訪問者是否為合法的網絡用戶。
授權:對不同用戶賦予不同的權限,限制用戶可以使用的服務。例如用戶成功登錄服務器后,管理員可以授權用戶對服務器中的文件進行訪問和打印操作。
計費:記錄用戶使用網絡服務中的所有操作,包括使用的服務類型、起始時間、數據流量等,它不僅是一種計費手段,也對網絡安全起到了監視作用。
AAA一般采用客戶機/服務器結構,客戶端運行於NAS(Network Access Server,網絡接入服務器)上,服務器上則集中管理用戶信息。NAS對於用戶來講是服務器端,對於服務器來說是客戶端。AAA的基本組網結構如下圖:
當用戶想要通過某網絡與NAS建立連接,從而獲得訪問其它網絡的權利或取得某些網絡資源的權利時,NAS起到了驗證用戶的作用。NAS負責把用戶的認證、授權、計費信息透傳給服務器(RADIUS服務器或HWTACACS服務器),RADIUS協議或HWTACACS協議規定了NAS與服務器之間如何傳遞用戶信息。
圖1-1的AAA基本組網結構中有兩台服務器,用戶可以根據實際組網需求來決定認證、授權、計費功能分別由使用哪種協議類型的服務器來承擔。例如,可以選擇HWTACACS服務器實現認證和授權,RADIUS服務器實現計費。
當然,用戶也可以只使用AAA提供的一種或兩種安全服務。例如,公司僅僅想讓員工在訪問某些特定資源的時候進行身份認證,那么網絡管理員只要配置認證服務器就可以了。但是若希望對員工使用網絡的情況進行記錄,那么還需要配置計費服務器。
TACACS+的典型應用是對需要登錄到設備上進行操作的終端用戶進行認證、授權、計費。設備作為TACACS+的客戶端,將用戶名和密碼發給TACACS+服務器進行驗證。用戶驗證通過並得到授權之后可以登錄到設備上進行操作。
2 TACACS+和RADIUS的比較
從上面的描述來看,TACACS+和目前被廣泛使用的RADIUS很相似,那么他們有什么區別和聯系呢?下面這個表格可以說明這個問題:
TACACS+協議
RADIUS協議
使用TCP,網絡傳輸更可靠
使用UDP,網絡傳輸效率更高
除了TACACS+報文頭,對報文主體全部進行加密
只對驗證報文中的密碼字段進行加密
協議報文較為復雜,認證和授權分離,使得認證、授權服務可以分離在不同的安全服務器上實現。例如,可以用一個TACACS+服務器進行認證,另外一個TACACS+服務器進行授權
協議報文比較簡單,認證和授權結合,難以分離
支持對設備的配置命令進行授權使用。用戶可使用的命令行受到用戶級別和AAA授權的雙重限制,某一級別的用戶輸入的每一條命令都需要通過TACACS+服務器授權,如果授權通過,命令就可以被執行
不支持對設備的配置命令進行授權使用
用戶登錄設備后可以使用的命令行由用戶級別決定,用戶只能使用缺省級別等於/低於用戶級別的命令行
3 TACACS+的基本原理
3.1 TACACS+的基本消息交互流程
下圖是TACACS+協議的基本信息交互流程:
以Telnet用戶認證過程為例,基本消息交互流程如下:
(1) Telnet用戶請求登錄設備。
(2) TACACS+客戶端收到請求之后,向TACACS+服務器發送認證開始報文。
(3) TACACS+服務器發送認證回應報文,請求用戶名。
(4) TACACS+客戶端收到回應報文后,向用戶詢問用戶名。
(5) 用戶輸入用戶名。
(6) TACACS+客戶端收到用戶名后,向TACACS+服務器發送認證持續報文,其中包括了用戶名。
(7) TACACS+服務器發送認證回應報文,請求登錄密碼。
(8) TACACS+客戶端收到回應報文,向用戶詢問登錄密碼。
(9) 用戶輸入密碼。
(10) TACACS+客戶端收到登錄密碼后,向TACACS+服務器發送認證持續報文,其中包括了登錄密碼。
(11) TACACS+服務器發送認證回應報文,指示用戶通過認證。
(12) TACACS+客戶端向TACACS+服務器發送授權請求報文。
(13) TACACS+服務器發送授權回應報文,指示用戶通過授權。
(14) TACACS+客戶端收到授權回應成功報文,向用戶輸出設備的配置界面。
(15) TACACS+客戶端向TACACS+服務器發送計費開始報文。
(16) TACACS+服務器發送計費回應報文,指示計費開始報文已經收到。
(17) 用戶請求斷開連接。
(18) TACACS+客戶端向TACACS+服務器發送計費結束報文。
(19) TACACS+服務器發送計費結束報文,指示計費結束報文已經收到。
4 TACACS+的報文結構和具體工作過程
4.1 TACACS+的報文類型
TACACS+共有7種類型的消息:
1、Authentication_START
2、Authentication_CONTIUNE
3、Authentication_REPLY
4、Authorization_REQUEST
5、Authorization_RESPONSE
6、Accounting_REQUEST
7、Accounting_REPLY
4.2 TACACS+包頭
所有的TACACS+數據包都使用12字節長的包頭,結構如下:
圖2 TACACS+包頭(實例)
下面對各個字段分別進行說明:
Major version的取值為0x0C
Minor version一般為0,一些特殊場景取值為1,本文后面會有說明
Type為1表示認證,2表示授權,3表示計費
Seq_no,序列號,從1開始,隨報文交互遞增
Flags,用來表示一些特殊條件,比如不加密(0x01),支持單連接多會話(0x04)等
Session_id為TACACS+會話的ID,是個隨機數。
Length為TACACS+報文除頭部之外的長度
4.3 TACACS+數據包的加密
TACACS+支持除包頭之外所有信息的加密,加密方法如下:
1、將session_id、secret key, 版本號和sequence number一起進行MD5運算(其中secret key 為TACACS客戶端和服務器之間的共享秘密),計算結果為MD5_1
2、后續的MD5運算將上次MD5運算的結果也納入運算范圍,如下:
MD5_1 = MD5{session_id, key, version, seq_no}
MD5_2 = MD5{session_id, key, version, seq_no, MD5_1}
....
MD5_n = MD5{session_id, key, version, seq_no, MD5_n-1}
3、將所有的運算結果連接起來,直到總長度大於需要加密的數據的長度,然后截斷到實際數據的長度,得到pseudo_pad:
pseudo_pad = {MD5_1 [,MD5_2 [ ... ,MD5_n]]} truncated to len(data)
4、隨后將需要加密的數據和上面的pseudo_pad進行XOR運算,得到密文:
ENCRYPTED {data} == data ^ pseudo_pad
由於TACACS+對整個數據包進行加密,私密性要好於RADIUS,竊聽者無法根據報文的內容來猜測網絡的配置和用戶的身份。
4.4 Authentication 消息
Authentication 消息包括三種類型:START、CONTINUE和REPLY。
4.4.1 Authentication Start
認證開始時,客戶端發送START消息,START消息中包括認證類型,同時可能包括用戶名和一些認證數據。
START消息一般來說是認證過程的第一個數據包,其seq_no總是1。
如果收到RESTART消息,客戶端需要發送START消息重新開始認證(使用一個新的會話)。
Server發送REPLY消息來回應START消息,表示認證結束或者仍需要繼續。
Action字段表示具體的認證操作,如認證請求、上傳密碼等等。
priv_lvl字段表示用戶的權限級別。
authen_type字段表示認證的類型,如PAP、CHAP等。
Service字段表示服務類型。
user字段表示用戶名,該字段不一定在START消息中存在。
port字段表示客戶端上發生認證行為的端口,具體取值客戶端可以自行定義,沒有明確的要求。
rem_addr字段表示用戶的地址信息,屬於可選字段,一般使用客戶端IP地址、ISDN Caller ID等填充。
data字段用於針對action和authen_type字段的值來傳遞一些信息。
4.4.2 Authentication Reply
REPLY消息是TACACS+服務器向客戶端發送的唯一一種Authentication 消息,用於向客戶端反饋當前認證的狀態。
Status字段表示認證的狀態。
flags字段用於控制客戶端是否將用戶輸入的密碼回顯,如果該標志位置1,用戶輸入的密碼不會回顯。
server_msg字段為可選字段,用於服務器將一些附加信息帶給用戶。
data字段用於向客戶端(NAS)提供一些信息。
4.4.3 Authentication Continue
客戶端收到REPLY消息后,如果確認認證過程沒有結束,使用CONTINUE消息應答。
user_msg字段用於回應REPLY消息中的server_msg字段,向服務器提供客戶端或用戶的一些信息
flags字段用於中斷認證過程
4.5 TACACS+認證過程
TACACS+認證的工作過程取決於START消息中的action和authen_type字段的取值。
不同的action和authen_type字段的組合需要配合不同的priv_lvl、service、port和rem_addr字段,實現不同的業務。
TACACS+協議中目前描述了13個action和authen_type字段的組合,這里列出幾個比較常見的組合:
4.5.1 Enable Requests
Enable Requests通常用於提升當前用戶的級別的場合,比如Linux系統的su命令,Comware的super命令等,認證過程和后面馬上要講到的Inbound ASCII Login很相似
Action = TAC_PLUS_AUTHEN_LOGIN
priv_lvl = implementation dependent
authen_type = not used
service = TAC_PLUS_AUTHEN_SVC_ENABLE
4.5.2 Inbound ASCII Login
管理用戶login的場景,非常常見,該場景下START消息可以攜帶用戶名,整個交互過程包括一個START,中間可能存在一對或多對CONTINUE/REPLY,最后以一個REPLY結束
action = TAC_PLUS_AUTHEN_LOGIN
authen_type = TAC_PLUS_AUTHEN_TYPE_ASCII
4.5.3 Inbound CHAP login
CHAP認證,最常見的是PPP認證的場景,整個交互過程包括一個START和一個REPLY消息,START消息中必須包含用戶名。
Action = TAC_PLUS_AUTHEN_LOGIN
authen_type = TAC_PLUS_AUTHEN_TYPE_CHAP
minor_version = 0x1
4.5.4 具體認證過程
如下是Comwarev5平台Telnet用戶使用HWTACACS認證過程:
AUTHEN_REQUEST ------------->
<------------- AUTHEN_REPLY(status:AUTHEN_STATUS_GETPASS)
AUTHEN_CONTINUE(with password) ------------->
<------------- AUTHEN_REPLY(status:AUTHEN_STATUS_PASS)
4.5.5 認證過程的中止
客戶端可以通過在CONTINUE消息中攜帶一個TAC_PLUS_CONTINUE_FLAG_ABORT標志位來中止正在進行的認證過程,同時可以在data字段攜帶中止認證的原因。該CONTINUE消息不需要REPLY消息的回應。
4.6 Authorization消息
Authorization 消息包括兩種類型:REQUEST和RESPONSE。
4.6.1 Authorization Request
Authorization Request消息的機構比較復雜,如下:
Authorization Request消息中包括了授權所需的一切信息,這些信息分為兩類,一類是必選的,另一類是可選的。
其中,authen_method字段表示授權的方式,TACACS+的認證和授權是分離的,用戶可以使用TACACS+認證而使用其它協議進行授權。
priv_lvl字段、authen_type字段、authen_service字段、port字段、rem_addr字段的含義和authentication消息中的相應字段一樣。
user字段表示用戶名。
arg_cnt字段表示REQUEST消息中攜帶的argument的數量, argument是一個AVP的結構,其中attribute和value之間使用等號(=)或星號(*)連接,當使用等號連接時表示該AVP是必選的,使用星號連接時表示該AVP是可選的。
AVP的類型很多,這里就不一一列舉了。
4.6.2 Authorization Response
Authorization Response消息的結構如下:
Response消息中包括了授權的結果和一些其它的參數
status字段表示授權的結果和權限的操作方式
server_msg字段是服務器給用戶的提示信息。
data字段是服務器提供給管理員的信息。
arg_cnt字段表示RESPONSE消息中攜帶的argument的數量,argument的格式和REQUEST消息中相同。
4.7 具體授權過程
4.7.1 Comwarev5設備使用HWTACACS認證/授權
AUTHOR_REQUEST ------------->
<------------- AUTHOR_REPLY(status:AUTHOR_STATUS_PASS_ADD)
4.8 Accounting消息
Accounting消息包括兩種類型:REQUEST和REPLY。
4.8.1 Accounting Request
Accounting Request消息的結構如下:
Accounting Request消息中包括了計費所需的信息。
flags字段表示計費報文的類型,包括計費開始。計費停止和實時計費。
其它字段的含義和與authorization和authentication中對應字段的含義一致,這里不再贅述。
Accounting REQUEST消息中也可以攜帶很多AVP形式的參數,參數的數量很多,這里就不一一列舉了。
data字段是服務器提供給管理員的信息。
4.8.2 Accounting Reply
Accounting Reply消息的結構如下:
其中status字段表示計費的狀態,標志計費是否成功。
server_msg字段表示服務器發給用戶的信息,由客戶端來決定是否顯示給用戶。
4.9 具體計費過程
4.9.1 Comwarev5設備使用HWTACACS進行PPP用戶計費
下面是Comwarev5設備使用HWTACACS進行PPP用戶計費的過程,包括計費開始,計費持續和計費停止的全過程。
ACCOUNTING_REQUEST(flag:ACCT_FLAG_START ------------->
<------------- ACCOUNTING_REPLY(status:ACCT_STATUS_SUCCESS)
ACCOUNTING_REQUEST(flag:ACCT_FLAG_WATCHDOG) ------------->
<------------- ACCOUNTING_REPLY(status:ACCT_STATUS_SUCCESS)
ACCOUNTING_REQUEST(flag:ACCT_FLAG_STOP) ------------->
<------------- ACCOUNTING_REPLY(status:ACCT_STATUS_SUCCESS)
4.10 TACACS+的附加功能
除了正常的AAA功能外,為確保功能實現的冗余和實時計費准確性等等,很多TACACS+實現都包括下面的內容:
1、計費停止報文的緩存和重傳機制;
2、認證、授權、計費服務器的主備切換功能。
4.11 Tacacs in Comware(以V5為例)
Comware v5的HWTACACS功能基本上實現了TACACS+所規定的功能:
#
hwtacacs scheme tacacs
primary authentication 101.3.201.1
primary authorization 101.3.201.1
primary accounting 101.3.201.1
key authentication h3c
key authorization h3c
key accounting h3c
timer realtime-accounting 3
user-name-format without-domain
#