申純潔
(湖北大學 計算機與信息工程學院, 武漢 430062)
?
嵌入式數(shù)據(jù)庫SQLite 的編程及DD-WRT路由器程序的仿真
申純潔
(湖北大學 計算機與信息工程學院, 武漢 430062)
針對路由器網(wǎng)絡安全的需要,在Linux操作系統(tǒng)上安裝了小型的SQLite數(shù)據(jù)庫系統(tǒng),記錄各類與網(wǎng)絡安全有關的數(shù)據(jù),并結(jié)合C語言編程,建立了特征網(wǎng)絡安全數(shù)據(jù)庫,依據(jù)數(shù)據(jù)庫中的特征向量對訪問路由器的智能設備進行檢測、攔截、轉(zhuǎn)向、跟蹤和記載審計以達到網(wǎng)絡安全檢測和防護功能。此項研究主要針對中低端(部分高端)具有DD-WRT技術(shù)的路由器,通過嵌入關系數(shù)據(jù)庫及多種安全功能模塊,以達到投入極小成本使路由器的安全性能上一個高臺階的目的。
網(wǎng)絡安全;SQLite數(shù)據(jù)庫;DD-WRT
隨著信息技術(shù)的飛速發(fā)展和進步,網(wǎng)絡安全已變得極為重要?;诖笮完P系數(shù)據(jù)庫的網(wǎng)絡安全核心技術(shù)研究(湖北省科技支撐項目2014BAA089)其核心技術(shù)之一是將關系數(shù)據(jù)庫嵌入到路由器中,建立網(wǎng)絡安全特征數(shù)據(jù)庫,并依據(jù)數(shù)據(jù)庫中的特征向量對進入路由器的數(shù)據(jù)進行檢查、攔截、跟蹤和放行等安全動作。由于路由器運行的操作系統(tǒng)是Linux,并且其資源有限,不能顯著降低路由器性能,嵌入式數(shù)據(jù)庫SQLite作為本項研究的DBMS是適合的。路由器中的程序要求能經(jīng)第三方修改刷新,因此具有DD-WRT技術(shù)的路由器作為首選。
DD-WRT是一個基于Linux的無線路由軟件,采用GPL協(xié)議。起源于2003年, DD-WRT提供了許多一般路由器的軟件所沒有的功能,例如支持XLink Kai游戲協(xié)議, 基于守護進程的服務, IPv6, 無線分布式系統(tǒng)(無線網(wǎng)橋和無線中繼), RADIUS, 先進服務質(zhì)量控制,無線輸出功率控制, 超頻能力,以及SD卡的硬件配置提供軟件支持等。
本文所研究的主要內(nèi)容為安裝配置DD-WRT路由器程序的仿真環(huán)境、SQLite的安裝配置和數(shù)據(jù)庫的檢索、修改、刪除、插入等操作,最后以路由器數(shù)據(jù)流的特征向量數(shù)據(jù)庫為例寫一個DD-WRT仿真程序。
進行嵌入式軟件開發(fā),開發(fā)環(huán)境一般都是基于linux 系統(tǒng)。本文通過安裝虛擬機軟件,再在虛擬機中安裝linux系統(tǒng)。
1.1 在VMWare 中安裝Ubuntu
(1)到官網(wǎng)下載ubuntu-16.04-desktop-amd64.iso安裝包。
(2)雙擊打開已安裝好的VMWare 軟件,點擊菜單欄文件->新建虛擬機,或者直接點擊主頁中的“創(chuàng)建新的虛擬機”圖標,彈出新建虛擬機向?qū)А?/p>
(3)虛擬機新建向?qū)в袃蓚€工作模式:典型和自定義。這里我們選擇自定義模式。
(4)選擇虛擬機硬件兼容性頁面,保持默認即可。
(5)安裝客戶機操作系統(tǒng)。我們是通過硬盤中的ubuntu 系統(tǒng)鏡像文件來安裝的。在安裝程序光盤映像文件中,瀏覽選擇事先下載好的ubuntu 的鏡像iso。點擊下一步。
(6)命名該虛擬機,設置密碼。并為虛擬機選擇硬件配置,分配內(nèi)存,指定磁盤大小和存儲路徑。
1.2 編譯器GCC的安裝
GCC是Linux 下基于命令行的C語言編譯器,GCC編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件的名字,GCC將生成一個名為a.out的文件。使用GCC由C語言源代碼文件生成可執(zhí)行文件的過程不僅僅是編譯的過程,而是要經(jīng)歷四個相互關聯(lián)的步驟∶預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、 匯編(Assembly)和連接(Linking)。GCC安裝方法:將虛擬機聯(lián)網(wǎng),打開命令行運行sudo apt-get install build-essential ,并按提示輸入管理員密碼。安裝完成后可以執(zhí)行GCC-version的命令查看版本信息。系統(tǒng)如果不帶vim編輯工具,可以在命令行輸入sudo apt-get install vim。
1.3 編譯運行
通過上述設置搭建了C語言程序運行環(huán)境,采用VIM編寫簡單hello.c程序的輸出結(jié)果判斷整個虛擬機、GCC編譯環(huán)境是否搭建成功。
hello.c:
#include
Int mian(void)
{
Printf(“Hello Ubuntu ”);
}
對這個程序編譯運行。
gcc -Wall -c hello.c -o hello
./hello
得到結(jié)果:
Hello Ubuntu
從結(jié)果可以看出GCC已經(jīng)運行了,和理論上結(jié)果相同的,這說明本文在虛擬機上安裝GCC編譯環(huán)境是成功的。
SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數(shù)據(jù)庫引擎,遵守ACID(Atomic、 Consistency、 Isolation、 Durability)的關系型數(shù)據(jù)庫管理系統(tǒng),包含在一個相對小的C庫中,支持大多數(shù)的SQL92標準,并且可以在所有主要的操作系統(tǒng)上運行。具有三級模式的結(jié)構(gòu)體系,即用戶模式、邏輯模式和存儲模式。相對于傳統(tǒng)數(shù)據(jù)庫,SQLite具有更好的實時性、系統(tǒng)開銷小、底層控制能力強。SQLite能夠高效地利用嵌入式系統(tǒng)的有限資源,提高數(shù)據(jù)的存取速度,增強系統(tǒng)的安全性。
2.1 SQLite在Ubuntu中安裝步驟如下:
(1)將下載的SQLite軟件包sqlite-snapshot-201606031859.tar.gz下載到linuxshare目錄。
(2)完成以下幾項配置:
①在命令行輸入cd /mnt/hgfs/linuxshare,進入下載目錄。
②解壓文件,在命令行輸入tar xvfz sqlite-snapshot-201606031859.tar.gz,解壓后生成sqlite-snapshot-201606031859目錄。 cd 進入sqlite-snapshot-201606031859。
③命令行輸入./configure
make
sudo make install
安裝成功。
2.2 SQLite的操作
(1)創(chuàng)建數(shù)據(jù)庫
執(zhí)行sqlite3命令,在當前位置創(chuàng)建了數(shù)據(jù)庫SQLitetest.db,如圖1所示:
圖1 創(chuàng)建數(shù)據(jù)庫
(2)創(chuàng)建表
在上述數(shù)據(jù)庫中創(chuàng)建表student,可以用“.tables”命令去查看已創(chuàng)建的表,如圖2所示:
圖2 創(chuàng)建表
(3)插入數(shù)據(jù)
數(shù)據(jù)插入用insert語句就可以,查看用select語句,執(zhí)行結(jié)果如圖3所示:
圖3 數(shù)據(jù)插入
最后,可以使用“.quit”或“.exit”退出SQLite。
文獻 “電子文件網(wǎng)絡傳輸特征分析”分析和論述了流出路由器數(shù)據(jù)流的特征,并提取這些特征建立了基本的網(wǎng)絡安全特征數(shù)據(jù)庫。這部分本文不作詳細論述,詳情讀者可參閱文獻[5]。
3.1 特征數(shù)據(jù)庫設計
定義3.1 協(xié)議指的是數(shù)據(jù)流的序列規(guī)范。數(shù)據(jù)流s是屬于協(xié)議P的協(xié)議流,ATT(p)={s| s∈S,s滿足P的序列規(guī)范要求}。可識別協(xié)議集為PT={pl ,p2,… …pn}。
假設3.1 一個數(shù)據(jù)流不允許同時屬于兩個協(xié)議。即:?si,pi,pj?ATT(pi)∩ATT(pj)。數(shù)據(jù)流和協(xié)議規(guī)范屬于一對一關系,在現(xiàn)實當中,這種情況可能并不是絕對的,但對于大多數(shù)情況都是如此,如果允許一個數(shù)據(jù)流符合多個協(xié)議規(guī)范,那么將會大大增加誤判率,并且也是不實際的,因此3.1假設是必要的。
定義3.2 特征值, 協(xié)議特征的集合,存在一到多個特征,F(xiàn){fl ,f2,… …fn}。
定義3.3 數(shù)據(jù)流特征值, 數(shù)據(jù)流具有的協(xié)議特征。數(shù)據(jù)流s是協(xié)議和特征值的二元組s{p,f}。
(1)p為該數(shù)據(jù)流所屬協(xié)議
(2) f為該數(shù)據(jù)流具有的特征集合
定義3.4 電子文件安全策略, 為協(xié)議和禁止傳輸文件的叉積C=Pn×Fn。P為協(xié)議,F(xiàn)為禁止傳輸文件,叉積為傳輸禁止文件的所有具有協(xié)議特征的數(shù)據(jù)流。
結(jié)合提取的特征值和以上4個定義,數(shù)據(jù)庫總體設計如圖4示:
圖4 特征數(shù)據(jù)庫總體設計
3.2 創(chuàng)建網(wǎng)絡安全特征數(shù)據(jù)庫
在SQLite下執(zhí)行以下命令:
sqlite3 sec.db
CREATE TABLE Protocol(protocol_id integer primary key autoincrement NOT NULL,type varchar(10) NOT NULL, name varchar(16) NOT NULL);
CREATE TABLE Feature(id integer primary key autoincrement NOT NULL, value varchar(50) NOT NULL, protocol_id integer ,FOREIGN?KEY(protocol_id)?REFERENCES?Protocol(protocol_id));
CREATE TABLE Prohibited(file_id integer primary key autoincrement NOT NULL, filename varchar(30) NOT NULL, extension varchar(16) NOT NULL);
CREATE TABLE Relation (id integer primary key autoincrement NOT NULL, protocol_id bigint (0) FOREIGN?KEY?(protocol_id)?REFERENCES?Protocol(protocol_id)NOT NULL, file_id bigint(0) FOREIGN KEY (filel_id)REFERENCES Prohibite(filel_id) NOT NULL);
3.3 數(shù)據(jù)準備
將文獻[5]中網(wǎng)絡安全數(shù)據(jù)庫中的數(shù)據(jù)輸入到創(chuàng)建的表中作為基礎數(shù)據(jù)。具體操作如下:
INSERT INTO Protocol VALUES(1,"應用層",'HTTP');
(2,”應用層”,’SMTP’),
(3,”應用層”,’FTP’),
(4,”應用層”,’TFTP’),
(5,”傳輸層”,’TCP’);
INSERT INTO Feature VALUES(1,'Content-type:multipart/form-data',1), (2,'Content-type:multipart/mixed',1),
(3,'STOU',2),
(4,'APPS',2),
(5,'STOR',2),
(6,'writeRequest',3),
(7,'Content-type:multipart/form-data',4),
(8,"TCP三次握手后馬上發(fā)送一個緊急指正(PSH)為1 的TCP包",5);
INSERT INTO Prohibited VALUES(1,”答案”,’.txt’), (2,”圖片”’.jpg’);
4.1 安全檢測程序的工作流(見圖5)
圖5 程序流程圖
4.2 安全檢測程序的編碼
mysql_test.c
#include
#include
#include
#include < mysql.h>
MYSQL *g_conn; // mysql 連接
MYSQL_RES *g_res; // mysql 記錄集
MYSQL_ROW g_row; // 字符串數(shù)組,mysql 記錄行
#define MAX_BUF_SIZE 1024 // 緩沖區(qū)最大字節(jié)數(shù)
const char *g_host_name = "localhost";
const char *g_user_name = "ububtu";
const char *g_password = "123";
const char *g_db_name = "sec";
const unsigned int g_db_port = 2308;
int executesql(const char * sql) {
/*query the database according the sql*/
if (mysql_real_query(g_conn, sql, strlen(sql))) // 如果失敗
return -1; // 表示失敗
return 1; // 成功執(zhí)行
}
int init_mysql() { // 初始化連接
// init the database connection
g_conn = mysql_init(NULL);
/* connect the database */
if(!mysql_real_connect(g_conn, "localhost", "ububtu", "123", "sec",2308, NULL, 0)) return -1;//如果失敗
// 是否連接已經(jīng)可用
if (executesql("set names utf8"))
return -1; // 如果失敗
return 0; // 返回成功
}
int main(void) {
Stream stream = read-frame(route_buffer+offset,length); //按幀從路由器讀取數(shù)據(jù)幀
if(stream==null) return;//如果沒有數(shù)據(jù)進出直接結(jié)束程序
String sfeature = stream(offset,slength); //從數(shù)據(jù)幀中讀取s特征數(shù)據(jù)
String protocol = stream(offset,plength);//從數(shù)據(jù)幀中官讀取protocol數(shù)據(jù),
String prohibited = stream(offset,proLength);//從數(shù)據(jù)幀中官讀取Prohibited數(shù)據(jù),
if (init_mysql());
print_mysql_error(NULL);
char sql[MAX_BUF_SIZE];
if (executesql(sql))
print_mysql_error(NULL);
if (executesql("SELECT * FROM Protocol")) // 句末沒有分號
print_mysql_error(NULL);
g_res = mysql_store_result(g_conn); // 從服務器傳送結(jié)果集至本地,mysql_use_result直接使用服務器上的記錄集
int iNum_rows = mysql_num_rows(g_res); // 得到記錄的行數(shù)
int iNum_fields = mysql_num_fields(g_res); // 得到記錄的列數(shù)
printf("共%d個記錄,每個記錄%d字段 ", iNum_rows, iNum_fields);
puts("id name ");
while ((g_row=mysql_fetch_row(g_res))) // 讀取的協(xié)議類型與數(shù)據(jù)庫協(xié)議類型進行匹配
{
if(g_row[0] == protocol) break;
}
if(g_row[0] != protocol) //如果數(shù)據(jù)庫協(xié)議表和讀取的協(xié)議類別不匹配結(jié)束
exit();
if (executesql("SELECT * FROM Feature")) // 讀取數(shù)據(jù)庫中的F特征表
print_mysql_error(NULL);
g_res = mysql_store_result(g_conn); // 從服務器傳送結(jié)果集至本地,mysql_use_result直接使用服務器上的記錄集
iNum_rows = mysql_num_rows(g_res); // 得到記錄的行數(shù)
iNum_fields = mysql_num_fields(g_res); // 得到記錄的列數(shù)
while ((g_row=mysql_fetch_row(g_res))) // 讀取的協(xié)議類型與數(shù)據(jù)庫協(xié)議類型進行匹配
{
if(g_row[0] == sfeature) break;
}
if(g_row[0] != sfeature) //如果數(shù)據(jù)庫F表和讀取的F類別不匹配結(jié)束
exit();
if (executesql("SELECT * FROM Prohibited")) // 讀取數(shù)據(jù)庫中的F特征表
print_mysql_error(NULL);
g_res = mysql_store_result(g_conn); // 從服務器傳送結(jié)果集至本地,mysql_use_result直接使用服務器上的記錄集
iNum_rows = mysql_num_rows(g_res); // 得到記錄的行數(shù)
iNum_fields = mysql_num_fields(g_res); // 得到記錄的列數(shù)
while ((g_row=mysql_fetch_row(g_res))) // 讀取的協(xié)議類型與數(shù)據(jù)庫協(xié)議類型進行匹配
{
if(g_row[0] == prohibited) break;
}
if(g_row[0] != prohibited) //如果數(shù)據(jù)庫F表和讀取的F類別不匹配結(jié)束
exit();
mysql_free_result(g_res); // 釋放結(jié)果集
mysql_close(g_conn); // 關閉鏈接
return EXIT_SUCCESS;
//阻斷數(shù)據(jù)流
}
文章針對網(wǎng)絡安全問題,從利用SQLite數(shù)據(jù)庫對數(shù)據(jù)進行收集和管理著手,建立特征網(wǎng)絡安全數(shù)據(jù)庫,對安全檢測程序的DD-WRT仿真,描述了按幀從網(wǎng)絡讀取數(shù)據(jù)流和數(shù)據(jù)庫中已收集信息進行匹配的程序圖。給出了安全監(jiān)測程序編碼。本文不足之處:未對程序編碼進行測試,在后續(xù)工作中,將抓取分析更多的協(xié)議,提取更全的特征值,不斷拓展和完善特征數(shù)據(jù)庫,選取和構(gòu)造簡單高效的匹配算法。
[1]張廣斌,宮金林,陳爽.SQLite嵌入式數(shù)據(jù)庫系統(tǒng)的研究與實現(xiàn)[J].單片機與嵌人式系統(tǒng)應用,2008,5(6):11-13.
[2]謝柏林,余順爭.基于應用層協(xié)議分析的應用層實時主動防御系統(tǒng)[J].計算機學報,2011,34(3):452-462.
[3]沈昌祥,張煥國,土懷民,等. 可信計算研究與發(fā)展[J].中國科學 (信息科學),2010,40(2):139-166.
[4]韋勇,連一峰,馮登國.基于信息融合的網(wǎng)絡安全態(tài)勢評估模型[J].計算機研究與發(fā)展,2009,46(3):353-362.
[5]江宗武,戴承耕,李躍新. 電子文件網(wǎng)絡傳輸特征分析和提取[J].電子設計工程,(201511025),2016.
[6]張倪.嵌入式軟件基礎[M].北京:電子工業(yè)出版社,2010:145-149.
[7]吳志紅,揚躍臣.嵌入式停車場管理系統(tǒng)[J].計算機應用,2010,30(11):3126-3129.
[8]廖國瓊.嵌入式移動實時數(shù)據(jù)庫事務處理技術(shù)[M].北京:中國鐵道出版社,2010:22-39.
The Programming of Embedded Database SQLite and the Simulation of DD-WRT Router Program
SHEN Chun-jie
(College of Computer and Information Engineering, Hubei University, Wuhan, 430062)
In view of the need of router network security, a small database called SQLite was designed based on Linux operation, record all types of data related to network security, and C language programming was used. The characteristic network security database was established, which is based on the feature vector of the database to detect, intercept, turn, track and record, so that can achieve network security detection and protection functions. This research mainly aimed at the low end (part of the high end) of the router with DD-WRT technology. Through the embedded relational database and a variety of security function modules, to achieve the minimum cost of inputs to the router’s security performance on a high level of purpose.
network security;SQLite database;DD-WRT
2016-06-11
湖北省科技廳科技支撐項目資助(2014BAA089)
申純潔(1993-),女,湖北省隨州市人,碩士研究生,研究方向為智能系統(tǒng)、信息安全。
TP311.1
A
1674-344X(2016)08-0055-05