在安全运营中,实现对IPS,IDS,蜜罐等等的告警的自动化推送,可以大大提高我们的工作效率,做到对告警的及时分析和处置。
告警的自动推送方式有很多种,比较常见的有微信机器人推送和邮件推送
下面以实现邮件自动化推送为例
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 12 10:43:39 2023
@author: nexus
"""
import socket
import time
import smtplib
import email.utils
from email.mime.text import MIMEText
import threading
import queue
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind(('0.0.0.0',514))#绑定514端口
q=queue.Queue()#日志队列
def sendmail(msg): #发送日志邮件功能
message = MIMEText(msg)#正文
message['To'] = email.utils.formataddr(('nexus', '接收者邮箱'))#接收者名称和邮箱
message['From'] = email.utils.formataddr(('nexus', '发送者邮箱'))#发送者名称和邮箱
message['Subject'] = '蜜罐告警'#主题
server = smtplib.SMTP_SSL('smtp.qq.com', 465) #smtp服务器
server.login('发送者邮箱','邮箱授权码')#邮箱授权
server.set_debuglevel(False)
try:
server.sendmail('发送者邮箱',['接收者邮箱'],msg=message.as_string())
finally:
server.quit()
def SyslogServer(): #syslog服务器,接收日志,存入日志队列
while True:
rec_msg, addr = udp.recvfrom(2048)
smsg=rec_msg.rstrip(b'\x00').decode('utf-8','ignore')
q.put(smsg)
def smail(): #为了避免邮件发送频繁把邮箱打爆,设置为每隔20秒就取出日志队列全部日志并推送
while True:
time.sleep(20);
msg=""
while q.empty() == False:
smsg=q.get();
msg = msg+"\n" +"时间:"+smsg.split("- - -",1)[0].split(" ")[1]+"\n"+"事件:"+smsg.split("- - -",1)[1]
if msg != "":
sendmail(msg)
print('msg from client:', msg)
def smail50():#队列存储的日志满50条就推送出去
while True:
if q.qsize() >= 50:
msg1=""
while q.empty() == False:
smsg=q.get();
msg1 = msg1+"\n" +"时间:"+smsg.split("- - -",1)[0].split(" ")[1]+"\n"+"事件:"+smsg.split("- - -",1)[1]
sendmail(msg1)
print('msg from client:', msg1)
if __name__=='__main__':
t1=threading.Thread(target=smail);
t1.start();
t2=threading.Thread(target=smail50);
t2.start();
SyslogServer();
下面我们发送一些告警日志测试下效果
服务器端
邮箱端