專利名稱:跨安全區(qū)數(shù)據(jù)庫備份方法
技術(shù)領(lǐng)域:
本發(fā)明涉及的領(lǐng)域包括數(shù)據(jù)庫操作、數(shù)據(jù)安全。
背景技術(shù):
自網(wǎng)絡(luò)誕生以來,安全問題如影隨行。對于一些為公眾提供服務(wù)的企業(yè),安全問題顯得尤為重要。例如,電力、電信、鐵路交通等等。這些行業(yè)的企業(yè)都有一個非常重要的特點所從事的行業(yè)涉及公共安全。為了避免大范圍停電、通信中斷、交通中斷等公共安全事故,有必要對涉及運營管理的設(shè)備做特別的專門的保護,即,將這些設(shè)備脫離公共網(wǎng)絡(luò),在企業(yè)內(nèi)建立獨立于公共網(wǎng)絡(luò)、安全的內(nèi)部網(wǎng)絡(luò)。我們稱這樣的網(wǎng)絡(luò)為內(nèi)網(wǎng),內(nèi)網(wǎng)組成的區(qū)域稱為安全區(qū),相應(yīng)地公共網(wǎng)絡(luò)簡稱為公網(wǎng)或外網(wǎng)。一個大型的企業(yè)內(nèi),可能建立多個 這樣的內(nèi)網(wǎng),多個內(nèi)網(wǎng)組成多個安全區(qū)。出于安全的考慮,內(nèi)網(wǎng)與公網(wǎng)之間,內(nèi)網(wǎng)與內(nèi)網(wǎng)之間,物理隔離,即無法建立TCP、UDP連接,無法傳送IP數(shù)據(jù)包,特別是限制實時通信。這些企業(yè)在雖然內(nèi)部建立了安全網(wǎng)絡(luò),但卻無法脫離公網(wǎng),因為直接面向公眾服務(wù)的業(yè)務(wù)必須掛接在公網(wǎng)上。例如,用戶數(shù)據(jù)用戶信息、用戶業(yè)務(wù)、用戶賬單等必須掛在公網(wǎng)上。這些掛接在公網(wǎng)上的數(shù)據(jù),容易遭受黑客攻擊和破壞,這些數(shù)據(jù)有必要及時地備份到內(nèi)網(wǎng)上,以保證當公網(wǎng)上的數(shù)據(jù)庫數(shù)據(jù)被異常破壞時能夠正?;謴?。為了便于管理員將這些公網(wǎng)數(shù)據(jù)備份到內(nèi)網(wǎng)上,現(xiàn)有技術(shù)是在公網(wǎng)和內(nèi)網(wǎng)之間開辟一條安全通道。在這安全通道上,通過諸多的限制保證安全,比如,不能傳送IP數(shù)據(jù)報文,數(shù)據(jù)傳輸只是單向的。例如,申請?zhí)枮?01110128834. 7的發(fā)明申請案公開了一種安全傳輸設(shè)備,通過硬件方法實現(xiàn)單向性傳輸,使得公網(wǎng)的數(shù)據(jù)可以傳到內(nèi)網(wǎng),而內(nèi)網(wǎng)的數(shù)據(jù)無法傳到公網(wǎng)上。但在這種環(huán)境下,傳統(tǒng)的數(shù)據(jù)庫備份的方法不能將公網(wǎng)的數(shù)據(jù)庫內(nèi)容備份到內(nèi)網(wǎng)上,因而需要采用特殊的方法。
發(fā)明內(nèi)容
本發(fā)明所要解決的問題是將公網(wǎng)的數(shù)據(jù)庫內(nèi)容備份到內(nèi)網(wǎng)上。為解決上述問題,本發(fā)明采用的方案為
跨安全區(qū)數(shù)據(jù)庫備份方法,包括源數(shù)據(jù)庫、目標數(shù)據(jù)庫、安全通道;其中,源數(shù)據(jù)庫位于外網(wǎng)的服務(wù)器上;目標數(shù)據(jù)庫位于內(nèi)網(wǎng)的服務(wù)器上;安全通道是用于從外網(wǎng)向內(nèi)網(wǎng)傳輸數(shù)據(jù)的安全數(shù)據(jù)通信通路,具有絕對的安全性。為便于說明,本說明書中所稱的源服務(wù)器為位于外網(wǎng),用于存放源數(shù)據(jù)庫的服務(wù)器;本說明書所稱的目標服務(wù)器為位于內(nèi)網(wǎng),用于存放目標數(shù)據(jù)庫的服務(wù)器。其方法包括如下步驟
S100、捕獲源數(shù)據(jù)庫操作記錄;
S200、將捕獲的數(shù)據(jù)庫操作記錄轉(zhuǎn)換成格式化操作記錄;
S300、將格式化操作記錄通過安全通道傳輸?shù)絻?nèi)網(wǎng);
S400、將格式化操作記錄轉(zhuǎn)換成數(shù)據(jù)庫操作記錄;
S500、在目標數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)庫操作記錄中的數(shù)據(jù)庫操作。前述的格式化操作記錄是指符合用于安全通道傳輸數(shù)據(jù)格式的數(shù)據(jù)。目標數(shù)據(jù)庫為備份數(shù)據(jù)庫。本發(fā)明的技術(shù)效果是顯而易見地,將公網(wǎng)的數(shù)據(jù)庫內(nèi)容安全的備份到內(nèi)網(wǎng)上,以便在公網(wǎng)數(shù)據(jù)庫遭受異常破壞時得以恢復。
圖I為本發(fā)明網(wǎng)絡(luò)拓撲結(jié)構(gòu)示意圖。
具體實施例方式下面結(jié)合附圖,對本發(fā)明做進一步詳細描述。如圖I所示,I為公網(wǎng),2為內(nèi)網(wǎng),3為源服務(wù)器,4為目標服務(wù)器,5為安全通道的連接,31為安全通道的發(fā)送裝置,41為安全通道的接收裝置。其中發(fā)送裝置31、接收裝置41以及連接5組成安全通道 。發(fā)送裝置31與源服務(wù)器3相連。接收裝置41與目標服務(wù)器4相連。發(fā)送裝置31可以是安裝在源服務(wù)器上的硬件設(shè)備,也可以是獨立的主機。發(fā)送裝置31安裝在源服務(wù)器上時,發(fā)送裝置31與源服務(wù)器3通過總線連接。發(fā)送裝置31為獨立主機時,發(fā)送裝置31和源服務(wù)器3之間的連接可以是一般的以太網(wǎng)連接。相應(yīng)地,接收裝置41可以是安裝在目標服務(wù)器上的硬件設(shè)備,也可以是獨立的主機。接收裝置41安裝在目標服務(wù)器上時,接收裝置41與目標服務(wù)器4通過總線連接。接收裝置41為獨立主機時,接收裝置41和目標服務(wù)器4之間的連接可以是一般的以太網(wǎng)連接。有關(guān)安全通道的發(fā)送裝置、接收裝置、連接以及步驟S300中將格式化操作記錄通過安全通道傳輸?shù)絻?nèi)網(wǎng),可以參考申請?zhí)枮?01110128834. 7的發(fā)明申請案。源服務(wù)器3包括有源數(shù)據(jù)庫。目標服務(wù)器4包括有目標數(shù)據(jù)庫。目標服務(wù)器4上的目標數(shù)據(jù)庫需要事先建立并且對其進行必要的配置。配置的內(nèi)容、比如,用戶與用戶權(quán)限、必要的數(shù)據(jù)表,必要的存儲過程等等。出于本領(lǐng)域技術(shù)人員眾所周知的原因,有關(guān)目標數(shù)據(jù)庫的建立和配置不再累述。本發(fā)明的方法步驟建立在上述的網(wǎng)絡(luò)拓撲和環(huán)境搭建的基礎(chǔ)上,歸納起來包括如下步驟
S100、捕獲源數(shù)據(jù)庫操作記錄;
S200、將捕獲的數(shù)據(jù)庫操作記錄轉(zhuǎn)換成格式化操作記錄;
S300、將格式化操作記錄通過安全通道傳輸?shù)絻?nèi)網(wǎng);
S400、將格式化操作記錄轉(zhuǎn)換成數(shù)據(jù)庫操作記錄;
S500、在目標數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)庫操作記錄中的數(shù)據(jù)庫操作。下面對上述每個步驟做詳細描述。一、捕獲源數(shù)據(jù)庫操作記錄之數(shù)據(jù)庫操作日志
捕獲源數(shù)據(jù)庫操作記錄的方法很多。最簡單的方法是通過查詢數(shù)據(jù)庫的操作日志。將源數(shù)據(jù)庫記載的數(shù)據(jù)庫操作日志作為源數(shù)據(jù)庫操作記錄。這種方法非常簡單,但存在一個問題,數(shù)據(jù)庫操作日志容易被管理員誤操作,比如,關(guān)閉數(shù)據(jù)庫操作日志的功能。在這種情況下,導致捕獲的源數(shù)據(jù)庫操作記錄是不完整的。二、捕獲源數(shù)據(jù)庫操作記錄之函數(shù)重新封裝捕獲源數(shù)據(jù)庫操作記錄也可以通過函數(shù)重新封裝的方法來實現(xiàn)。即將數(shù)據(jù)庫處理的所有函數(shù)重新封裝。例如,ExecSQL(string sSQL)函數(shù)重新封裝成rExecSQL(string sSQL),封裝后的rExecSQL參數(shù)與原函數(shù)ExecSQL完全相同,不過在函數(shù)內(nèi)加入操作記錄的代碼。下面是rExecSQL重封裝后函數(shù)的示例代碼int rExecSQL(string sSQL)
{
int result = ExecSQL (sSQL);if (result>0 && IsSQLCatching())
{ Il處于數(shù)據(jù)庫操作記錄狀態(tài)并且數(shù)據(jù)庫操作成功CatchSQL (sSQL) ; //捕獲數(shù)據(jù)庫操作記錄
}
return result;
}
或者,該示例代碼可以寫成 int rExecSQL(string sSQL)
{
CatchSQL (sSQL) ;//捕獲數(shù)據(jù)庫操作記錄
return ExecSQL (sSQL);
}
前示例代碼只有在數(shù)據(jù)庫操作成功時,才記錄數(shù)據(jù)庫操作。而后者是不管數(shù)據(jù)庫操作是否能夠成功或失敗,都記錄數(shù)據(jù)庫的操作記錄。后者是建立再備份數(shù)據(jù)庫或目標數(shù)據(jù)庫在執(zhí)行SQL之前內(nèi)容完全相同,假如在源數(shù)據(jù)庫執(zhí)行失敗,則在目標數(shù)據(jù)庫執(zhí)行同樣的SQL也一樣會失敗,假如在源數(shù)據(jù)庫執(zhí)行成功,則在目標數(shù)據(jù)庫執(zhí)行同樣的SQL也必然成功。封裝后的數(shù)據(jù)庫處理函數(shù)可以通過宏替換解決現(xiàn)有軟件程序的兼容性問題,比如上述的原函數(shù)ExecSQL與封裝函數(shù)rExecSQL下,做如下定義
#define ExecSQL (sql) rExecSQL(sql)
本領(lǐng)域人員應(yīng)該知道,這種代碼級的替代封裝方法在C語言中是非常常用的技術(shù)手段,不再累述。三、捕獲源數(shù)據(jù)庫操作記錄之進程注入函數(shù)
在windows系統(tǒng)中,捕獲源數(shù)據(jù)庫操作記錄還可以通過遠程進程注入的方法替換現(xiàn)有的數(shù)據(jù)庫處理函數(shù)。這種方法的好處是,不改變現(xiàn)有的應(yīng)用程序。首先編寫一個動態(tài)鏈接庫。假設(shè)這個這個動態(tài)鏈接庫為mySQL. dll,原包含數(shù)據(jù)庫處理函數(shù)的動態(tài)連接庫為”SQL.dll”。mySQL. dll編譯完成后放在c: \windows\system32\目錄下。原動態(tài)鏈接庫SQL.dll中包含被替代數(shù)據(jù)庫處理函數(shù)ExecSQL。mySQL.dll中包含替代現(xiàn)有數(shù)據(jù)庫處理函數(shù)rExecSQL,并在啟動該動態(tài)連接庫時執(zhí)行替換現(xiàn)有數(shù)據(jù)庫處理函數(shù)的操作。UmySQL動態(tài)鏈接庫載入時的DllMain函數(shù)中執(zhí)行替換操作,示例代碼如下 HANDLE hProc; //注入到指定進程之后的進程句柄
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ulcall, LPVOID IpResed)
{ switch (ulcall) { case DLL_PROCESS_ATTACH: {hProc =GetCurrentProcessO ;
installHookSQL() ; //安裝數(shù)據(jù)庫處理函數(shù)的鉤子函數(shù)break;
}
default: break; } return TRUE; }
2、inStallH00kSQL函數(shù)中在原 數(shù)據(jù)庫處理函數(shù)開始添加遠程轉(zhuǎn)跳操作,轉(zhuǎn)跳到替代現(xiàn)有數(shù)據(jù)庫處理函數(shù)rExecSQL中。其示例代碼如下typedef int (^pExecSQL) (const char*szSQL); pExecSQL oIdExecSQL=NULL;
BYTE btOldBytes[5]; BYTE btNewBytes[5]; void installHookSQL() {
DWORD iRead;
HANDLE hModule = GetModuleHandle ( “SQL dll”); //獲取原數(shù)據(jù)庫 dll oldExecSQL = (pExecSQL)GetProcAddress(hModule,"ExecSQL"); ReadProcessMemory(hProc, oldExecSQL, btOldBytes, 5,&iRead); btNewBytes
= 0xE9;
—asm {
lea eax, rExecSQLmoV ebx,oldExecSQLsub eax, ebxsub eax, 5
moV dword ptr[btNewBytes+1], eax
}
WriteProcessMemory(hProc, oldExecSQL, btNewBytes, 5,&iRead);
}
3、替代現(xiàn)有數(shù)據(jù)庫處理函數(shù)rExecSQL中包括捕獲數(shù)據(jù)庫操作代碼,示例代碼如下 int —stdcall rExecSQL (const char 氺 szSQL)
{
int result;
DWORD iRead;
CatchSQL (szSQL) ; //捕獲數(shù)據(jù)庫操作
//執(zhí)行原數(shù)據(jù)庫處理函數(shù)的操作,執(zhí)行前恢復原函數(shù),執(zhí)行完成后重新安裝替換WriteProcessMemory(hProc, oldExecSQL, btOldBytes, 5,&iRead);result = oldExecSQL(szSQL);
WriteProcessMemory(hProc, oldExecSQL, btNewBytes, 5,&iRead);return result; }
4、將c:\windows\system32\mySQL. dll進程注入到遠程進程的示例代碼如下
DWORD pid = O;
char * szPath=” c:\\windows\\system32\\mySQL. dll” ;//被注入動態(tài)鏈接庫路徑 DWORD dwSize = strlen (szPath)+1;pid = FindRemoteProcessID O ; //查找和搜索數(shù)據(jù)庫操作進程IDH 全權(quán)打開該進程 HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
Il遠程申請申請一塊內(nèi)存以便寫入被注入動態(tài)鏈接庫路徑
HANDLE IpData=VirtualAllocEx(hProc, NULL, dwSize, MEM_COMMIT, PAGE_READffRITE); DWORD dwffrite = 0;
Il將被注入動態(tài)鏈接庫路徑寫入遠程進程WriteProcessMemory (hProc, IpData, szPath,dwSize, &dwSize);
Il在遠程進行內(nèi)創(chuàng)建線程執(zhí)行載入mySQL的操作HANDLE hThread = CreateRemoteThread (hProc, NULL, O,(LPTHREAD_START_ROUTINE) LoadLibrary, // 載入動態(tài) 鏈接庫IpData, O, NULL);......
經(jīng)過上述方法處理后,每一次任何應(yīng)用程序調(diào)用數(shù)據(jù)庫操作函數(shù)ExecSQL時,都會轉(zhuǎn)跳到替換數(shù)據(jù)庫函數(shù)rExecSQL中,通過在rExecSQL中添加的CatchSQL捕獲函數(shù)捕獲數(shù)據(jù)庫操作。四、格式化操作記錄的轉(zhuǎn)化
步驟S200中,將捕獲的數(shù)據(jù)庫操作記錄轉(zhuǎn)化成格式化操作記錄。格式化操作記錄的轉(zhuǎn)化包括兩個步驟第一是在捕獲的數(shù)據(jù)庫操作記錄中添加時標信息;第二是將數(shù)據(jù)庫操作記錄轉(zhuǎn)化成適合安全通道傳輸?shù)臄?shù)據(jù)格式。數(shù)據(jù)庫操作記錄因為有前后關(guān)系的限制,所以需要添加時標信息,時標信息可以是序號。比如第一條數(shù)據(jù)庫操作記錄的時標為1,第二條數(shù)據(jù)庫操作記錄的時標為2,以此類推。如前所述,安全通道傳輸?shù)臄?shù)據(jù)格式上有限制。比如,有的安全通道只能傳輸文本文件,而數(shù)據(jù)庫操作記錄中通常包含二進制的數(shù)據(jù),比如圖像數(shù)據(jù)。這種情況下需要將圖像數(shù)據(jù)也轉(zhuǎn)化成文本格式。轉(zhuǎn)化成文本格式的算法可以采用Base64算法。轉(zhuǎn)化成文本格式的數(shù)據(jù)庫操作記錄傳輸?shù)絻?nèi)網(wǎng)后,在目標數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)庫操作記錄前,需要將格式化操作記錄恢復成數(shù)據(jù)庫操作記錄,于是就有了步驟400中將格式化操作記錄轉(zhuǎn)換成數(shù)據(jù)庫操作記錄。五、數(shù)據(jù)庫操作記錄的過濾
數(shù)據(jù)庫操作記錄中,有插入、刪除、修改、查詢操作。而查詢操作并不修改數(shù)據(jù)庫內(nèi)容,因而在數(shù)據(jù)庫備份時,查詢操作可以忽略,從而減少安全通道傳輸?shù)臄?shù)據(jù)量。為此需要為數(shù)據(jù)庫操作記錄做一定的過濾。過濾操作可以在捕獲數(shù)據(jù)庫操作記錄時進行,即在步驟SlOO中進行,也可以在數(shù)據(jù)庫轉(zhuǎn)化成格式化操作記錄時即步驟S200中進行。六、在目標數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)庫操作
步驟400中得到恢復的數(shù)據(jù)庫操作記錄后,可以根據(jù)記錄中的時標,按順序重新執(zhí)行數(shù)據(jù)庫操作。如此完成數(shù)據(jù)庫內(nèi)容的備份。
權(quán)利要求
1.跨安全區(qū)數(shù)據(jù)庫備份方法,其特征在于,包括源數(shù)據(jù)庫、目標數(shù)據(jù)庫、安全通道;其中,源數(shù)據(jù)庫位于外網(wǎng)的服務(wù)器上;目標數(shù)據(jù)庫位于內(nèi)網(wǎng)的服務(wù)器上;安全通道是用于從外網(wǎng)向內(nèi)網(wǎng)傳輸數(shù)據(jù)的安全數(shù)據(jù)通信通路; 其方法包括如下步驟 S100、捕獲源數(shù)據(jù)庫操作記錄; S200、將捕獲的數(shù)據(jù)庫操作記錄轉(zhuǎn)換成格式化操作記錄; S300、將格式化操作記錄通過安全通道傳輸?shù)絻?nèi)網(wǎng); S400、將格式化操作記錄轉(zhuǎn)換成數(shù)據(jù)庫操作記錄; S500、在目標數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)庫操作記錄中的數(shù)據(jù)庫操作。
2.如權(quán)利要求I所述的跨安全區(qū)數(shù)據(jù)庫備份方法,其特征在于,所述的步驟SlOO中,捕獲源數(shù)據(jù)庫操作記錄是將源數(shù)據(jù)庫記載的數(shù)據(jù)庫操作日志作為源數(shù)據(jù)庫操作記錄。
3.如權(quán)利要求I所述的跨安全區(qū)數(shù)據(jù)庫備份方法,其特征在于,所述的步驟SlOO中,捕獲源數(shù)據(jù)庫操作記錄是將數(shù)據(jù)庫處理的所有函數(shù)重新封裝。
4.如權(quán)利要求I所述的跨安全區(qū)數(shù)據(jù)庫備份方法,其特征在于,所述的步驟SlOO中,捕獲源數(shù)據(jù)庫操作記錄是通過遠程進程注入的方法。
5.如權(quán)利要求I所述的跨安全區(qū)數(shù)據(jù)庫備份方法,其特征在于,所述的步驟S200中,包括添加數(shù)據(jù)庫操作記錄時標的步驟。
6.如權(quán)利要求I所述的跨安全區(qū)數(shù)據(jù)庫備份方法,其特征在于,所述的步驟SlOO中,包括數(shù)據(jù)庫操作記錄過濾的步驟。
7.如權(quán)利要求I所述的跨安全區(qū)數(shù)據(jù)庫備份方法,其特征在于,所述的步驟S200中,包括數(shù)據(jù)庫操作記錄過濾的步驟。
全文摘要
本發(fā)明公開了一種跨安全區(qū)數(shù)據(jù)庫備份方法,包括源數(shù)據(jù)庫、目標數(shù)據(jù)庫、安全通道。其中,源數(shù)據(jù)庫位于外網(wǎng)的服務(wù)器上;目標數(shù)據(jù)庫位于內(nèi)網(wǎng)的服務(wù)器上;安全通道是用于從外網(wǎng)向內(nèi)網(wǎng)傳輸數(shù)據(jù)的安全數(shù)據(jù)通信通路。其方法包括步驟捕獲源數(shù)據(jù)庫操作記錄;將捕獲的數(shù)據(jù)庫操作記錄轉(zhuǎn)換成格式化操作記錄;將格式化操作記錄通過安全通道傳輸?shù)絻?nèi)網(wǎng);將格式化操作記錄轉(zhuǎn)換成數(shù)據(jù)庫操作記錄;在目標數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)庫操作記錄中的數(shù)據(jù)庫操作。其中,捕獲源數(shù)據(jù)庫操作記錄可以通過數(shù)據(jù)庫操作日志或者將數(shù)據(jù)庫處理的所有函數(shù)重新封裝或者通過遠程進程注入的方法實現(xiàn)。本發(fā)明實現(xiàn)了從外網(wǎng)到內(nèi)網(wǎng)的數(shù)據(jù)庫安全備份。
文檔編號G06F11/14GK102968479SQ201210467090
公開日2013年3月13日 申請日期2012年11月19日 優(yōu)先權(quán)日2012年11月19日
發(fā)明者陳國恩, 羅定志, 張 杰 申請人:嘉興電力局