劉學海 計小軍 衛 乾 尹 鵬
(1.北京中油瑞飛信息技術有限責任公司;2.中國石油伊拉克魯麥拉項目部;北京 100007)
隨著計算機技術應用的不斷深入,特別是信息化與工業化深度融合及物聯網技術的快速發展,相繼開發出許多如RTU等的嵌入式網絡設備。
RTU(Remote Terminal Unit)中文全稱為遠程終端單元,通過自身的軟件系統可以實現調度系統對生產現場的遙測、遙控、遙調和遙信等功能。它是組成工業控制數據采集與監視控制系統的細胞單元,在工業控制領域有著非常廣泛的應用。
隨著網絡技術的飛速發展,具備快速的響應能力、開放式的通信協議和平臺的網絡化RTU已經成為目前市場上的主流工業控制產品之一,而安全性一直是通信網絡中最大的問題之一。目前工業控制現場應用的RTU控制器與SCADA(數據采集與監視控制系統)組態軟件之間一般采用明文方式進行數據交互,這種開放式的通信方式存在重大的安全隱患,傳輸的通訊報文容易被第三方監聽、截取和偽造。一旦發生這種情況,將產生不可估量的生產效益損失。如何防止工業控制系統安全事件的發生、在重點能源企業構筑安全的工業控制系統,已經成為政府和企業關注的熱點。
信息安全型RTU控制器(圖1)不但可以實現對工業控制現場數據的采集及處理功能,同時在數據傳輸前進行加密,拒絕未授權用戶的訪問,從而有效杜絕由于信息泄露或非法侵入導致的工業安全隱患。

圖1 信息安全RTU與傳統RTU對比圖
目前密碼編碼算法按密鑰使用方法分為對稱密碼算法、非對稱密碼算法以及不需要密鑰的信息摘要算法,要實現這些算法及相應的協議,工作量非常巨大,實現中通常采用現存的一些密碼算法軟件包來實現二次開發。OpenSSL為開發密碼安全平臺提供了豐富的密碼算法接口,可以安全高效的實現信息安全RTU。
SSL協議即安全套接層(Secure Sockets Layer)協議,是Netscape公司推出的為網絡應用層的通信提供認證、數據保密和數據完整性服務的一種安全通信協議。SSL協議建立在可靠的TCP傳輸控制協議之上,在網絡模型中位于應用層和傳輸層之間,并且與上層協議無關,各種應用層協議(如HTTP、FTP、TELNET等)都能通過SSL協議進行透明傳輸。
SSL協議分為握手協議和記錄協議兩種。握手協議是指在數據傳輸前,服務器與客戶端進行身份鑒別,同時協商決定采用的協議版本、加密算法等。每次連接,握手協議都要建立一個會話,且每次握手中產生的對稱密鑰都是獨特的,這種每次更換密鑰的方法在更大程度上保證了通信的安全性。記錄協議是指對要傳輸的信息用協商好的對稱密鑰加密后,再通過TCP/IP的連接將信息發送出去。
SSL協議提供的安全連接具有以下3個基本特點:
(1)連接是保密的:對于每個連接都有一個唯一的會話密鑰,采用對稱密碼體制(如DES、RC4等)來加密數據;
(2)連接是可靠的:消息的傳輸采用MAC算法(如MD5、SHA等)進行完整性檢驗。
(3)雙方是可信任的:對端實體的鑒別采用非對稱密碼體制(如RSA、DSS等)進行認證。
OpenSSL是一個健全的、全開放的和開放源代碼的軟件包,最早由Eric A. Yang和Tim J.Hudson開發,現在OpenSSL已經實現了對安全套接層SSL V2.0/V3.0和傳輸安全協議TLS V1.0的支持。與同類型密碼庫相比,OpenSSL具有以下優點:
(1)采用C語言開發,支持多種操作系統(Linux、BSD、Windows、Mac、VMS等),可移植性好。
(2)功能全面,密碼庫支持的密碼算法豐富,如對稱密碼算法AES、DES、CAST、IDEA、RC4等;非對稱密碼算法DH算法、RSA算法、DSA算法和橢圓曲線算法;信息摘要算法MD2、MD5、SHA-1和RIPEMD。
(3)OpenSSL提供了CA等用于生成各種X.509證書(網絡通信中標志服務方實體的身份,含有服務方的公開密鑰)、密鑰文件的命令,方便程序的編寫和調試。
(4)源代碼開放,能夠根據需要選擇不同的軟件版本進行修改和移植。
另外,OpenSSL軟件包還提供了豐富的密鑰和證書管理功能以及用來進行加密模塊擴展的引擎機制。
本文采用的系統硬件平臺是由北京中油瑞飛信息技術有限責任公司自主研發的一款RTU產品,分為核板和底板兩個部分。核板采用Atmel AT91SAM9X25為微處理器(CPU),并采用專業穩定的內核電源芯片和外部看門狗復位芯片來保證系統運行的穩定性。CPU主頻為400MHz,內存設備為128M的DDR2,RTU的Flash存儲為128M的Nand Flash。
底板接口和資源方面:1路10/100M以太網RJ-45接口,4路串行接口,1路CAN接口,1路ZigBee無線接口,8路AI和DI接口,4路AO和DO接口。
除上述通用資源外,信息安全RTU采用硬件引擎加密機制,硬件加密模塊采用工業級帶有安全主控芯片的SD卡。加密芯片高速數據總線接口,除了支持國際通用加密算法AES、DES、RSA、SHA外,還支持SM2算法,這可在保證數據吞吐率的同時增強信息加密的強度和靈活性。
整個安全信息傳輸系統包括3個部分:服務端,由基于OpenSSL的信息安全RTU充當;客戶端,由安裝SCADA軟件的電腦充當;加密機代理,由安裝Linux系統的加密機充當(圖2)。RTU主要實現加密機代理的身份認證、與代理的信息傳輸、和底層數據的采集,其中加密機的身份認證和與加密機的信息交互為RTU實現的重點。

圖2 安全信息傳輸系統組成圖
在整個安全信息傳輸系統中,RTU和加密機之間以SSL安全連接,而SCADA與加密機之間是直連。這是因為RTU與加密機之間的信息處于公網內,容易被第三方惡意監聽、截取和偽造,而加密機與SCADA處于公司內網,安全性較高。
基于OpenSSL的信息安全RTU的軟件結構分為以下4個層次:
(1)引導加載程序Bootloader
Bootloader是嵌入式系統在上電后執行的第一段代碼,這段程序在完成CPU和相關硬件的初始化后,再將操作系統映像拷貝到內存中然后跳轉到操作系統所在的空間,啟動操作系統。本文采用的是bootstrap+uboot作為第一層引導加載程序。
(2)經剪裁、移植的Linux內核
Linux內核包含著所有操作系統的核心功能和網絡協議棧,是Linux操作系統的心臟。本系統的信息安全RTU以剪裁過的2.6.39版本的Linux為內核。
(3)文件系統
文件系統包括根文件系統和建立于Flash設備上的文件系統。嵌入式Linux啟動時,第一個掛載的是根文件系統(包含特定的目錄下不同名稱、不同用途的文件)。
(4)用戶應用程序
用戶自己開發的運行于嵌入式Linux操作系統之上的計算機程序,包括自定義協議棧、Web服務器等。信息安全RTU開發的應用程序包括基于OpenSSL的服務端與加密機通信程序、本地模擬量與數字量采集控制程序、串口Modbus程序等。
上述4個層次中,前3個是信息安全RTU平臺的搭建,第4個層次是基于OpenSSL的信息安全RTU功能實現的重點。
在整個系統中,信息安全RTU與加密機代理的通信流程如圖3所示。其中步驟1~13為SSL的握手階段,完成代理與服務端的雙向認證、加密算法的協商、密鑰的確定。

圖3 信息安全RTU與加密機代理通信流程圖
這13條消息可以分為4個階段:
第一階段是加密機代理向信息安全RTU服務端發送一個連接請求Client Hello,包含了加密機的SSL協議版本號、隨機數key和準備使用的加密算法。
第二階段是RTU服務端收到加密機代理的連接請求后向代理發送自己的SSL協議版本號、加密算法的種類、隨機數key、自身SD卡硬件證書以及代理的證書請求。
第三階段是代理收到服務端發送的信息后,會驗證服務端的合法性,包括證書是否過期、發行服務器證書的CA是否可靠、服務器證書上的域名是否和服務器的實際域名相匹配等。如果合法性驗證通過,加密機代理會隨機產生一個對稱密鑰key,并用提取的服務器公鑰對其進行加密,然后產生一個隨機數,并數字簽名,最后將簽名的隨機數、代理自己的證書和加密的對稱密鑰key發給服務器,并向服務端發出信息,指明后面的數據通訊將采用該對稱密鑰作為通信密鑰,同時通知服務端代理握手過程結束。如果合法性驗證沒有通過,通訊將斷開,
第四階段信息安全RTU服務端對代理發送來的證書和簽名隨機數進行合法性檢驗。如果驗證通過,服務端用私鑰解密代理發送來的對稱密鑰,并向代理發送信息,指明后面的數據通訊使用該對稱密鑰,同時通知代理服務端握手過程結束。如果檢測沒有通過,通訊立即中斷,
握手過程結束后,加密機代理與信息安全RTU端將進行應用數據的傳輸,直至此次通話結束。
基于OpenSSL的信息安全RTU為實現SSL通信軟件各個模塊的設計及關系如圖4所示,信息安全RTU服務端在接收到加密機代理的請求后,會判斷該請求是否為已連接且為未斷開的請求,如果是,則啟用會話重用模塊,而不需要重新握手建立連接,這種方式會節省不必要的開銷,提高通訊效率;如果該請求是新的連接請求,則需要建立SSL連接。
SSL連接過程需要用到SSL初始化模塊、SSL連接模塊和SSL身份驗證模塊3個模塊:SSL密碼組控制模塊用于RTU與加密機通信密碼的選擇與控制,加密機代理可以通過修改密碼來保證通信的安全;SSL通信模塊用于RTU與加密機建立SSL連接后雙方的數據傳輸。
(1)SSL初始化
首先要初始化OpenSSL的函數庫,通過函數SSL_library_init()來實現,然后調用SSL_load_error_string()函數,可以將錯誤碼轉換成字符串。

圖4 基于OpenSSL的信息安全RTU的SSL通信中各模塊關系圖
接著創建SSL上下文,信息安全RTU采用的是硬件引擎加密機制,首先要初始化硬件加密模塊,通過調用ENGINE_load_sdkey()函數實現這一功能,該函數中會完成硬件加密模塊SD卡中的加解密算法庫替換OpenSSL中的軟加解密算法庫等一系列工作。然后調用SSL_METHOD *meth=SSLv23_server_method()函數用來初始化SSL支持的版本;SSL_CTX *ctx=SSL_CTX_new(meth)函數用來創建SSL_CTX數據結構,該結構體主要用于準備SSL握手前的環境,包括CA證書、服務端的證書、私鑰、協議版本號等,然后通過調用各功能函數實現該數據結構的初始化。
因為RTU服務端需要認證加密機代理,所以需要加入請求代理認證的內容,調用函數SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL)實現,參數SSL_VERIFY_PEER需要進行代理認證,SSL_VERIFY_FAIL_IF_NO_PEER_CERT表示如果客戶端不提交證書則SSL連接過程立刻終止。
(2)SSL接受連接
RTU端在收到加密機代理發出的連接請求后,RTU端就會創建SSL對象來對應一條SSL連接,SSL對象并不是直接附加到套接字上,而是通過中間層BIO對象來實現的;SSL對象附加到BIO對象上,然后BIO對象實現與套接字實現通信。這樣使得SSL對象的實現不僅局限于網絡套接字,還可以用于實現串口等。信息安全RTU中實現方法為:ssl=SSL_new(ctx),創建SSL對象;SSL_set_fd(ssl, ucSocket)實現SSL對象與BIO對象以及BIO對象與套接字的綁定;err=SSL_accept(ssl)實現與代理的握手過程,包括雙方的互相認證、密鑰的協商等。如果握手成功,返回1,SSL連接成功建立成功,可以開始進行數據傳輸。如果失敗,可以通過檢查返回值來確定連接錯誤的原因。
信息安全RTU端與加密機代理的SSL連接建立成功后,SSL對象和套接字作為一個數據結構保存到會話重用模塊中,只要SSL連接不中斷,RTU與加密機通信都是通過調用會話重用模塊進行通信的。
(3)數據傳輸
信息安全RTU與加密機代理通信交互時,發送數據用函數SSL_write(ssl,buffer,length),接收函數用函數SSL_read(ssl,buffer,length),與系統函數read和write基本一致,只是第一個參數變為SSL對象。
最后,通信完成后,要終止SSL連接,釋放資源,調用SSL_free(ssl)來釋放SSL對象,調用SSL_CTX_free(ctx)來釋放CTX環境對象。
為解決工業現場中RTU在通信中存在的安全隱患,本文設計并實現了基于OpenSSL的信息安全RTU,詳細介紹了該RTU的總體設計方案及OpenSSL握手、數據通信的具體實現,適用于需要安全通信的工業現場。
[1]Bruce Schneider.應用密碼學[M].北京:機械工業出版社,2000.
[2]W.Chou.Accelerating secure transactions.IT Professional,2003(2):37.
[3]Nachiketh,Potlapally,SRavi.A Study of the Energy Consumption Characteristics of Cryptographic Algorithms and Security Protocols.IEEE TRANSACTIONS ON MOBILE COMPUTION,2006,5(2):128.
[4]Dierks T, Allen C. The TLS Protocol Version 1.0[S] IET FRFC2246, 1999.
[5]齊洪喜,周大水.基于OpenSSL的安全密碼平臺的設計與實現[J].計算機工程與設計,2007,28(2):314-315,319.
[6]Rescorla E.SSL與TLS Designing and Building Secure Systems[M].崔凱譯.北京:中國電力出版社,2002.