HW支持-定时扫描局域网内所有设备MAC不在白名单则邮件提醒

需求背景

护网行动,是公安部组织的安全攻防演练活动。 曾经有被新安装的校园卡刷卡机黑到内网的经历,所以尽可能在护网期间能关就关,不新增设备。发现异常接入内网的设备即时进行提醒和处理。

实现步骤

  1. MAC地址白名单放在一个txt文件中,一行一个。也可以改成在数据库中提供一个web界面进行维护。因为是临时性的,怎么方便怎么来。
  2. 通过kamene库扫描内网当前存活设备的MAC。
  3. 与白名单的MAC地址进行匹配。
  4. 不存在的MAC地址,发送邮件通知。也可以改成成发送钉钉、企业微信webhook消息通知。
  5. 把代码在Crontab中设置定时运行策略运行即可。

直接上代码

python 复制代码
#!/usr/bin/python
#encoding=utf-8
#Author:Evan
#Mail:[email protected]

from kamene.all import srp, Ether, ARP
import datetime
import sys
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header

# 读取白名单
whitelist0=[]
with open('maclist.txt','r',encoding='UTF-8') as f:
	for line in f:
		whitelist0.append(line.strip('\n'))
f.close()

# 白名单列表转大写
whitelist1 = [x.upper() for x in whitelist0]

# 定义扫描的网卡
# eth000="Realtek USB GbE Family Controller"

# 定义扫描IP段
IpScan = '192.168.168.0/22'
# 定义扫描vlan
vlan ='vlan1'
# arp扫描
#ans,unans = srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=IpScan),iface=eth000 timeout=15)
ans,unans = srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=IpScan),timeout=10)

# 定义一个空列表,存灰名单
Greylist=[]
# 扫描MAC,如果不存在白名单中,则写入列表结果存入列表
for send, rcv in ans:
    if rcv.hwsrc.upper() not in whitelist1:
        Greylist.append([rcv.psrc,rcv.hwsrc])

# 定义时间变量 日志记录扫描时间
he=datetime.datetime.now().strftime("%Y-%m-%d")
ho=datetime.datetime.now().strftime('%H:%M:%S')

#stmp服务器设置
mail_host = 'mail.chengwenit.com'
mail_user = '[email protected]'
mail_pwd = 'password'

#抄送
mail_cc = ['[email protected]']
#主送
mail_to = ['[email protected]','[email protected]']
#表头信息
msg = MIMEMultipart('alternative')
msg['From'] = mail_user
msg['Subject'] = vlan +'MAC地址不在白名单预警' + he + ' ' + ho
msg['To'] = ",".join( mail_to )
msg['Cc'] = ",".join( mail_cc )
#定义正文
text = "\n".join('%s' %id for id in Greylist)
#定义邮件内容的格式
part1 = MIMEText(text, 'plain')  
#把part1生成到邮件中 
msg.attach(part1)  

# 发送邮件
try:
    s = smtplib.SMTP()
    s = smtplib.SMTP_SSL(mail_host, 465 )
    s.connect(mail_host)
    #login
    s.login(mail_user, mail_pwd )
    #send mail
    s.sendmail(mail_user, mail_to, msg.as_string())
    s.close()
    print ('success')
except Exception as e:
    print ('Exception: ', e)
相关推荐
电鱼智能的电小鱼12 分钟前
EFISH-SBC-RK3588无人机地面基准站项目
linux·网络·嵌入式硬件·机器人·无人机·边缘计算
电鱼智能的电小鱼18 分钟前
基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案
linux·网络·嵌入式硬件·数码相机·无人机·边缘计算
Arenaschi1 小时前
SQLite 是什么?
开发语言·网络·python·网络协议·tcp/ip
沧浪之水!2 小时前
【Linux网络】:套接字之UDP
linux·网络·udp
上海云盾-高防顾问2 小时前
高防IP+CDN组合:电商大促的“双保险”防护方案
网络·网络协议·tcp/ip
迷路的小绅士2 小时前
常见网络安全攻击类型深度剖析(三):DDoS攻击——分类、攻击机制及企业级防御策略
网络·web安全·ddos
诡异森林。3 小时前
Docker--Docker网络原理
网络·docker·容器
ALex_zry3 小时前
Docker Macvlan网络配置实战:解决“network already exists“错误
网络·docker·php
半路_出家ren3 小时前
流量抓取工具(wireshark)
网络·网络协议·测试工具·网络安全·wireshark·流量抓取工具
Gazer_S4 小时前
【HTTP/2:信息高速公路的革命】
网络·网络协议·http