基于ELK的iis日志可視化

0x01 IIS日志格式

日志樣本

 [
  '2017-06-23', 
  '00:38:23', 
  'W3SVC2007378449',
  'ss.ss.ss.ss', 
  'GET',
  '/xxxx/', 
  '-', 
  '80', 
  '-', 
  'cc.cc.cc.cc', 
  'Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.1;+Trident/5.0)',  
  '404',
  '0', 
  '2\r\n'
]

數(shù)組對(duì)應(yīng)字段的意義:

0 - 日期
1 - 時(shí)間
2 - 服務(wù)名
3 - 服務(wù)器IP
4 - 請(qǐng)求方式
5 - 請(qǐng)求訪問頁(yè)面
6 - 查詢字符串
7 - 端口
8 - 無
9 - 客戶端IP
10 - 用戶代理
11 - 協(xié)議返回狀態(tài)
12 - 無
13 - 無

0x02 解析IIS日志寫入ELK

遍歷IIS日志目錄(這里為iis)闸英,通過split劃分日志(建議使用正則谆沃,split是偷懶的方法)钝凶,將日志信息寫入redis。

下面附上思路代碼analyze_log.py

#coding: utf8
from datetime import datetime
import redis
import os
import re
import sys
import json
reload(sys)
sys.setdefaultencoding('utf-8')
<br />
def handle_time(dat, tim):
    format_time = dat + ' ' + tim
    struct_time = datetime.strptime(format_time, '%Y-%m-%d %X')
    return struct_time
<br />
def getPool():
    rhost = "localhost"
    rport = 6379
    rpassword = "redis"
    rdb = 1
    try:
        pool = redis.ConnectionPool(host=rhost, port=rport, password=rpassword, db=rdb)
        return redis.Redis(connection_pool=pool)
    except Exception as e:
        print 'redis connect error'
        return 'None'
<br />
def getLogs(dirn, fpath, fn):
    try:
        f = open(fpath+fn)
        redis_pool = getPool()
        for v in f.readlines():
            v_arr = v.split(" ")
            #iis日志樣本長(zhǎng)度14
            if len(v_arr) == 14:
                timestamp = handle_time(v_arr[0], v_arr[1])
                doc = {
                    "create_time": v_arr[0] + ' ' + v_arr[1],
                    "unit": dirn,
                    "filelog": fn,
                    "machine_id": v_arr[2],
                    "server": v_arr[3],
                    "method": v_arr[4],
                    "path": v_arr[5],
                    "param": v_arr[6],
                    "port": v_arr[7],
                    "client": v_arr[9],
                    "agent": v_arr[10],
                    "code": v_arr[11]
                }
                redis_pool.lpush('iisvul', json.dumps(doc))
    except Exception as e:
        print e
<br />
def analyze(rootdir):
    for root,dirs,files in os.walk(rootdir): 
        for dirn in dirs:
            fpath = os.getcwd() + '/' + rootdir + '/' + dirn + '/'
            cur_files = os.listdir(fpath)
            for cur_file in cur_files:
                getLogs(dirn, fpath, cur_file)
<br />
if \_\_name\_\_ == '\_\_main\_\_':
    #日志路徑為iis
    rootdir = 'iis'
    analyze(rootdir)
    print 'end'

為了更直觀的展示日志唁影,可以對(duì)請(qǐng)求ip做geoip耕陷,后續(xù)可在kibana中根據(jù)客戶端IP畫地圖。

logstash配置文件iisvul.conf

input{
    redis {
                host => "localhost"
                password => "redis" 
                data_type => "list"
                key => "iisvul"
                db => 1
        }
}

filter{
        geoip {
                source => "client"
                target => "geoip"
                database => "/path/to/databases/GeoLite2-City.mmdb"
        }
        date {
                match => [ "create_time", "YYYY-MM-dd HH:mm:ss"]
        }
}

output{
        elasticsearch {
                hosts => ["lcoalhost"]
                index => "iisvul"
                user => "logstash"
                password => "logstash"
        }
}

為索引iisvul建立映射据沈,將geoip.location設(shè)置為geo_point類型哟沫。

PUT iisvul
{
  "mappings": {
    "logs": {
      "properties": {
        "geoip": {
          "dynamic": "true", 
          "properties":{
            "location":{"type":"geo_point"}
          }
        }
      }
    }
  }
}

0x03 總覽日志

繪制面板

經(jīng)過粗糙的處理,把日志信息輸入到ELK锌介,把控總體情況嗜诀。

日志總體情況.png

后續(xù)分析

一些分析日志思路:

  • 通過折線圖請(qǐng)求大量增加,可判斷被掃描的時(shí)間段

  • 通過地圖直觀判斷惡意請(qǐng)求來自國(guó)外的IP(正常情況下惡意的請(qǐng)求都會(huì)通過國(guó)外的代理進(jìn)行掃描孔祸、漏洞利用)

  • 通過請(qǐng)求參數(shù)隆敢、請(qǐng)求鏈接出現(xiàn)較少次數(shù)的排序?qū)ふ襴ebshell、上傳的小馬

  • 可以根據(jù)服務(wù)器上已成功上傳的大馬崔慧、一句話來查詢?nèi)罩痉餍治鋈肭致窂?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惶室,隨后出現(xiàn)的幾起案子温自,更是在濱河造成了極大的恐慌,老刑警劉巖皇钞,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼泌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡夹界,警方通過查閱死者的電腦和手機(jī)券躁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人也拜,你說我怎么就攤上這事以舒。” “怎么了慢哈?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蔓钟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我卵贱,道長(zhǎng)滥沫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任键俱,我火速辦了婚禮兰绣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘编振。我一直安慰自己缀辩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布踪央。 她就那樣靜靜地躺著臀玄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畅蹂。 梳的紋絲不亂的頭發(fā)上健无,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音液斜,去河邊找鬼累贤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛少漆,可吹牛的內(nèi)容都是我干的畦浓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼检疫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了祷嘶?” 一聲冷哼從身側(cè)響起屎媳,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎论巍,沒想到半個(gè)月后烛谊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘉汰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年丹禀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡双泪,死狀恐怖持搜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焙矛,我是刑警寧澤葫盼,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站村斟,受9級(jí)特大地震影響贫导,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蟆盹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一孩灯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逾滥,春花似錦峰档、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毅待,卻和暖如春尚卫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尸红。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工吱涉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人外里。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓怎爵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盅蝗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳖链,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容