《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > 一種Web服務(wù)器安全機(jī)制的實(shí)現(xiàn)方法
一種Web服務(wù)器安全機(jī)制的實(shí)現(xiàn)方法
來源:微型機(jī)與應(yīng)用2012年第2期
陳偉東1, 劉 剛1, 徐 崢1, 耿坤英2
(1. 浪潮嘉信信息技術(shù)有限公司,北京100085;2. 清華大學(xué) 軟件學(xué)院, 北京100083)
摘要: 針對Web網(wǎng)站點(diǎn)的入侵事件不斷發(fā)生,現(xiàn)有的防火墻、IDS等設(shè)備都不能有效防止入侵者篡改網(wǎng)站中的網(wǎng)頁、盜取重要信息等攻擊,提出了Web服務(wù)器安全較完備機(jī)制,從核心層保證Web站點(diǎn)中的網(wǎng)頁不會被黑客篡改,惡意代碼在系統(tǒng)中不會肆意發(fā)作。該機(jī)制重構(gòu)了操作系統(tǒng)核心層權(quán)限訪問控制模型,對操作系統(tǒng)文件、注冊表、進(jìn)程和網(wǎng)絡(luò)等資源采用白名單規(guī)則,并采用多機(jī)制相結(jié)合的方式提高Web服務(wù)器的抗攻擊能力。
Abstract:
Key words :

摘  要: 針對Web網(wǎng)站點(diǎn)的入侵事件不斷發(fā)生,現(xiàn)有的防火墻、IDS等設(shè)備都不能有效防止入侵者篡改網(wǎng)站中的網(wǎng)頁、盜取重要信息等攻擊,提出了Web服務(wù)器安全較完備機(jī)制,從核心層保證Web站點(diǎn)中的網(wǎng)頁不會被黑客篡改,惡意代碼在系統(tǒng)中不會肆意發(fā)作。該機(jī)制重構(gòu)了操作系統(tǒng)核心層權(quán)限訪問控制模型,對操作系統(tǒng)文件、注冊表、進(jìn)程和網(wǎng)絡(luò)等資源采用白名單規(guī)則,并采用多機(jī)制相結(jié)合的方式提高Web服務(wù)器的抗攻擊能力。
關(guān)鍵詞: 服務(wù)器安全; 系統(tǒng)保護(hù)文件驅(qū)動; 網(wǎng)絡(luò)驅(qū)動

    隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,作為信息系統(tǒng)的核心設(shè)備,服務(wù)器的安全提升到了一個新的高度。服務(wù)器中存儲和處理的大量核心業(yè)務(wù)數(shù)據(jù),其安全性愈顯重要,傳統(tǒng)防病毒系統(tǒng)、防火墻、IDS等設(shè)備無法保證服務(wù)器系統(tǒng)高度保密和信息完整性要求。多核服務(wù)器的安全保障難度再增高,采用新的安全機(jī)制來提供Web服務(wù)器抵抗黑客和惡意代碼攻擊尤為重要。Web應(yīng)用必須有80和443端口,惡意用戶正是利用了這兩個端口執(zhí)行各種惡意操作:偷竊、操控、破壞Web應(yīng)用中重要信息。
    為透明提升Web服務(wù)器操作系統(tǒng)安全等級,最大程度地保證系統(tǒng)兼容性,本文通過對文件系統(tǒng)和網(wǎng)絡(luò)底層架構(gòu)的理解,結(jié)合對規(guī)則的成功運(yùn)用,實(shí)現(xiàn)了操作系統(tǒng)安全和網(wǎng)絡(luò)安全的有效結(jié)合。
1 原理與架構(gòu)
    系統(tǒng)分為驅(qū)動層和應(yīng)用層。驅(qū)動層包括一個文件過濾驅(qū)動程序和一個NDIS網(wǎng)絡(luò)防火墻驅(qū)動;應(yīng)用層包括一個應(yīng)用程序和與驅(qū)動交互的DLL。應(yīng)用層采用了WTL做界面,在驅(qū)動程序啟動時,讀取相應(yīng)的規(guī)則文件,包括文件規(guī)則(所有進(jìn)程對文件讀寫的規(guī)則和特殊進(jìn)程對文件讀寫的規(guī)則)。文件讀寫權(quán)限有禁用、只讀、正常讀寫等。
    計算機(jī)病毒發(fā)作時的行為一般有寫注冊表項、生成文件、遠(yuǎn)程線程注入等。安全防護(hù)驅(qū)動攔截系統(tǒng)服務(wù)調(diào)用,通過分析例程調(diào)用的參數(shù)得到文件、進(jìn)程等相關(guān)信息。系統(tǒng)服務(wù)調(diào)度表(SSDT)保存著本地系統(tǒng)服務(wù)的地址,可以定位函數(shù)的內(nèi)存地址。
     文件系統(tǒng)過濾驅(qū)動對Native API做截獲,對IoCreateFile做INLINE HOOK,在文件讀寫時根據(jù)函數(shù)參數(shù)和例程上下文信息得到相關(guān)文件全路徑和進(jìn)程相關(guān)信息。與加載到內(nèi)存中的文件規(guī)則做判斷。規(guī)則加載方法是開啟一個系統(tǒng)線程,在系統(tǒng)線程循環(huán)中判斷規(guī)則文件是否被修改。如果被修改,則重新加載規(guī)則文件到內(nèi)存。
    對注冊表的防護(hù),則是HOOK了ZwCreateKey、ZwDeleteKey、ZwEnumerateKey、ZwOpenKey等函數(shù)。在函數(shù)內(nèi)部得到操作的進(jìn)程全路徑和注冊路徑,與規(guī)則文件中的進(jìn)程名和注冊表路徑比較,如果符合規(guī)則,則采取規(guī)則文件中的動作對注冊表操作控制,文件動作規(guī)則包括禁用、只讀結(jié)合進(jìn)程名的對比,只有進(jìn)程名和文件名與規(guī)則中的進(jìn)程名和文件名完全相同時,執(zhí)行規(guī)則內(nèi)相應(yīng)的禁用和只讀動作等。
    進(jìn)程和進(jìn)程保護(hù)采用對ZwOpenProcess的HOOK方法實(shí)現(xiàn)。在截獲的ZwOpenProcess例程內(nèi),得到進(jìn)程ID。把進(jìn)程ID與內(nèi)存規(guī)則鏈表中的保護(hù)進(jìn)程的ID作對比。如果是需要保護(hù)進(jìn)程的ID,則返回?zé)o效句柄。進(jìn)程注入多數(shù)采用CreateRemoteThread方法,在應(yīng)用層采用WriteProcessMemory函數(shù)。在核心層則是NtCreateThread例程和ZwWriteVirtualMemory例程。防止復(fù)制句柄則是在驅(qū)動層截獲ZwDuplicateObject例程。進(jìn)程保護(hù)的最低層可采用KiInsertQueueApc方法的截獲來實(shí)現(xiàn)。目前較為高級的進(jìn)程保護(hù)都采用KiInsertQueueApc方法實(shí)現(xiàn),如XueTr等。圖1為服務(wù)器Web安全系統(tǒng)序列圖。

    對64位操作系統(tǒng)(Windows Vista 和Windows 2008 Server)等,由于操作系統(tǒng)采取了對內(nèi)核保護(hù)的措施(PatchGuard技術(shù)),其內(nèi)核被鎖定了,任何第三方軟件都無法對其進(jìn)行修改。SSDT HOOK在64位操作系統(tǒng)上失效。
    采用微軟WDK開發(fā)包提供minifilter框架,對文件權(quán)限的修改在IRP_MJ_CREATE內(nèi)進(jìn)行截獲,對于只讀文件,如果規(guī)則比較發(fā)現(xiàn)其是需要進(jìn)行權(quán)限修改的只讀文件,有WRITE的標(biāo)記,則修改為GENERIC_READ標(biāo)記。對需要禁用的文件,則在IRP_MJ_CREATE的后處理(PostCreate)例程內(nèi)采用FltCancelFileOpen對相應(yīng)的文件禁用。
   在網(wǎng)絡(luò)安全方面采用NDIS低層技術(shù)構(gòu)建網(wǎng)絡(luò)防火墻,提供網(wǎng)絡(luò)層訪問控制和攻擊保護(hù)服務(wù)。統(tǒng)一部署在Web應(yīng)用的前端。網(wǎng)絡(luò)防火墻是整個Web應(yīng)用安全體系結(jié)構(gòu)的一個組件,防御網(wǎng)絡(luò)層黑客攻擊(網(wǎng)絡(luò)掃描、telnet等),阻止蠕蟲的傳播。
2 文件和注冊表訪問權(quán)限研究與實(shí)現(xiàn)
    文件訪問控制采用Inline Hook方法,對IoCreateFile做截獲。文件規(guī)則包括文件全路徑名、打開文件的進(jìn)程名、訪問權(quán)限(只讀、禁用、正常使用等)等多元參數(shù)組。在截獲函數(shù)內(nèi),首先根據(jù)參數(shù)和上下文得到文件全路徑名。然后得到進(jìn)程名。與內(nèi)存規(guī)則內(nèi)的文件和進(jìn)程名對比,如果符合則根據(jù)規(guī)則中的動作對文件只讀、禁用等操作。如果不符合,則采取默認(rèn)動作。驅(qū)動內(nèi)部需要得到保護(hù)進(jìn)程的列表和進(jìn)程ID等。進(jìn)程加載通知(PsSetCreateProcessNotifyRoutine);DLL或驅(qū)動加載通知(PsSetLoadImageNotifyRoutine);低層驅(qū)動維護(hù)著活動進(jìn)程鏈表和文件、進(jìn)程、注冊表規(guī)則鏈表等。圖2為文件網(wǎng)絡(luò)驅(qū)動與應(yīng)用層關(guān)系序列圖。

 

 

    Web服務(wù)器的安全需要考慮到Web服務(wù)應(yīng)用程序的安全,包括遠(yuǎn)程線程的防止注入、復(fù)制句柄、遠(yuǎn)程內(nèi)存讀寫、子進(jìn)程創(chuàng)建的預(yù)防和判斷等。遠(yuǎn)程線程注入通過CreateRemoteThread實(shí)現(xiàn),需要調(diào)用WriteVirtualMemory等函數(shù),在內(nèi)核層則是調(diào)用ZwWriteVirtualMemory。ZwWriteVirtualMemory是在NTDLL.DLL中導(dǎo)出的,在驅(qū)動內(nèi)得到NTDLL.DLL的地址,然后得到相應(yīng)導(dǎo)出函數(shù)ZwWriteVirtualMemory地址。截獲地址后,在截獲函數(shù)內(nèi)判斷進(jìn)程ID號是否是在進(jìn)程保護(hù)列表中的進(jìn)程,如是則返回STATUS_ACCESS_DENIED。
    驅(qū)動底層的難點(diǎn)主要有文件只讀、禁用規(guī)則,結(jié)合進(jìn)程規(guī)則的對比,以及規(guī)則文件的設(shè)計和在內(nèi)存中與進(jìn)程和文件名的對比。驅(qū)動層原來對文件對比采用SSDT HOOK方法,攔截ZwOpenfile和ZwCreateFile函數(shù),后來改用了一個函數(shù),采用了Inline Hook加匯編的方式,簡化了對函數(shù)的比較,收到了比較好的效果。對注冊表的規(guī)則和禁用,采用了Regmon中的方法,在注冊表相應(yīng)的函數(shù)內(nèi)得到注冊表的訪問全名,與注冊表規(guī)則進(jìn)行比較,采取相應(yīng)的禁用等方法。
     規(guī)則文件加上只讀等控制后,對規(guī)則的判斷首先需要對進(jìn)程名進(jìn)行判斷,是否符合規(guī)則中的進(jìn)程名。判斷符合后,再對文件名進(jìn)行規(guī)則判斷,如果文件名相同,則按規(guī)則文件中數(shù)據(jù)結(jié)構(gòu)對文件做只讀和禁用等對復(fù)制句柄的禁止。
    在64位服務(wù)器系統(tǒng)上,需要對驅(qū)動進(jìn)行簽名。Minifilter架構(gòu)可在32位和64位操作系統(tǒng)上運(yùn)行。可運(yùn)行的系統(tǒng)包括WindowsXP、Windows 2003、Windows2008 Server 64位等。在64位多核系統(tǒng)中需要調(diào)整一些不兼容的函數(shù)。
    驅(qū)動難點(diǎn)還有在多核服務(wù)器上的驅(qū)動例程,如自旋鎖(SPIN LOCK)的獲取等,遇到了數(shù)次BSOD.都是多核鎖造成的,多核下要用KeAcquireInStackQueuedSpinLock.如果不想改動IRQL,只能用資源鎖(ERESOURCE)了。
3 服務(wù)器Web安全數(shù)據(jù)結(jié)構(gòu)和接口方案
    用戶接口主要是應(yīng)用層的程序與驅(qū)動進(jìn)行DeviceIoControl 交互,應(yīng)用程序啟動時,需要與驅(qū)動程序會話,調(diào)用相應(yīng)的函數(shù)。還有應(yīng)用層需要定時與驅(qū)動層查詢得到相關(guān)的日志。
    //驅(qū)動層與應(yīng)用層應(yīng)答IoControl
    #define IOCTL_REPLY_USERLAND_REQUEST    
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_
        BUFFERED,FILE_ANY_ACCESS)
    //對規(guī)則文件加密和解密IoControl
    #define IOCTL_RULEFILE_ENCRYPT            
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_
        BUFFERED, FILE_ANY_ACCESS)
    //得到系統(tǒng)運(yùn)行日志IoControl
    #define IOCTL_DPROTECT_GETLOG            
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_
        BUFFERED, FILE_ANY_ACCESS)
    //應(yīng)用層與驅(qū)動層通信EVENT
    #define IOCTL_REG_EVENT    
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_
        BUFFERED, FILE_ANY_ACCESS)
    //日志記錄數(shù)據(jù)結(jié)構(gòu)
    typedef struct _LOG_RECORD {
        ULONG        Length;
        ULONG        SequenceNumber;
        RULE_TYPE    LogType;
        ULONG        uWhat;
        LARGE_INTEGER    origTime;
        CHAR        Name[0];
    } LOG_RECORD, *PLOG_RECORD;
     //規(guī)則類型  
    typedef enum _RuleType
    {
        RULE_FILE = 0,                  //文件規(guī)則類型
        RULE_DIRECTORY,                    //文件路徑類型
        RULE_REGISTRY,                             //注冊表規(guī)則
        RULE_SECTION,
        RULE_PROTECT,                      //需要保護(hù)的進(jìn)程
        RULE_REGPROCESS,   //與注冊表規(guī)則對應(yīng)的進(jìn)程
        RULE_FILEPROCESS,      //與文件規(guī)則對應(yīng)的進(jìn)程
        RULE_NETWORK,
             }RULE_TYPE;
         //進(jìn)程規(guī)則結(jié)構(gòu)
    typedef struct _PROCRULE
    {
        ULONG    nId;
        CHAR    procName[PROCNAMELEN];
        short    nRuleType;
        DWORD    Reserved;
    } PROCRULE, *PPROCRULE;
    //注冊表規(guī)則
    typedef struct _REGRULE
    {
        ULONG nId;
        CHAR  procName[PROCNAMELEN];
        short    nRuleType;
    } REGRULE, *PREGRULE;
    //注冊表進(jìn)程規(guī)則
    typedef struct _REGPROCRULE
    {
        ULONG  nId;
        CHAR  procName[PROCNAMELEN];
        short    nRuleType;
    } REGPROCRULE, *PREGPROCRULE;
    //文件規(guī)則數(shù)據(jù)結(jié)構(gòu)
    typedef struct _FILERULE
    {
        ULONG    nId;
        ULONG    nReadWrite;
        CHAR    procName[PROCNAMELEN];
        short    nRuleType;
        BOOLEAN    bDirectory;
    } FILERULE, PFILERULE;
    //過濾規(guī)則結(jié)構(gòu)
    typedef struct _FLTRULE
    {
        struct FLTRULE    *next;
        int    ruleLine;
        int    nAction;
        BOOLEAN bLog;
        enum RULE_TYPE    ruleType;
        union {
            struct _PROCRULE      procRule;
            struct _REGRULE      regRule;
            struct _FILERULE      fileRule;         //文件規(guī)則
            struct _PROCRULE       protectRule;
                                                             //禁止用任務(wù)管理器結(jié)束進(jìn)程
            struct _REGPROCRULE   regProcrule;
        }Rule;
    } FLTRULE, *PFLTRULE;
     Minifilter應(yīng)用層和驅(qū)動層的通信方案是在應(yīng)用層采用FilterConnectCommunicationPort建立通信端口的連接。然后初始化相關(guān)參數(shù)數(shù)據(jù),創(chuàng)建日志查詢線程。用FilterSendMessage例程查詢驅(qū)動內(nèi)日志信息。
    經(jīng)過測試人員詳細(xì)測試和客戶現(xiàn)場應(yīng)用,本系統(tǒng)達(dá)到了良好的應(yīng)用效果,從驅(qū)動層到應(yīng)用層都運(yùn)行良好。目前系統(tǒng)支持32位和64位服務(wù)器系統(tǒng),對服務(wù)器安全要求較高的企事業(yè)單位有比較好的保障作用。
參考文獻(xiàn)
[1] 耿玉波,夏魯寧,杜皎,等.一種Web服務(wù)器安全機(jī)制的 研究與實(shí)現(xiàn)[J],計算機(jī)工程,2006(11):189-191.
[2] NAGAR R. Windows NT file system internals[EB/OL].[2007-04-01].http://download.csdn.net/source/168266.
[3] RUSSINOVICH M E, SOLOMON D A. Microsoft windows  Internals. Fourth Edition[M]. Microsoft Press, 2007.
[4] 湯方澄,楊小虎,董金祥.基于智能Agent的網(wǎng)絡(luò)安全監(jiān)控系統(tǒng)的研究[J].計算機(jī)工程,2002,28(12):63-65.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
主站蜘蛛池模板: 青青青爽在线视频观看| 亚洲精彩视频在线观看| 亚洲六月丁香婷婷综合| 在线无码午夜福利高潮视频| 亚洲三级小视频| 绝美女神抬臀娇吟| 国产午夜精品无码| 99久久人妻无码精品系列蜜桃| 成人欧美一区二区三区在线观看| 亚洲欧美日韩在线观看播放| 粉嫩被粗大进进出出视频| 国产无遮挡又黄又爽高清视| 777xxxxx欧美| 天天天天躁天天爱天天碰2018 | 亚洲精品国产精品国自产观看| 精品久久久久久中文字幕女 | 欧美亚洲人成网站在线观看| 周妍希美乳三点尽露四季图片| 香蕉视频免费在线播放| 国产欧美一区二区三区在线看| sss欧美一区二区三区| 最后一夜无删减版在线观看| 亚洲图片第一页| 欧美精品一区二区三区视频| 国产91小视频| 西西人体www44rt大胆高清| 天海翼视频在线| 一级成人黄色片| 成人毛片免费观看视频| 久久久久久一品道精品免费看| 欧美日本免费一区二区三区| 午夜视频高清在线aaa| 麻豆国产一区二区在线观看| 国产精品久久福利网站| а√天堂资源地址在线官网| 怡红院国产免费| 久久婷婷人人澡人人爱91| 最好看最新日本中文字幕| 亚洲av无码久久寂寞少妇| 狠狠色狠狠色综合日日不卡| 国产99在线a视频|