距離上一次接觸tnc-fhh這個開源項目已經過去了一年。最近在看相關論文時無意瞄了眼這個項目的官方文檔,就在閒暇(假裝很忙^\\^)又重新讀了遍官方文檔,並跑了跑項目裏模擬的IMCV對,這裏做個總結。
總體描述:
官方文檔位於一級目錄下doc/tncfhh.pdf,其中提到tncsim可以在無NAA和NAR的情況下模擬TNCS和TNCC,用來測試IMCV對。tncsim每次加載完IMC和IMV模塊後,由IMC模塊發起一個TNC握手。加載的模塊由/etc/tnc/tncsim_config配置(安裝後),在tnc-fhh項目中實現的imcv都分配了特定的消息類型:
- vendorId-------0x0080ab
- example-----0xfe dummy----0x31 clamav----0x41 platid----0x33 attestation----0x34 hostscanner----0x30
每個imcv在啓動的時候都會讀日誌配置文件log4cxx.properties的內容,其實沒有這個文件這些imcv都寫了默認的日誌配置,這裏曬個自己配的日誌文件,畢竟少一個啓動warning是好事。:
#設置rootlogger爲DEBUG級別,使用了fa一個Appender
log4j.rootLogger=DEBUG,fa
#對Appenderfa進行設置:
#這是一個控制檯的Appender,
log4j.appender.fa=org.apache.log4j.ConsoleAppender
log4j.appender.fa.Threshold=DEBUG
#輸出方式(Target)爲標準輸出,
log4j.appender.fa.Target=System.out
#輸出格式(layout)爲PatternLayout
log4j.appender.fa.layout=org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern=[%-5p] %d %l : %m%n
需要注意的是日誌的級別應設爲DEBUG,但不該更高,否則會丟失運行信息,在log4cxx中,日誌優先級爲:FATAL >> ERROR >> WARN >> INFO >> DEBUG >> TRACE。
(一)example imcv:
這對imcv只是簡單的發送helloworld報文。輸出的第一部分截圖如下:
發現tncsim先啓動S端後啓動C端,然後C端就發起了一次TNC握手,終端輸出了報文的抓包內容,並且還輸出了這些報文的xml格式。其中的關鍵數據是base64編碼的,用解碼器解碼可得到內容。這裏用明文形式表示了其傳遞的過程:
其中,BatchId爲包序號,recipient爲接收方。
C S
|---->(Example message from ExampleIMC) |
| (Example message from ExampleIMV)<--------|
|---->(Another example message from ExampleIMC.) |
| (allow)<-------|
是不是感覺很扯,沒錯,我也覺得很扯。很古怪的ACL,但畢竟作者在文檔裏說了這個例子的目的是教你開發IMCV對。
(二)dummy imcv:
接下來是第二個imcv的測試,測試流程如上,協議過程如下:
C S
|---->(DummyIMC message 0, action = isolate) |
| (isolate)<--------|
好吧,這個更扯淡的ACL。官方文檔給出的說法是/etc/tnc/dummyimc.file裏的內容將會被IMC發送給IMV,其中僅有allow, isolate, none三個選擇,再由IMV給出迴應。
(三)hostscanner imcv:
再來一個imcv對的測試,這回的看名字就知道是在按port做的ACL,應該會有意思,協議流程如下:
C S
|---->(HostScannerIMC active) |
| (TCP20,21,22...UDP631)<--------|
|---->(TCP20=close...UDP631=open) |
| (allow)<-------|
(四)platid imcv:
這個imcv一開始總是會出段錯誤,我用gdb跟蹤發現報錯發生在log4cxx的一個宏裏,好奇葩!在網上找了半天發現該項目的github裏有人也問過這問題。後來他通過註解掉對log4cxx的調用做了折中處理。這裏說明一下,在一級目錄/imcv/plaid/imv/src下的FileCertManager.cpp裏註解掉構造函數和虛構函數內容,然後重新make && make install。
FileCertManager::FileCertManager(const char *certfile)
{
// LOG4CXX_TRACE(logger, "FileCertManager()");
// loadCertsFromFile(certfile);
}
FileCertManager::~FileCertManager()
{
// LOG4CXX_TRACE(logger, "~FileCertManger");
}
關於platid與clamav這兩個imcv的協議內容,可以參考官方文檔,因爲報文被RSA加密所以這裏不寫過程了。
最後
有時間了可以按照官方文檔開發一個attestation的imcv,協議流程就按TCG的規範來,當然,這都是後話了^__^假裝自己以後有心思折騰這個。