天天看點

【Python自動化運維】分析企業郵箱日志檔案,辨識黑客行為并添加至BAN配置檔案1.背景由于某些原因未成功申請到企業郵箱的smtp,pop3的SSL證書協定,導緻QQ、163郵箱無法通過SSL通信協定進行互相收發郵件2.企業郵箱3.結語

1.背景

由于某些原因未成功申請到企業郵箱的smtp,pop3的SSL證書協定,導緻QQ、163郵箱無法通過SSL通信協定進行互相收發郵件

近日企業内部使用者經常回報收到垃圾郵件、郵件發不出去,尴尬了。

一查伺服器日志,發現大量的攻擊行為。。。。

2019/12/04-11:42:41   6856 Connect from 185.234.219.81

2019/12/04-11:42:41   6856 remote ehlo = XXXXX.com

2019/12/04-11:42:41   6856 max msg size = 0

2019/12/04-11:42:43   6856 smtp authenticate fail! Username = [email protected]

以上是典型的賬戶驗證操作,大量的賬戶會話錯誤,占用端口對伺服器資源造成非常大的浪費,影響正常業務的展開。

2.企業郵箱

服務程式更新可以解決這樣的漏洞,但需要支付費用,在沒有預算的條件下,隻有自己動手 了。

經過檔案的對比确認,最終确定service.cfg檔案可以将攻擊ip添加至黑名單。

但是每天去查日志,手工添加,我表示太累了。。人生苦短,我用Python,來吧兄弟,上代碼:

半天的時間就調試完成了。上代碼:

-----------------------------------------------------

import re
import time
import datetime
count = 0  # 初始的檔案指針設定為0
def readlog(logfiles, **kwargs):
    final_black_list = []  # 超過一定錯誤日志數量的問題ip最終轉化為黑名單
    for per in logfiles:
        count = 0
        with open(per, mode="r") as fr:  ##, encoding="utf-8"
            log_list = []  # 每次循環時把清單清空,因為是按1分鐘進行統計的
            bad_iplist = []  # 有問題的ip位址
            connect_ip_list = []
            fr.seek(count)  # 根據檔案指針進行檔案内容讀取
            for line in fr:  # 循環拿每一行内容
                log_list.append(line.split("\n")[0])  # 取每一行的資料
                if line.find("Connect from") > 0:
                    connect_ip_list.append(line.split("\n")[0])
                else:
                    pass

            count = fr.tell()  # 讀完之後更新檔案的指針
            for row in range(1, len(log_list), 1):  # 循環讀取集合中的錯誤行内容,比對smtp authenticate fail,傳回回話id,
                try:
                    thist_line = str(log_list[row])
                    get_auth_sessionid = re.findall('[  ]+(.+?)[  ]+smtp authenticate fail', thist_line)  # 識别黑客猜smtp密碼
                    get_guessacc_sessionid = re.findall('[  ]+(.+?)[  ]+mailbox not found', thist_line)  # 識别黑客猜郵箱賬戶名稱
                    get_ddos_sessionid = re.findall('[  ]+(.+?)[  ]+This IP frequency too high', thist_line)  # 識别DDos攻擊
                    # 應對辦法隻有添加至防火牆黑名單清單,本程式不做開發
                    get_command_sessionid = re.findall('[  ]+(.+?)[  ]+unrecognized command', thist_line)  # 識别黑客嘗試協定注入
                    get_guesspsw_sessionid = re.findall('[  ]+(.+?)[  ]+password error', thist_line)  # 識别猜指定存在賬戶密碼
                    totalsessionidlist = get_auth_sessionid+get_guessacc_sessionid+get_ddos_sessionid+get_command_sessionid+get_guesspsw_sessionid
                    totalsessionid = ""
                    totalsessionid = "".join(totalsessionidlist)
                    #print(totalsessionid)
                    if len(totalsessionid) != 0:
                        Regexstr = r'%s+[ Connect from ]+(.+?)ASA'%(totalsessionid)
                        allconnect_ip_list = "ASA".join(connect_ip_list)
                        ip = re.findall(Regexstr, allconnect_ip_list, re.S)
                        # 2019/11/26-00:03:32  14404 Connect from 78.128.113.123
                        bad_iplist.append(ip[0])
                    else:
                        pass
                except IndexError as e:
                    continue

            for eachip in bad_iplist:  # 統計當日badip出現次數
                if bad_iplist.count(eachip) > 10:
                    final_black_list.append(eachip)
                    # print("把ip為%s的加入到黑名單" % eachip)
                else:
                    pass
            fr.close()  # 最後關閉檔案句柄

    return list(set(final_black_list))

def write_cfg(bad_iplist, cfgfile):
    alllines = []
    f = open(cfgfile, mode="r")
    alllines = f.readlines()
    newtxt = ""
    for i in range(0, len(alllines), 1):
        newtxt = newtxt + alllines[i]
    f.close()
    accessip_lines = []
    exist_bad_iplist = []
    for row in range(0, len(alllines), 1):
        thislinestr = ""
        thislinestr = alllines[row]
        if thislinestr.find("accessip") > 0:

            accessip_lines.append(row)
            ip = re.findall(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])', str(newtxt), re.S)
            exist_bad_iplist = exist_bad_iplist + ip
        else:
            pass

    addlist = set(exist_bad_iplist + bad_iplist)
    write_str = "<accessip>" + ";".join(addlist) + "</accessip>"
    open(cfgfile, mode='w').write(re.sub(r'<accessip>(.+?)</accessip>', write_str, str(newtxt)))
    return "完成一次重新整理政策!"

def weekly_clear_config(cfgfile):
    f = open(cfgfile, mode="r")
    alllines = f.readlines()
    newtxt = ""
    for i in range(0, len(alllines), 1):
        newtxt = newtxt + alllines[i]
    f.close()
    write_str = "<accessip>255.255.255.255</accessip>"
    write_str2 = "<control>1</control>"
    open(cfgfile, mode='w').write(re.sub(r'<accessip>(.+?)</accessip>', write_str, str(newtxt)))
    open(cfgfile, mode='w').write(re.sub(r'<control>(.+?)</control>', write_str2, str(newtxt)))

if __name__ == '__main__':
    logfiles = ["smtp.log","smtpssl.log","pop3.log","pop3ssl.log"]
    cfgfile = 'C:\\CProgram Files XXXXXXailserver\\service.cfg'
    while True:
        today = datetime.date.today()
        weekday = today.isoweekday()
        nowtime = time.strftime('%H:%M', time.localtime(time.time()))
        if weekday ==1 and (nowtime=="08:01" or nowtime=="08:02" or nowtime=="08:03" or nowtime=="08:04"):
            #每周指定時間段将規則清空!苦海無邊,回頭是岸!~~
            weekly_clear_config(cfgfile)
        else:
            final_black_list = readlog(logfiles)
            print("今日最新黑名單清單" + str(set(final_black_list)))
            status = write_cfg(final_black_list, cfgfile)
            time.sleep(10)
        continue
           

-------------------------------------------------------

3.結語

      僅100來行代碼實作了4個檔案的循環讀取,識别5種黑客攻擊的痕迹,并将嘗試次數超過10次的問題IP記錄至service.cfg檔案中對應位置。至此完成了企業郵箱自動識别攻擊行為并将阻止問題ip的通路。為了防止Ip的數量越來越大(網際網路的黑客太多了),給一個視窗清空設定,還使用者一個改過自新的機會。呵呵~~~

       以上代碼實戰測試過,有相同問題的網友可以評論回複喲。

       對了,郵件伺服器上沒有python,可以直接打包exe運作。

      pyinstaller.exe -F C:\Users\Administrator\PycharmProjects\untitled3\AThack-mail\readlog_at_hack.py

........................................

13849 INFO: Building EXE because EXE-00.toc is non existent

13849 INFO: Building EXE from EXE-00.toc

13849 INFO: Appending archive to EXE C:\Users\Administrator\PycharmProjects\untitled3\dist\readlog_at_hack.exe

13875 INFO: Building EXE from EXE-00.toc completed successfully.

   至此程式已經生成,我們把程式移動到伺服器運作。。下面是執行效果

【Python自動化運維】分析企業郵箱日志檔案,辨識黑客行為并添加至BAN配置檔案1.背景由于某些原因未成功申請到企業郵箱的smtp,pop3的SSL證書協定,導緻QQ、163郵箱無法通過SSL通信協定進行互相收發郵件2.企業郵箱3.結語