TACACS 协议简介与开发总结
? ? ? 這個項目來源于國外某運營商客戶的需求,整個開發流程除了參考基本的tacacs+協議外,還借鑒了Github上一個類似項目的設計,下面介紹下協議的基本內容和開發注意事項以及對接測試環境的搭建。
目錄
0. 協議簡介? ? ??
1. tacacs+消息頭
2.1 認證報文:
2.2 認證響應報文:
3.1 授權請求報文:
3.2 授權響應報文:
4.1 計費請求報文:
4.2 計費響應報文:
5. Attribute-Value Pairs(參數對):
參考文檔:
?
0. 協議簡介? ? ??
tacacs+協議全稱 Terminal Access Controller Access Control System,終端訪問控制器控制系統協議。
是在TACACS(RFC 1492)基礎上進行了功能增強的安全協議。采用客戶端/服務器模式實現,文章末尾會給出RFC文檔鏈接。
? ? ?tacacs+協議實現了3A功能(Authentication,Authorization and Accounting),基于TCP傳輸,服務器端默認監聽端口49。認證、授權和計費流程可以看作是客戶端和服務器之間的一次會話(session)。會話有一個唯一的會話ID,認證會話由多個報文交互組成,授權和計費只包含兩個報文(request 和 reply),從這可以看出,會話流程還是相對簡單的。
? ? ?傳輸的時候需要建立tcp連接,tacacs+報文首部含有一個single connection mode標志位,用于表示是否支持單個連接上存在多個會話,如果不支持的話則每個會話則需要一個獨立的連接。
? ? ?tacacs+報文的消息體需要進行加密,加密的算法是從共享密鑰、會話ID、版本和序列號反復計算MD5直到長度和tacacs+消息體相等,這時候再將該密鑰和報文內容進行按位異或運算得到加密報文,服務器端收到報文后在進行相應的解密運算。加密流程如下:
//反復計算得到長度為報文長度的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}pseudo_pad = {MD5_1 [,MD5_2 [ ... ,MD5_n]]} truncated to len(data)//將上述計算得到的值和消息體進行按位異或運算加密 data = ENCRYPTED {data} ^ pseudo_pad1. tacacs+消息頭
? ? ? tacacs+報文包含12個字節長度的消息頭,格式如下:
? ? ? ? 版本字段占一個字節, 授權和計費報文版本字段值固定,認證報文的版本字段和認證流程有關,這一點協議已經明確指明了各個認證流程所需要使用的協議字段,下面會有介紹。
? ? ? ? 類型字段有三種取值:
TAC_PLUS_AUTHEN := 0x01 (Authentication) TAC_PLUS_AUTHOR := 0x02 (Authorization) TAC_PLUS_ACCT := 0x03 (Accounting)? ? ? ? seq_no序列號表示會話的報文序號,客戶端從1開始發送,服務器端回復的時候則+1。最大不能超過255,超過則需要終止當前會話并重新開始。
? ? ? ? 標志位目前定義了兩個,一個用于表示報文是否加密,另一個則用來表示是否支持單連接多會話。
TAC_PLUS_UNENCRYPTED_FLAG := 0x01 TAC_PLUS_SINGLE_CONNECT_FLAG := 0x04? ? ? ? ?session_id表示會話ID,在整個會話交互期間保持不變。
? ? ? ? ?length表示tacacs+消息體的長度,注意這個長度不包括tacacs+消息頭。
開發的時候需要注意,所有長度字段都需要按照網絡字節序編碼。
2.1 認證報文:
認證報文消息體里面的字段根據認證類型的不同而不同。先看下字段基本的含意和取值:
? ? ? ? ?action表明認證的動作,
TAC_PLUS_AUTHEN_LOGIN := 0x01 TAC_PLUS_AUTHEN_CHPASS := 0x02 TAC_PLUS_AUTHEN_SENDAUTH := 0x04? ? ? ? priv_lvl表明用戶的權限級別,協議定義了四個值,也可以自定義需要的值,但不要和已定義的沖突:
TAC_PLUS_PRIV_LVL_MAX := 0x0f TAC_PLUS_PRIV_LVL_ROOT := 0x0f TAC_PLUS_PRIV_LVL_USER := 0x01 TAC_PLUS_PRIV_LVL_MIN := 0x00? ? ? authen_type表示認證類型:
TAC_PLUS_AUTHEN_TYPE_ASCII := 0x01 TAC_PLUS_AUTHEN_TYPE_PAP := 0x02 TAC_PLUS_AUTHEN_TYPE_CHAP := 0x03 TAC_PLUS_AUTHEN_TYPE_ARAP := 0x04 (deprecated) TAC_PLUS_AUTHEN_TYPE_MSCHAP := 0x05 TAC_PLUS_AUTHEN_TYPE_MSCHAPV2 := 0x06? ? ? authen_service,認證服務:
TAC_PLUS_AUTHEN_SVC_NONE := 0x00 TAC_PLUS_AUTHEN_SVC_LOGIN := 0x01 TAC_PLUS_AUTHEN_SVC_ENABLE := 0x02 TAC_PLUS_AUTHEN_SVC_PPP := 0x03 TAC_PLUS_AUTHEN_SVC_ARAP := 0x04 TAC_PLUS_AUTHEN_SVC_PT := 0x05 TAC_PLUS_AUTHEN_SVC_RCMD := 0x06 TAC_PLUS_AUTHEN_SVC_X25 := 0x07 TAC_PLUS_AUTHEN_SVC_NASI := 0x08 TAC_PLUS_AUTHEN_SVC_FWPROXY := 0x09? ? ? ? user_len表示用戶名的字符長度,如果報文里面沒有攜帶用戶名的話,填寫0
? ? ? ? port_len表示端口字段的長度,這個端口即客戶端的發送端口
? ? ? ? rmt_addr_len表示地址的長度,沒有設置的話寫0.
? ? ? ? data_len表示報文里面data的長度,data和認證類型有關,有些認證流程使用這個字段有些不用。待會講到基本認證流程會給出說明。
2.2 認證響應報文:
?status表示狀態:
TAC_PLUS_AUTHEN_STATUS_PASS := 0x01 TAC_PLUS_AUTHEN_STATUS_FAIL := 0x02 TAC_PLUS_AUTHEN_STATUS_GETDATA := 0x03 TAC_PLUS_AUTHEN_STATUS_GETUSER := 0x04 TAC_PLUS_AUTHEN_STATUS_GETPASS := 0x05 TAC_PLUS_AUTHEN_STATUS_RESTART := 0x06 TAC_PLUS_AUTHEN_STATUS_ERROR := 0x07 TAC_PLUS_AUTHEN_STATUS_FOLLOW := 0x21flag目前之定義了一個值,表明是否回顯信息給終端用戶:
TAC_PLUS_REPLY_FLAG_NOECHO := 0x01server_msg是給用戶看的信息,data和認證流程有關。
Tacacs+交互流程圖:
協議定義了一些基本的認證類型:
1. ASCII Login
action = TAC_PLUS_AUTHEN_LOGIN authen_type = TAC_PLUS_AUTHEN_TYPE_ASCII minor_version = 0x0這是一個標準的ASCII身份驗證。Start報文可以包含用戶名。如果用戶不包含用戶名,則服務器必須使用CONTINUE從客戶機獲得它TAC_PLUS_AUTHEN_STATUS_GETUSER。如果用戶 不提供然后服務器可以發送另一個用戶名請求,但服務器必須限制允許重試的次數,建議限 制為3次嘗試。當服務器具有用戶名時,它將使用帶TAC_PLUS_AUTHEN_STATUS_GETPASS的 continue作為密碼。ASCII login 用戶名和密碼都使用user_msg字段。data字段沒有使用。2. PAP 認證
PAP Login action = TAC_PLUS_AUTHEN_LOGIN authen_type = TAC_PLUS_AUTHEN_TYPE_PAP minor_version = 0x1整個會話必須由一個單獨的START報文和一個REPLY報文構成,START報文必須攜帶用戶名, 并且data字段必須攜帶PAP ASCII密碼。REPLY響應報文必須是PASS、FAIL或者ERROR3. CHAP login
action = TAC_PLUS_AUTHEN_LOGIN authen_type = TAC_PLUS_AUTHEN_TYPE_CHAP minor_version = 0x1 The entire exchange MUST consist of a single START packet and a single REPLY. The START packet MUST contain the username in the user field and the data field is a concatenation of the PPP id, the challenge and the response. The length of the challenge value can be determined from the length of the data field minus the length of the id (always 1 octet) and the length of the response field (always 16 octets). To perform the authentication, the server calculates the PPP hash as defined in the PPP Authentication RFC RFC 1334 [RFC1334] and then compare that value with the response. The MD5 algorithm option is always used. The REPLY from the server MUST be a PASS, FAIL or ERROR. The selection of the challenge and its length are not an aspect of the TACACS+ protocol. However, it is strongly recommended that the client/endstation interaction is configured with a secure challenge. The TACACS+ server can help by rejecting authentications where the challenge is below a minimum length (Minimum recommended is 8 bytes).4.? MS-CHAP v1 login
action = TAC_PLUS_AUTHEN_LOGIN authen_type = TAC_PLUS_AUTHEN_TYPE_MSCHAP minor_version = 0x1The entire exchange MUST consist of a single START packet and a single REPLY. The START packet MUST contain the username in the user field and the data field will be a concatenation of the PPP id, the MS-CHAP challenge and the MS-CHAP response. The length of the challenge value can be determined from the length of the data field minus the length of the id (always 1 octet) and the length of the response field (always 49 octets). To perform the authentication, the server will use a combination of MD4 and DES on the user’s secret and the challenge, as defined in RFC 2433 [RFC2433] and then compare the resulting value with the response. The REPLY from the server MUST be a PASS or FAIL. For best practices, please refer to RFC 2433 [RFC2433] . The TACACS+ server MUST reject authentications where the challenge deviates from 8 bytes as defined in the RFC.5.? MS-CHAP v2 login
action = TAC_PLUS_AUTHEN_LOGIN authen_type = TAC_PLUS_AUTHEN_TYPE_MSCHAPV2 minor_version = 0x1The entire exchange MUST consist of a single START packet and a single REPLY. The START packet MUST contain the username in the user field and the data field will be a concatenation of the PPP id, the MS-CHAP challenge and the MS-CHAP response. The length of the challenge value can be determined from the length of the data field minus the length of the id (always 1 octet) and the length of the response field (always 49 octets). To perform the authentication, the server will use the algorithm specified RFC 2759 [RFC2759] on the user’s secret and challenge and then compare the resulting value with the response. The REPLY from the server MUST be a PASS or FAIL. For best practices for MS-CHAP v2, please refer to RFC2759 [RFC2759] . The TACACS+ server MUST rejects authentications where the challenge deviates from 16 bytes as defined in the RFC.6. Enable Request
action = TAC_PLUS_AUTHEN_LOGIN priv_lvl = implementation dependent authen_type = not used service = TAC_PLUS_AUTHEN_SVC_ENABLE協議上說這是用來改變當前用戶的權限的,整個交互流程可能包含多個報文,和ASCII login類似。 為了和其它請求區別,authen_service必須設置成 TAC_PLUS_AUTHEN_SVC_ENABLE。7. ASCII change password request
action = TAC_PLUS_AUTHEN_CHPASS authen_type = TAC_PLUS_AUTHEN_TYPE_ASCII由多條消息組成,和ASCII login類似,用來改變密碼的。 當status值為TAC_PLUS_AUTHEN_STATUS_GETPASS表示請求新密碼,這條消息可以發送多次。 當status值為TAC_PLUS_AUTHEN_STATUS_GETDATA表示請求舊密碼。終止會話:
客戶端可以主動終止會話,即在Continue報文中flag標識設置成TAC_PLUS_CONTINUE_FLAG_ABORT 。
如果設置該標識,data字段可能包含一段信息解釋客戶端為啥終止。
此外,當收到服務器回復的時候,對于客戶端不支持的選項,比如REPLY報文里status字段是
TAC_PLUS_AUTHEN_STATUS_FOLLOW等,可以把它當作Fail來處理。
?
3.1 授權請求報文:
一次授權操作只有兩個報文組成,分別是客戶端的Request和服務器端的Reply。
?
?authen_method:表明用戶是如何認證的,可選值有如下,協議建議忽略這個字段:
TAC_PLUS_AUTHEN_METH_NOT_SET := 0x00 TAC_PLUS_AUTHEN_METH_NONE := 0x01 TAC_PLUS_AUTHEN_METH_KRB5 := 0x02 TAC_PLUS_AUTHEN_METH_LINE := 0x03 TAC_PLUS_AUTHEN_METH_ENABLE := 0x04 TAC_PLUS_AUTHEN_METH_LOCAL := 0x05 TAC_PLUS_AUTHEN_METH_TACACSPLUS := 0x06 TAC_PLUS_AUTHEN_METH_GUEST := 0x08 TAC_PLUS_AUTHEN_METH_RADIUS := 0x10 TAC_PLUS_AUTHEN_METH_KRB4 := 0x11 TAC_PLUS_AUTHEN_METH_RCMD := 0x20priv_lvl:和認證報文里面字段一樣,表明用戶權限。
authen_service, 這個和認證字段一樣,表明用戶要求授權的服務。
user和user_len表明用戶名和用戶名長度。
port和port_len,表明本次客戶端發送端口,長度為字節。
rem_addr和rem_addr_len和認證報文里面字段一樣,表明客戶端地址和地址長度,單位為字節。
arg_cnt表明參數個數。
arg_1 ... arg_N, arg_1_len .... arg_N_len:表明參數長度。
授權參數都是以屬性-值這種方式呈現,兩者中間可以是“=”或者是“*”,= 表示強制的,*表示可選的。協議已經定義了一些屬性。
3.2 授權響應報文:
?status表示授權狀態,協議定義了如下值:
TAC_PLUS_AUTHOR_STATUS_PASS_ADD := 0x01 //授權成功,如果響應報文里面攜帶有參數,那么這些 參數也要應用。當然響應報文里面的參數也有可能是0TAC_PLUS_AUTHOR_STATUS_PASS_REPL := 0x02 //授權成功,但是必須要使用響應報文里面的參數來替換。TAC_PLUS_AUTHOR_STATUS_FAIL := 0x10 //授權失敗TAC_PLUS_AUTHOR_STATUS_ERROR := 0x11 //表明服務器遇到錯誤TAC_PLUS_AUTHOR_STATUS_FOLLOW := 0x2 //這個和authen類似,如果客戶端不支持的話可以當作失敗處理arg_cnt表示參數個數。
server_msg len和data_len分別表示server_msg和data部分的長度。
4.1 計費請求報文:
計費報文里面字段含義和授權一樣。
status可選如下值:
TAC_PLUS_ACCT_FLAG_START := 0x02 //服務開始 TAC_PLUS_ACCT_FLAG_STOP := 0x04 //服務結束 TAC_PLUS_ACCT_FLAG_WATCHDOG := 0x08 //服務更新或者服務仍然在運行4.2 計費響應報文:
響應報文就更簡單了,基本上只需要關注status字段,已定義的值包括:
TAC_PLUS_ACCT_STATUS_SUCCESS := 0x01 TAC_PLUS_ACCT_STATUS_ERROR := 0x02 TAC_PLUS_ACCT_STATUS_FOLLOW := 0x21計費請求報文里面的標志位可以有如下四種合法組合:
?
5. Attribute-Value Pairs(參數對):
1. service首選項,用在授權和計費報文里面,表明操作的服務類型:
可選值包括:"shell", "tty-server", "connection", "system" and "firewall",這個選項必須要包含到報文里面去。
2. protocol, 可以用來表示服務的子集,可用可不用。
3. cmd, shell命令,如果service=shell的話必須定義cmd選項。這個是最常見的授權選項。
4. cmd-arg,表示shell 命令的參數
其它還有很多,這里只列出了最常見的幾種,有需要的話可以去協議里查一下。
Attribute-Value Pairs(計費):
上面的參數主要用在授權里面,計費也有計費的參數。
1. task_id,start和stop同一個服務時必須填寫一致的任務id,客戶端必須確保taskid不會重復。
2. start_time,表明動作開始時間,這個時間從epoch(1970)開始到現在所經歷的秒數。
3. stop_time, 和start_time類似。
4. elapsed_time:表明動作流逝的時間,單位為秒。
所有value的編碼需要遵循一些規則:
1. 在attribute-value里的數字應該是無符號類型的ASCII十進制數字。
2. boolean應該是true或者false.
3.?......
?
以上基本上就是協議的全部內容,協議總共才40幾頁,內容比較簡單,開發的時候有些細節再去協議里確定下就好了。
因為我開發的是tacacs客戶端,所以需要和一個tacacs+服務器對接測試,這方面ubuntu已經有了這個軟件包,只需要下載下來安裝,然后配置數據就好了。具體的安裝配置可以參考之前寫的一篇簡介(ubuntu tacacs+ 服務器安裝啟動)
使用這個軟件可以測試AAA功能。
tacacs+ RFC文檔下載連接:
1.?https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-12
我自己使用Golang開發的的tacacs+客戶端庫,有興趣的同學可以參考下,
1.?git@github.com:FuYuanDe/goTacacsPlus.git
?
參考文檔:
1.?【RFC】The TACACS+ Protocol draft-ietf-opsawg-tacacs-12
2.??TACACS技術白皮書?http://www.h3c.com/cn/d_201706/1000387_30003_0.htm
=============================================================================================
Linux應用程序、內核、驅動、后臺開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上
總結
以上是生活随笔為你收集整理的TACACS 协议简介与开发总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux开发中 MD5值的计算
- 下一篇: 电脑怎么恢复系统winx7 电脑如何重装