icesuntisuk

View on GitHub

File Integrity Monitoring (FIM) and notify to Line in python

โปรแกรมนี้ใช้สำหรับการตรวจสอบการเปลี่ยนแปลงไฟล์ที่ต้องการ Monitor ใน Path นั้นๆ ที่ Run โปรแกรม โดยจะทำการแจ้งเตือนไปยังผู้ดูแลกรณีมีการเปลี่ยนแปลงค่า Hash ของไฟล์

# v.1 FIM in current directory
import os, hashlib, time, requests
def lineNotify(msg):
    url = 'https://notify-api.line.me/api/notify'
    token = 'token ID'
    headers = {'content-type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer ' + token}
    r = requests.post(url,headers=headers,data={'message':msg})

files={}
while True:
    for file in [item for item in os.listdir('.') if os.path.isfile(item)]:
        hash = hashlib.md5()
        with open(file,'rb') as f:
            for chunk in iter (lambda : f.read(4096), b""):
                hash.update(chunk)
        md5 = hash.hexdigest()
        if file in files and md5 != files[file]:
            msg = str(time.strftime('%Y-%m-%d %H:%M:%S')) + str(file) + "has been changed"
            print(msg)
            lineNotify(msg)
        files[file] = md5
    time.sleep(1)

ในโค็ดต่อไปจะเป็นการตรวจสอบเข้าไปยัง Directory ที่อยู่ภายในได้ครับ

# Indeph directory traversal upgrade from v1 
import glob
import os, hashlib, time, requests

def lineNotify(msg):
    url = 'https://notify-api.line.me/api/notify'
    token = 'token ID'
    headers = {'content-type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer ' + token}
    r = requests.post(url,headers=headers,data={'message':msg})

files={}
result = []
while True:
    for x in os.walk('.'):
        for file in glob.glob(os.path.join(x[0], '*')):
            if os.path.isfile(file):
                result.append(file)
                # print(file)
                #Integrity Checking
                hash = hashlib.md5()
                with open(file,'rb') as f:
                    for chunk in iter (lambda : f.read(4096), b""):
                        hash.update(chunk)
                md5 = hash.hexdigest()
                if file in files and md5 != files[file]:
                    msg = str(time.strftime('%Y-%m-%d %H:%M:%S')) + " \nFile name = [" +str(file) + "] has been changed"
                    print(msg)
                    lineNotify(msg)
                files[file] = md5
    time.sleep(1)

Powered by Icesuntisuk and Thanakorn