大數(shù)據(jù)網(wǎng)站攻擊實(shí)時(shí)項(xiàng)目架構(gòu)

?????????????????????????????????? 大數(shù)據(jù)網(wǎng)站攻擊實(shí)時(shí)項(xiàng)目架構(gòu)
??????? 隨著互聯(lián)網(wǎng)的流行,網(wǎng)站安全問題就日益突出,但絕大多數(shù)的網(wǎng)站開發(fā)與建設(shè)公司只考慮正常用戶的穩(wěn)定使用,而對(duì)于網(wǎng)站安全方面了解甚少,發(fā)現(xiàn)網(wǎng)站安全存在問題和漏洞,其修補(bǔ)方式只能停留在頁(yè)面代碼的刪除或者是恢復(fù)網(wǎng)站備份,很難針對(duì)網(wǎng)站具體的漏洞原理對(duì)源代碼進(jìn)行修復(fù)。但黑客對(duì)漏洞具有敏銳的洞察力,網(wǎng)站存在的這些漏洞就會(huì)被挖掘出來,成為黑客們直接或間接獲取利益的機(jī)會(huì)。
??????? 不過,每一個(gè)網(wǎng)站的攻擊都離不開網(wǎng)站文件的修改。隨時(shí)監(jiān)控網(wǎng)站文件的修改,當(dāng)網(wǎng)站文件發(fā)生修改就進(jìn)行安全問題的提醒,是這個(gè)項(xiàng)目的必要性。
??????? 首先,要解決的是如何監(jiān)控一個(gè)網(wǎng)站的修改。
??????? 一、監(jiān)控文件變化的相關(guān)信息。
??????? 一般服務(wù)器采用的都是linux系統(tǒng),在linux系統(tǒng)中需要安裝inotify-tools,這個(gè)第三方模塊可以不殺死進(jìn)程的基礎(chǔ)上進(jìn)行文件內(nèi)容方面的監(jiān)控。

?????? 安裝成功后,可以使用命令inotifywait來監(jiān)控文件內(nèi)容的修改,inotifywait攜帶的參數(shù)如下。

??????? 結(jié)合于mqr參數(shù),可以不殺死進(jìn)程,持續(xù)監(jiān)聽文件內(nèi)容是否發(fā)生變化,然后再通過timefmt進(jìn)行發(fā)生時(shí)間的格式化,format格式化命令可以指定inotifywait按照指定的格式輸出內(nèi)容。
?????? 通過命令inotifywait -mqr --timefmt “%d/%m/%y %H:%M:%S” --format “%T %w %f %e” -e modify,delete,create,attrib /home/data”。

???????? 這里可以把timefmt中輸入中文“年月日”。

??????? 從圖中可以看出,當(dāng)有文件發(fā)生修改,就會(huì)在控制臺(tái)產(chǎn)生變化的信息,并且不殺死進(jìn)程,一直在持續(xù)監(jiān)聽文件內(nèi)容的變化?,F(xiàn)在,帶來的問題就是如何把這個(gè)持續(xù)不斷的信息使用一種方式收集到某個(gè)存儲(chǔ)區(qū)域,然后通過大數(shù)據(jù)技術(shù)手段進(jìn)行分析,為了保證信息收集的持續(xù)性和不間斷性,同時(shí)也要保證信息的不丟失。這里使用flume+kafka的大數(shù)據(jù)技術(shù)手段保證信息發(fā)送的實(shí)時(shí)性和準(zhǔn)確性。
二、flume+kafka架構(gòu)收集網(wǎng)站文件監(jiān)控的內(nèi)容變化
?????? flume 作為 cloudera 開發(fā)的實(shí)時(shí)日志收集系統(tǒng),受到了業(yè)界的認(rèn)可與廣泛應(yīng)用。flume是一個(gè)分布式、可靠、和高可用的海量日志采集、聚合和傳輸?shù)南到y(tǒng)。支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時(shí),F(xiàn)lume提供對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理。flume的核心組件包括source、channel和sink。
??????? Source捕獲事件后會(huì)進(jìn)行特定的格式化,然后Source會(huì)把事件推入(單個(gè)或多個(gè))Channel中。你可以把Channel看作是一個(gè)緩沖區(qū),它將保存事件直到Sink處理完該事件。
?????? flume的sink需要下沉到kafka隊(duì)列,kafka是一個(gè)分布式的基于發(fā)布訂閱模式的消息隊(duì)列,主要用于大數(shù)據(jù)實(shí)時(shí)處理靈越。
?????? kafka架構(gòu)由producer、consumer group、broker組成,producer是消息的生產(chǎn)者,consumer是消息的消費(fèi)者,broker是代理服務(wù)器,消息都存放在broker上。producer、consumer要想向kafka發(fā)送和消費(fèi)數(shù)據(jù)需要先申請(qǐng)一個(gè)主題,都是面向主題進(jìn)行操作,申請(qǐng)創(chuàng)建topic的時(shí)候需要指定分區(qū)的個(gè)數(shù),副本的個(gè)數(shù),kafka集群會(huì)采用輪詢或者range分區(qū)的方式將分區(qū)分散到不同的broker上。
?????? flume可以理解成一個(gè)點(diǎn)對(duì)點(diǎn)的模式,從消費(fèi)者主動(dòng)拉取數(shù)據(jù)。消息生產(chǎn)者將消息發(fā)送到queue中,然后消費(fèi)者從queue中取出并消費(fèi)消息,消息被消費(fèi)者消費(fèi)以后,queue中不在存儲(chǔ)消息,所以消息消費(fèi)者不可能重復(fù)消費(fèi)已經(jīng)被消費(fèi)過的消息。這個(gè)queue就相當(dāng)于flume的緩存channel。點(diǎn)對(duì)點(diǎn)模式可以理解成同步處理模式,類似于填寫注冊(cè)信息,寫入數(shù)據(jù)庫(kù),然后調(diào)用短信發(fā)送接口,進(jìn)行發(fā)送短信的實(shí)現(xiàn)。如下圖所示的同步模式。

?????? kakfa相當(dāng)于異步處理模式,相當(dāng)于填實(shí)注冊(cè)信息,寫入數(shù)據(jù)庫(kù),把發(fā)送短信的任務(wù)寫入隊(duì)列中,在隊(duì)列中異步處理發(fā)送短信的任務(wù)。如下圖所示。

??????? 項(xiàng)目的架構(gòu)采用flume收集網(wǎng)站攻擊的代碼修改,當(dāng)有網(wǎng)站編碼上的修改,就會(huì)把變化信息收集到flume的source中接收,然后sink到kakfa中進(jìn)行存儲(chǔ)。如下圖所示。

??????? 從圖中看,flume的source接收數(shù)據(jù),然后以事件為單位進(jìn)行處理,通過處理事件,把事件傳給攔截器,如果有需要攔截的內(nèi)容,就需要實(shí)現(xiàn)攔截器,并且每個(gè)事件都會(huì)發(fā)給channel選擇器,將返回的結(jié)果寫入事件channel列表,根據(jù)channel選擇器的選擇結(jié)果,將事件寫入相應(yīng)的channel,這個(gè)channel相當(dāng)于緩存機(jī)制,接上來通過SinkProcessor下沉處理器處理結(jié)果,這里通過下沉處理器SinkPrcessor下沉到kafka中進(jìn)行存儲(chǔ)。
?????? 搭建flume+kakfa需要zookeeper包,這里使用zookeeper的版本是3.3.3,flume的版本是1.8.0,kafka的版本是2.12,這里需要注意kafka和flume的版本問題,flume的版本1.9需要jdk就會(huì)高,當(dāng)使用的jdk版本大于9時(shí),kafka可以會(huì)出現(xiàn)Unrecognized VM option 'PrintGCDateStamps'導(dǎo)致Kafka無法啟動(dòng),
?????? 這里把flume的版本調(diào)整為1.8。
?????? 啟動(dòng)虛擬機(jī)centos之后,在usr目錄下新建flume,kafka和zookeeper目錄。如下圖所示。

?????? 通過vftp軟件把zookeeper、 flume和kafka軟件上傳到linux服務(wù)器中,如下圖所示。

?????? 上傳軟件后,把上傳到/home/soft中的軟件解壓到usr目錄下相應(yīng)的目錄中,這里可以解壓zookeeper解壓包,命令如下 。

?????? 繼續(xù)解壓flume壓縮包,解壓命令如下。

?????? 最后將kafka壓縮包解壓,解壓命令如下。

??????? 這里首先進(jìn)入zookeeper的config目錄下,設(shè)置config的文件zoo.cfg,但是在config目錄下,沒有zoo.cfg文件,原來只有zoosample.cfg,需要把zoosample.cfg復(fù)制成zoo.cfg,拷貝命令如下。

??????? 文件拷貝成功后,通過vi指令進(jìn)行編輯zoo.cfg的配置文件。

??????? 在zoo.cfg的文件末尾加上一句服務(wù)器的指示語句,這里只有一個(gè)zookeeper服務(wù)器,所以只配置一臺(tái)服務(wù)器的配置Ip即可,配置代碼如下。

??????? 這里配置的ip是192.168,214.128,配置的端口號(hào)是3666。完成配置后,可以在zookeeper的bin目錄下,執(zhí)行zkServer.sh文件,后面帶上一個(gè)參數(shù)start來啟動(dòng)zookeeper服務(wù)器,如下圖所示。

??????? zookeeper啟動(dòng)后,配置kafka,首先進(jìn)入到usr目錄下的kafka目錄,然后在kafka的目標(biāo)目錄下的config目錄中有配置文件server.properties。這里需要通過vi編輯server.properties文件,如下圖所示。

??????? 在文件的末尾處找到zookeeper的連接配置,后面配置上zookeeper的連接ip地址和默認(rèn)端口號(hào)2181。配置如下。

?????? 這里配置的zookeeper地址是192.168.214,128,具體內(nèi)容根據(jù)虛擬機(jī)的具體IP決定,2181是zookeeper的默認(rèn)地址。
?????? 配置結(jié)束后,需要啟動(dòng)kafka服務(wù),通過kafka目錄中bin目錄下的kafka-server-start.sh文件,后面需要跟上server.properties的路徑文件。

??????? 啟動(dòng)后,當(dāng)看到“kafka started”信息后,表示kafka服務(wù)已成功啟動(dòng)。 如下圖。

??????? kafka服務(wù)啟動(dòng)后,不會(huì)退出進(jìn)程,這里需要在虛擬機(jī)中再啟動(dòng)一個(gè)終端,繼續(xù)啟動(dòng)kafka消費(fèi)者,當(dāng)flume的source源接收到網(wǎng)站被改變的數(shù)據(jù)后,就會(huì)在消費(fèi)者終端中輸出,啟動(dòng)消費(fèi)者終端需要用到kafka的bin目錄中的kafka-console-consumer.sh文件。啟動(dòng)指令時(shí)文件后面需要指定zookeeper的地址以及當(dāng)前需要消費(fèi)的topic,為了保證這個(gè)topic的存在,需要kafka先創(chuàng)建一個(gè)topic主題,然后再啟動(dòng)kakfa消費(fèi)者。創(chuàng)建kafka的topic指令如下。
./kafka-topics.sh --create --zookeeper 192.168.110.140:2181 --topic myhello --partitions 1 --replication-factor 1
???????? 這里使用kafka目錄中bin目錄中的kafka-topic.sh文件,后面跟上zookeeper的地址,并且指明--topic主題名,當(dāng)前指明的是myhello主題,還需要指明partitions的分區(qū)及replication-factor的復(fù)制份數(shù)。這里由于是1臺(tái)服務(wù)器,分區(qū)數(shù)和備份數(shù)都為1。
??????? 把kafka的topic創(chuàng)建結(jié)束后,需要啟動(dòng)kafka消費(fèi)者。命令如下圖。

?????? 這里消費(fèi)的主題--topic指明的是前面建立的主題myhello。啟動(dòng)后,消費(fèi)者不會(huì)退出進(jìn)程,需要再次另外啟動(dòng)一個(gè)終端。
??????? kafka中消費(fèi)者由于是flume下沉過來的,因此這里需要設(shè)置flume,進(jìn)入到flume的配置目錄,設(shè)置flume的配置文件,這個(gè)文件名需要自己去命名,如下圖所示。

??????? flume的配置文件有3個(gè)說明,說明source、 channel和sink,這里的source需要監(jiān)控網(wǎng)站文件被攻擊的記錄,這個(gè)記錄一般放在文件中,linux顯示問題文件的記錄可以使用tail來顯示出來。channel默認(rèn)可以使用Momery內(nèi)存做為緩存方式,最后sink需要一個(gè)固定的kafka配置,配置kafka的類文件,然后指明kafka的消費(fèi)主題及相關(guān)配置。

??????? 從圖中可以看出,當(dāng)前flume設(shè)置的source名稱為r1,channel名稱為c1,sinks的名稱為k1。 r1的類型是exec類型,這個(gè)類型可以執(zhí)行tail指令來查看網(wǎng)站攻擊的日志文件web.log。接下來設(shè)置c1的type類型為momery,其大小設(shè)置為1000。再設(shè)置了k1的下沉類型,指出其type類型為KafkaSink,bootstrap的地址指定為192.168.214.128,bootstrap服務(wù)器的端口號(hào)默認(rèn)為9092,topic指示主題為myhello。最后指示r1的channels為c1,這里可以有多個(gè)緩沖channel,所以是復(fù)數(shù),指示下沉k1的channel為c1,注意這里的 channel為單數(shù)形式。
?????? 編輯完這個(gè)配置文件后,通過flume目錄下bin目錄中的flume-ng去啟動(dòng)一個(gè)agent。指令如下。

??????? 注意,指令中指定的--name是a1,這個(gè)a1與配置文件中指定的flume的agent名稱一致。后面的-f參數(shù),指定conf文件的位置和名稱,-D參數(shù)指定輸出信息的等級(jí)和輸出位置在控制臺(tái)上。
?????? 啟動(dòng)成功后,這個(gè)進(jìn)程也不會(huì)被殺死,如下圖所示。

??????? 在啟動(dòng)信息中,可以看到k1 started,表示從r1到k1都已經(jīng)啟動(dòng)了。
??????? 這里的進(jìn)程不會(huì)被殺死,需要另起一個(gè)終端,繼續(xù)執(zhí)行網(wǎng)站的監(jiān)控并輸出到文件中。
inotifywait -mqr --timefmt “%d/%m/%y %H:%M:%S” ?--format “%T %w %f %e” -e modify,delete,create,attrib /home/data”-o /home/mykafka/web.log ?/home/web
??????? 注意,命令中的輸出日志必須與flume中tail后指示的日志名稱是一致的。
??????? 命令中監(jiān)控的網(wǎng)站是home目錄下的web目錄。
??????? web目錄可以有若干web文件,也可以進(jìn)行嵌套,這里的web目錄下有3個(gè)web文件,a.html,b.html與c.html,其具體內(nèi)容如下。

??????? 現(xiàn)在,另外開啟一個(gè)終端,對(duì)/home中的web目錄進(jìn)行修改,修改內(nèi)容如下。

??????? 這時(shí),相當(dāng)于網(wǎng)站內(nèi)容受到攻擊,inofitywait會(huì)接收到修改的內(nèi)容并通過flume下沉到kafka的消費(fèi)者中,最終, kakfa消費(fèi)者的輸出結(jié)果如下。

?????? 這樣,網(wǎng)站攻擊的數(shù)據(jù)就會(huì)實(shí)時(shí)地存儲(chǔ)到了kafka中,隨時(shí)關(guān)注博客,后期更新會(huì)說明后續(xù)如何分析kakfa中的消費(fèi)信息。
? 嗶哩嗶哩官網(wǎng)視頻地址:
? ?https://www.bilibili.com/video/BV1sd4y1t7iG/