XieJava's blog

记录最好的自己


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

网络安全之认识挖矿木马

发表于 2023-02-22 | 更新于: 2024-06-13 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.9k | 阅读时长 ≈ 10

一、什么是挖矿木马?

比特币是以区块链技术为基础的虚拟加密货币,比特币具有匿名性和难以追踪的特点,经过十余年的发展,已成为网络黑产最爱使用的交易媒介。大多数勒索病毒在加密受害者数据后,会勒索代价高昂的比特币。比特币在2021年曾达到1枚6.4万美元的天价,比特币的获得需要高性能计算机(又称矿机,一般配置顶级CPU和GPU)按特定算法计算,计算的过程被形象的称为“挖矿”。

矿机价格昂贵,为生产比特币,有人不惜重金购置大量矿机组成网络集群挖矿。挖矿又非常耗电,因此矿场往往会寻找偏僻地区的小水电、小火电而建,因为电费便宜,有人为节约成本偷电挖矿。

当数字加密币市值暴涨时,挖矿业务会水涨船高,高端CPU、GPU、高端显卡、大容量硬盘被炒上天价还卖断货。目前,我国政府宣布要实现碳达峰碳中和的目标,严重耗能的虚拟加密币相关生产、交易被认定为非法,我国境内所有(生产加密货币的)矿场必须关闭。

因挖矿需要大量财力投入,从一开始,就有人想到利用木马控制他人的计算机组建僵尸网络集群挖矿的办法,这就是所谓“挖矿木马”。

不法分子通过各种非法手段将矿机程序植入受害者的计算机中,利用受害者计算机的运算能力进行挖矿活动,从而获取非法收益。这类非法侵入用户计算机的矿机程序被称作挖矿木马病毒。

二、挖矿木马的主要入侵方式

挖矿木马常见的攻击方式及攻击后果可以参考下图:
挖矿木马的主要入侵方式

1、漏洞攻击

利用系统漏洞快速获取相关服务器权限,植入挖矿木马是目前最为普遍的传播方式之一。常见的漏洞包括Windows系统漏洞、服务器组件插件漏洞、中间件漏洞、Web漏洞等。例如传播较广的WannaMine挖矿家族,利用了永恒之蓝漏洞在内网蠕虫式传播,给不少公司和机构带来巨大损失。

2、弱口令爆破

弱口令指的是仅包含简单口令、有规律的键盘组合或历次泄漏过的密码,攻击者通常会针对redis、ssh、3389、mssql、IPC$等服务进行爆破弱口令攻击。爆破成功后,尝试获取系统权限,植入挖矿木马并设置持久化。

3、伪装正常软件

攻击者将挖矿木马伪装为游戏软件、娱乐社交软件、安全软件、游戏外挂等进行传播,欺骗用户下载并执行。由于多数游戏对显卡、CPU等硬件性能要求较高,故挖矿木马通常伪装成游戏辅助外挂,通过社交群、网盘等渠道传播,感染大量机器。

三、挖矿木马的安全危害

挖矿木马攻击,就是发生率较高,极可能造成业务系统中断的威胁事件,挖矿木马最明显的影响是大量消耗系统资源,使系统其他软件或服务运行缓慢,性能变差。主要安全危害包括业务故障、资源损耗及其他的安全威胁。

1、业务故障

挖矿木马会占用CPU进行超频运算,从而占用主机大量的CPU资源,导致设备性能不足,业务访问缓慢,设备过载宕机重启,异常网络链接等问题,严重影响服务器上的其他应用的正常运行,最终会影响业务系统工作运行。

2、资源损耗

挖矿木马的挖矿活动会使设备各器件高速运行,产生大量热能,增加电能消耗,加速设备器件老化等问题,造成资源损耗浪费。

3、安全威胁

挖矿木马作为一款应用程序,在服务器中运行,其拥有服务器权限,对服务器主机产生安全威胁。部分挖矿木马还具备蠕虫化的特点,在主机被成功入侵之后,挖矿木马还会向内网渗透,并在被入侵的服务器上持久化驻留以获取最大收益。

四、挖矿木马的检测手段

1、挖矿主机指纹识别

通过主机探测平台内置指纹知识库,如:Body特征、Header特征,对挖矿木马指纹进行识别,进而发现感染挖矿木马主机资产。

2、挖矿主机端口识别

通过研究分析目前主流的挖矿木马类型存在的通信端口,感染主机的标记端口等,形成挖矿木马常用端口知识库,并对资产开放端口进行聚合分析,探测这些端口的指纹信息进行识别和确认。

3、挖矿主机协议检测

通过挖矿木马的通信协议特征,对比分析网络资产开放的服务协议,定位存在挖矿木马感染风险的资产主机。

4、IOC威胁情报关联检测

通过大数据威胁情报,实时更新最新的挖矿木马情报。包括挖矿木马家族使用的C&C域名、恶意文件hash、矿池域名和IP、挖矿木马使用的加密货币钱包地址等进行挖矿木马流量检测告警。

5、挖矿木马行为特征检测

通过网络流量检测分析引擎,对其挖矿木马通信的端口、协议、内容、行为特征、恶意文件检测等挖矿木马流量特征进行检测分析,定位出存在恶意挖矿行为的终端及主机。

6、DNS流量检测挖矿域名

通过DNS威胁流量检测,基于域名分析算法结合威胁情报系统对C&C域名、挖矿网站域名、DNS解析IP等进行聚类分析,进而发现内网存在的恶意挖矿行为。

五、挖矿木马的清理

参考网上给出的腾讯安全专家撰写的《挖矿木马自助清理手册》的挖矿木马清理步骤和方法:

1、及时隔离主机

部分带有蠕虫功能的挖矿木马在取得主机的控制权后,会继续对公网的其他主机,或者以当前主机作为跳板机对同一局域网内的其他主机进行横向渗透,所以在发现主机被植入挖矿木马后,在不影响业务正常运行的前提下,应该及时隔离受感染的主机,然后进行下一步分析和清除工作。

2、阻断异常网络通信

挖矿木马不仅会连接矿池,还有可能会连接黑客的C2服务器,接收并执行C2指令、投递其他恶意木马,所以需要及时进行网络阻断。
(1)检查主机防火墙当前生效的iptables规则中是否存在业务范围之外的可疑地址和端口,它们可能是挖矿木马的矿池或C2地址

1
iptables -L -n

(2)从iptables规则中清除可疑地址和端口

1
vi /etc/sysconfig/iptables

(3)阻断挖矿木马的网络通信

1
2
iptables -A INPUT -s 可疑地址 -j DROP
iptables -A OUTPUT -d 可疑地址 -j DROP

3、清除计划任务

大部分挖矿木马会通过在受感染主机中写入计划任务实现持久化,如果仅仅只是清除挖矿进程,无法将其根除,到了预设的时间点,系统会通过计划任务从黑客的C2服务器重新下载并执行挖矿木马。
可以通过执行如下命令查看是否存在可疑定时任务,若有,则先保存相关记录用于后续分析,再进行删除:
查看系统当前用户的计划任务:

1
crontab -l

查看系统特定用户的计划任务:

1
crontab -u username -l

查看其他计划任务文件:

1
cat /etc/crontabcat /var/spool/croncat /etc/anacrontabcat /etc/cron.d/cat /etc/cron.daily/cat /etc/cron.hourly/cat /etc/cron.weekly/cat /etc/cron.monthly/cat /var/spool/cron/

4、清除启动项

除了计划任务,挖矿木马通过添加启动项同样能实现持久化。可以使用如下命令查看开机启动项中是否有异常的启动服务。
CentOS7以下版本:

1
chkconfig –list

CentOS7及以上版本:

1
systemctl list-unit-files

如果发现有恶意启动项,可以通过如下命令进行关闭:
CentOS7以下版本:

1
chkconfig 服务名 off

CentOS7及以上版本:

1
systemctl disable 服务名

另外,还需要仔细排查以下目录及文件,及时删除可疑的启动项:

1
2
3
4
5
6
7
8
9
10
11
12
/usr/lib/systemd/system
/usr/lib/systemd/system/multi-user.target.wants
/etc/rc.local
/etc/inittab
/etc/rc0.d/
/etc/rc1.d/
/etc/rc2.d/
/etc/rc3.d/
/etc/rc4.d/
/etc/rc5.d/
/etc/rc6.d/
/etc/rc.d/

排查的时候,可以按照文件修改时间来排序,重点排查近期被创建服务项。

5、清除预加载so

通过配置/etc/ld.so.preload,可以自定义程序运行前优先加载的动态链接库,部分木马通过修改该文件,添加恶意so文件,从而实现挖矿进程的隐藏等恶意功能。
检查/etc/ld.so.preload(该文件默认为空),清除异常的动态链接库。

6、清除SSH公钥

挖矿木马通常还会在 ~/.ssh/authoruzed_keys 文件中写入黑客的SSH公钥,这样子就算用户将挖矿木马清除得一干二净,黑客还是可以免密登陆该主机,这也是常见的保持服务器控制权的手段。
排查 ~/.ssh/authorized_keys文件 ,如果发现可疑的SSH公钥,直接删除。

7、清除挖矿木马

(1)清除挖矿进程
挖矿木马最大的特点就是会在用户不知情的情况下,利用主机的算力进行挖矿,从而消耗主机大量的CPU资源,所以,通过执行如下命令排查系统中占用大量CPU资源的进程。

1
top -cps -ef

确认相关进程为挖矿进程后,按照如下步骤将其清除:
获取并记录挖矿进程的文件路径:

1
ls -l /proc/$PID/exe

杀死挖矿进程:

1
kill -9 $PID

删除挖矿进程对应的文件
(2)清除其它相关恶意进程
恶意进程与外部的C2服务器进行通信时,往往会开启端口进行监听。执行如下命令,查看服务器是否有未被授权的端口被监听。

1
netstat -antp

若有未授权进程,按照如下步骤将其清除:
获取并记录未授权进程的文件路径:

1
ls -l /proc/$PID/exe

杀死未授权进程:

1
kill -9 $PID

删除未授权进程对应的文件
还可以通过如下命令排查近期新增的文件,清除相关木马

1
find /etc -ctime -2 (这里指定目录为/etc,获取近2天内的新增文件)lsof

8、风险排查、安全加固

对系统进行风险排查和安全加固,避免挖矿木马卷土重来。



“fullbug”微信公众号

关注:微信公众号,一起学习成长!

任何说30天快速学会架子鼓的都是骗人的!

发表于 2023-02-19 | 更新于: 2024-06-13 | 分类于 人生 | | 阅读次数:
字数统计: 1.3k | 阅读时长 ≈ 4

架子鼓

架子鼓
从去年的圣诞节报了架子鼓的班以后,过了一年多了,发现自己这个架子鼓还没有入门!!!

报班的时候感觉信心满满,这架子鼓不就是拿个鼓槌敲来敲去,这还不容易学?而且刷抖音、B站上大把的都是30天快速入门、一个月学会打《逆战》,看得我天真的认为我也能行。现实让我啪啪的打脸,过了一年多了,发现还没有入门,只会打简单的动次打次,敲最简单的《yellow》。

回顾一年多学习架子鼓的历程:

头三个月,才报完班,兴致满满,每周都想约老师上课,由于没有买鼓也没有去鼓房去练习,所以每次上课的时候总是被老师打击”你这个根本就没有练习啊”,或者是”你这上节课的内容还没有练熟啊”,硬着头皮去上课发现头半节课是在练习,后半节课老师匆匆讲一、两个知识点或教一、两个手法。由于完全是零基础老师讲时值,全音符、4分、8分、16分音符等乐理知识,听得得自己一头雾水;教手法是一听就会,一练就费。就这么稀里糊涂的上了大概7节课后,这个信心被打击得不行了,上课的兴趣没有那么大了。想想,这样下去也不是办法,关键是没有条件练习,既然想学好架子鼓,还是得自己买个鼓!于是花了近4千大洋买了个电鼓。

自己有了鼓以后果然兴致又大增。鼓刚到的几天,天天在家练。毕竟咱也是成熟的大人了,知道要学好一门乐器,师傅领进门,修行靠个人,需要自己花时间慢慢的练习。又碰上疫情不断,老师也不能上课。于是自己在B站上找架子鼓视频,今天看到一个新手小白必练节奏型,明天看到一个架子鼓新手快速入门。今天看到这个视频好,练了几天,明天发现另外一个视频可能更适合,又开始跟着这个视频练,练了几天后发现因为不成体系,东练一下西练一下啥都没有学会。又想去找老师线下教,把剩下的几节课上完,结果发现因为疫情原因,报名学鼓的地方老板已经搞不下去,教学点已经转让了。联系了几次老板,老板抱怨说”过了这么久我都已经撑不下去不搞了,你们怎么12节课都还没有学完?”后来根本就不理我们了。

开了个头,总得要学出个名堂来吧?回顾这段学鼓的历程,无疑是段失败的学鼓之路。总结一下,自己学鼓没有目标,不了解学习架子鼓的整个技能知识结构、像个无头苍蝇一样不知道如何有计划的学习和训练,想依赖老师确又没有按照老师的节奏来,把学乐器想得太简单了,不可能通过短短的12次课时就可能把架子鼓学会。人家30天入门、一个月打歌,那基本上都是有基础的,而且是每天都花了大量的时间在练习。个人认为正常情况零基础的学习者没有经过一两年有体系有计划的训练是很难流畅的打好一首中等难度的歌曲的。

痛定思痛,为了学好架子鼓,我开始思考并改变策略。不再无脑的跟B站那些免费的视频教程了,因为大部分免费的视频教程都有个很大的问题就是不成体系。为此我买了一本《成人零基础学架子鼓》的教材,详细了解要学习架子鼓的整体的体系框架,现在知道了学习架子鼓得知道基本的握槌击打方法、套鼓的组成及击打方式、4分、8分、16分、休止符、基本节奏型、还有前8后16、前16后8、切分、附点等等,这些都是需要一个个的去理解理会,通过不断的练习来熟练掌握的。有了这些基本功后才有可能通过组合应用到实战歌曲里面来完成打一首完整的歌曲。为了更好的掌握这些基本功的练习方法,我在抖音上花了499买了一套完整的视频教学课程,可以跟着课程将这些基本功及常用的技巧进行练习。剩下的就是抛弃速成的幻想,扎扎实实一步步的开始练习了。

今年的目标是扎扎实实的把基本功练好,拿下最初定下来的《大风吹》这首歌!



“fullbug”微信公众号

关注:微信公众号,一起学习成长!

网络安全保障之“三同步”

发表于 2023-02-06 | 更新于: 2024-06-13 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 888 | 阅读时长 ≈ 3

建设关键信息基础设施应当确保其具有支持业务稳定、持续运行的性能,并保证安全技术措施同步规划、同步建设、同步使用。

–《网络安全法》第三十三条

信息系统的生命周期层面和安全保障要素层面不是相互孤立的,而是相互关联、密不可分的。
信息系统安全保障生命周期的安全保障要素
在信息系统生命周期模型中,将信息系统的整个生命周期抽象成计划组织、开发采购、实施交付、运行维护和废弃5个阶段,加上在运行维护阶段的变更产生的反馈,形成信息系统生命周期完整的闭环结构。在信息系统生命周期中的任何时间点上,都需要综合信息系统安全保障的技术、管理、工程和人员保障要素。从信息系统建设开始,就应该综合考虑系统的安全保障要求,确保信息系统建设和信息系统安全保障建设同步规划、同步实施。也就是我们平时讲的信息系统和安全保障要“三同步”–同步规划、同步建设、同步使用。

  • 同步规划

关键信息基础设施运营者应:
a)同步分析安全需求,即在关键信息基础设施建设或改建之初,从本组织的职能或业务的角度分析对关键信息基础设施实施网络安全的需求,形成安全需求说明书。
b)同步定义安全要求,即基于网络安全需求说明书,定义关键信息基础设施的网络安全要求,形成网络安全功能和性能说明书。
c)确保安全需求说明书得到网络安全责任部门签字认可。

  • 同步建设

关键信息基础设施运营者应:
a)同步设计安全体系结构,即基于已经定义的关键信息基础设施的网络安全要求,设计网络安全体系结构,明确系统内的各类信息安全组件,说明各组件提供的信息安全服务及可能的实现机制。
b)同步开展详细的安全设计,即根据安全保护等级选择基本安全措施,细化安全机制在关键信息基础设施中的具体实现。
c)在建设或改建过程中,按照GB/T 22239工程实施相应等级的要求,同步建设符合其等级要求的网络安全设施,包括自行软件开发。
d)建设完成后,组织对关键信息基础设施进行验收并将网络安全作为验收的重要内容。

  • 同步使用

关键信息基础设施运营者应:
a)同步运行安全设施,确保安全设施保持启用状态。
b)按照GB/T 22239安全运维管理相应等级的要求进行安全运维。
c)关键信息基础设施及其运行环境发生明显变化时,评估其风险,及时升级安全设施并实施变更管理。
d)对安全设施同步实施配置管理,包括制定配置管理计划,制定、记录、维护基线配置,保留基线配置的历史版本,便于必要时恢复历史配置。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

AI机器学习时序序列特征提取实现分类预测实战

发表于 2023-01-06 | 更新于: 2025-06-14 | 分类于 技术 | | 阅读次数:
字数统计: 2.3k | 阅读时长 ≈ 9

最近有位做医疗项目的同学咨询有一批人员的身高、体重、性别、年龄、心电图、是否有心脏病等数据是否可以根据这些数据预测某个人是否有心脏病的迹象。这当然是可以的,AI机器学习不就是干这事的吗?这是一个典型的分类算法。根据这些人体特征来判断是否存在潜在的疾病。问题是如何对心电图进行特征提取,提取出相关的特征,让模型进行学习和训练。

拿到数据后,第一步,我们首先来看一下数据。

一、数据探索

1、读入数据

导入numpy、pandas、matplotlib三大件,读入数据

1
2
3
4
5
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv('data_csv.csv')
df

在这里插入图片描述

数据集中有age年龄、ismale性别、Weight身高、Height体重、HRTrend心电图、label是否有心脏病(1,是有心脏病、0是无心脏病)
这里看到主要的几个关键性的指标。HRTrend是csv中载入的时候数据是文本字符串格式,还有nan及\n等字符串,我们要将这些数据进行清洗规则化,将其转化为数组。

2、数据处理

先拿一个样本数据来看看数据的情况。对它进行相应的处理,包括去掉回车换行符、去多余空格、然后以空格作为分隔形成数组。

1
2
3
4
5
6
7
HRTrend_Data=df['HRTrend'][1][1:len(df['HRTrend'][1])-1]
HRTrend_Data=HRTrend_Data.replace('\n','') #替换掉换行符
HRTrend_Data=HRTrend_Data.replace('nan',str(0)) #将nan补0
HRTrend_Data=re.sub(' +', ' ', HRTrend_Data).strip() #去掉多余的空格
HRTrend_Data=np.asarray([float(s) for s in HRTrend_Data.split(' ')]) #将字符串通过空格分隔,转换成数组
pd.DataFrame(HRTrend_Data).plot()
HRTrend_Data

在这里插入图片描述

这个图形不是很规则不平滑,看数据是因为异常值太多,后面的数据都是0,这些0都是因为数据为Non补充进来的,有可能是应为数据采集的时候某个点位没有采集到。我们需要将这些异常值给处理掉。
对于中间为0的,我们可以通过采用前值填充或者后值填充(也就是用前面的值或后面的值来替代为0的值),后面全部为0的部分要去掉。应为会影响到一些关键性的特征,如均值、50%的值、70%的值等。

1
2
df_HRTrend1=pd.DataFrame(HRTrend_Data)
df_HRTrend1.describe()

在这里插入图片描述

可以看到,这些异常值将会很大程度的影响一些关键特征,所以我们要处理异常值。

1
2
3
4
5
HRTrend_Data=np.trim_zeros(HRTrend_Data)  #去掉首尾的0
df_data1=pd.DataFrame(HRTrend_Data)
df_data1.replace(to_replace=0, method='ffill',inplace=True) #用前值替换掉中间的异常0
df_data1.plot()
df_data1.describe()

在这里插入图片描述

把刚对一个样本处理的过程写成一个函数,应用到所有的样本数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def procdata(df_dataclumn):
ary_data=df_dataclumn[1:len(df_dataclumn)-1]
ary_data=ary_data.replace('\n','')
ary_data=ary_data.replace('nan',str(0))
ary_data=re.sub(' +', ' ', ary_data).strip()
ary_data=np.asarray([float(s) for s in ary_data.split(' ')])
ary_data=np.trim_zeros(ary_data)
df_data=pd.DataFrame(ary_data)
df_data.replace(to_replace=0, method='ffill',inplace=True)
ary_data=df_data.values
return ary_data

df['HRTrend']=df['HRTrend'].map(procdata)
df['Weight'].replace(to_replace=0, method='ffill',inplace=True) #去异常值
df['Height'].replace(to_replace=0, method='ffill',inplace=True) #去异常值
df

在这里插入图片描述
找前六个样本看看效果

1
2
3
4
5
6
fig,axes = plt.subplots(2,3,figsize=(12,4))
i=0
for x in range(2):
for y in range(3):
i=i+1
axes[x,y].plot(df['HRTrend'][i])

在这里插入图片描述

二、特征工程及模型训练

方法一:通过描叙统计提取时序特征并进行模型训练

  • 特征提取

有量纲时序特征提取包括以内容。
在这里插入图片描述

可以看到,大部分内容都可以通过describe()获取。可以写个函数方法来获取相关的特征值。

1
2
3
4
5
6
7
8
9
10
def getdescribefeatures(data):
df_feature=pd.DataFrame(data)
df_feature=df_feature.describe().T
range=df_feature['max'][0]-df_feature['min'][0]
return range,df_feature['count'][0],df_feature['mean'][0],df_feature['std'][0],df_feature['min'][0],df_feature['25%'][0],df_feature['50%'][0],df_feature['75%'][0],df_feature['max'][0]

HRTrend_np=np.array(df['HRTrend'])
HRTrend_features_ary=[getdescribefeatures(d) for d in HRTrend_np]
df_HRTrend_features=pd.DataFrame(HRTrend_features_ary,columns=['HRTrend'+str(i) for i in range(len(HRTrend_features_ary[0]))])
df_HRTrend_features

在这里插入图片描述

将心电图提出的统计信息特征与年龄、性别、身高、体重等特征合并,形成特征集。

1
df_data=df[['age','ismale','Weight','Height','label']].join(df_HRTrend_features)

预留15个样本做最后的预测看效果。

1
2
df_train_data=df_data[0:len(df_data)-15]    #训练数据
df_predict_data=df_data[len(df_data)-15:len(df_data)] #用于预测的数据
  • 模型训练
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from sklearn.metrics import f1_score
from sklearn.metrics import recall_score
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

x_tt, x_validation, y_tt, y_validation = train_test_split(x, y, test_size=0.2)
# 将训练集再切分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x_tt, y_tt, test_size=0.25)

#将模型的名字和模型函数作为元组添加到列表当中存储;
models = []
models.append(("KNN",KNeighborsClassifier(n_neighbors=3))) #指定邻居个数
models.append(("SVM Classifier",SVC(C=1000)))
#可以通过参数C来控制精度,C越大要求精度越高; C——错分点的惩罚度

#循环调用所有模型进行训练、预测
for clf_name, clf in models:
clf.fit(x_train, y_train)
xy_lst = [(x_train, y_train), (x_validation, y_validation), (x_test, y_test)]
for i in range(len(xy_lst)):
x_part = xy_lst[i][0] # 为遍历中的第0部分
y_part = xy_lst[i][1] # 为遍历中的第1部分
y_pred = clf.predict(x_part)
print(i) # i是下标,0表示训练集,1表示验证集,2表示测试集
print(clf_name, "ACC:", accuracy_score(y_part, y_pred))
print(clf_name, "REC:", recall_score(y_part, y_pred))
print(clf_name, "F-score:", f1_score(y_part, y_pred))

结果如下:
在这里插入图片描述

SVM分类模型的效果要稍好于KNN的模型,但整体效果还不是很好。应该是提取的特征还是不够。我们来试下通过tsfresh提取时序特征并进行模型训练。

方法二:通过tsfresh提取时序特征并进行模型训练

  • 特征提取

tsfresh可以自动提取各种时间特征,可以参考官方文档,一般的取最大、最小、偏度、峰度等统计指标这些都自动化集成了。
https://tsfresh.readthedocs.io/en/latest/text/introduction.html
在这里插入图片描述

通过tsfresh提取时序特征代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
from tsfresh import extract_features
from tsfresh import select_features
dfx_HRTrend=pd.DataFrame()
for i in df.index:
df_i=pd.DataFrame(df['HRTrend'][i],columns=['HRTrend'])
df_i['id']=i
df_i['time']=np.array(range(1,len(df_i)+1))
df_i['label']=df['label'][i]
dfx_HRTrend=pd.concat(objs=[dfx_HRTrend,df_i])

dfx_xtracted_features = extract_features(dfx_HRTrend,column_id="id", column_sort="time")
dfx_xtracted_features

在这里插入图片描述

可以看到tsfresh自动提取了1574colums的特征,但是我们要选取与标签有相关性的特征。tsfresh可以自动做到这一点,通过tsfresh的select_features传入特征和标签来选择与标签有相关性的特征,

1
2
3
4
from tsfresh.utilities.dataframe_functions import impute
impute(dfx_xtracted_features)
df_HRTrend_features = select_features(dfx_xtracted_features, df['label'])
df_HRTrend_features

在这里插入图片描述

通过特征选择自动选取了有相关性的143个特征,比前面缩减了很多,有利于提高模型训练的效率和精度。
我们再来看一下模型训练的效果。
同样将心电图通过tsfresh提出的时序特征与年龄、性别、身高、体重等特征合并,形成特征集。

1
df_data=df[['age','ismale','Weight','Height','label']].join(df_HRTrend_features)

预留15个样本做最后的预测看效果。

1
2
df_train_data=df_data[0:len(df_data)-15]    #训练数据
df_predict_data=df_data[len(df_data)-15:len(df_data)] #用于预测的数据

模型训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from sklearn.metrics import f1_score
from sklearn.metrics import recall_score
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

x_tt, x_validation, y_tt, y_validation = train_test_split(x, y, test_size=0.2)
# 将训练集再切分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x_tt, y_tt, test_size=0.25)

#将模型的名字和模型函数作为元组添加到列表当中存储;
models = []
models.append(("KNN",KNeighborsClassifier(n_neighbors=3))) #指定邻居个数
models.append(("SVM Classifier",SVC(C=1000)))
#可以通过参数C来控制精度,C越大要求精度越高; C——错分点的惩罚度

#循环调用所有模型进行训练、预测
for clf_name, clf in models:
clf.fit(x_train, y_train)
xy_lst = [(x_train, y_train), (x_validation, y_validation), (x_test, y_test)]
for i in range(len(xy_lst)):
x_part = xy_lst[i][0] # 为遍历中的第0部分
y_part = xy_lst[i][1] # 为遍历中的第1部分
y_pred = clf.predict(x_part)
print(i) # i是下标,0表示训练集,1表示验证集,2表示测试集
print(clf_name, "ACC:", accuracy_score(y_part, y_pred))
print(clf_name, "REC:", recall_score(y_part, y_pred))
print(clf_name, "F-score:", f1_score(y_part, y_pred))

结果如下:
在这里插入图片描述

可以看到不管是KNN模型和SVM的模型都取得了不错的效果。

三、效果

最后我们来看一下,用预留的15个样本预测的效果。

1
2
3
4
5
6
7
8
9
10
11
pre_test_y=df_predict_data['label']
pre_test_x=df_predict_data.drop(columns='label')

for clf_name, clf in models:
for i in pre_test_x.index:
y_predict=clf.predict(pre_test_x.loc[[i]])
predict_result='预测错误!'
if y_predict==pre_test_y.loc[[i]].values:
predict_result='预测正确!'
print('第'+str(i)+'个样本'+clf_name+' 预测y='+str(y_predict)+'--实际 y='+str(pre_test_y.loc[[i]].values)+' - '+predict_result)
print('-'*10)

先是通过描叙统计提取时序特征并进行模型训练后模型预测的结果:
在这里插入图片描述

还是有不少预测错误了。
再来看通过tsfresh提取时序特征并进行模型训练后模型预测的结果:
在这里插入图片描述

可以看到预留的15个样本都预测正确,取得了不错的效果!

本文通过心电图分类模型介绍了从数据处理、时序特征提取、模型训练和效果评估。验证了对于小数据量,通过tsfresh提取时序特征,往往能够取得很好的效果。

全部源代码及数据集见:https://download.csdn.net/download/fullbug/87369380


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

Django+Celery+Flower实现异步和定时任务及其监控告警

发表于 2023-01-06 | 更新于: 2024-06-13 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2.7k | 阅读时长 ≈ 11

用Django框架进行web开发非常的快捷方便,但Django框架请求/响应是同步的。但我们在实际项目中经常会碰到一些耗时的不能立即返回请求结果任务如:数据爬取、发邮件等,如果常时间等待对用户体验不是很好,在这种情况下就需要实现异步实现,马上返回响应请求,但真正的耗时任务在后台异步执行。Django框架本身无法实现异步响应但可以通过Celery很快的实现异步和定时任务。本文将介绍如何通过Django+Celery+Flower实现异步和定时任务及其任务的监控告警。

常见的任务有两类,一类是异步任务,一类是定时任务(定时执行或按一定周期执行)。Celery都能很好的支持。

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:

  • 异步任务:将耗时的操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音频处理等等
  • 做一个定时任务,比如每天定时执行爬虫爬取指定内容

Celery 在执行任务时需要通过一个消息中间件(Broker)来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ、Redis或其他DB。

本文使用redis作为消息中间件和结果存储,在后面的通过数据库监控任务执行案例将介绍用到数据库作为结果存储。

一、在Django中引入Celary

1、安装库

1
2
3
pip install celery
pip install redis
pip install eventlet #在windows环境下需要安装eventlet包

2、引入celary

在主项目目录下,新建celary.py文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import os
import django
from celery import Celery
from django.conf import settings

# 设置系统环境变量,否则在启动celery时会报错
# taskproject 是当前项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'taskproject.settings')
django.setup()

celery_app = Celery('taskproject')
celery_app.config_from_object('django.conf:settings')
celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

在这里插入图片描述

在主目录的init.py中添加如下代码:

1
2
3
from .celery import celery_app

__all__ = ['celery_app']

在这里插入图片描述

3、在settings.py中设置celery的相关参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
###----Celery redis 配置-----###
# Broker配置,使用Redis作为消息中间件
BROKER_URL = 'redis://:redispassword@127.0.0.1:6379/0'

# BACKEND配置,使用redis
CELERY_RESULT_BACKEND = 'redis://:redispassword@127.0.0.1:6379/1'


CELERY_ACCEPT_CONTENT=['json']
CELERY_TASK_SERIALIZER='json'
# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'

# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24

# 时区配置
CELERY_TIMEZONE = 'Asia/Shanghai'

在这里插入图片描述

这时候Celery的基本配置完成了,可以实现并添加任务了。

二、实现异步任务

1、创建tasks.py

在子应用下建立各自对应的任务文件tasks.py(必须是tasks.py这个名字,不允许修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import datetime
from time import sleep
from celery import shared_task
import logging
logger = logging.getLogger(__name__)


@shared_task()
def task1(x):
for i in range(int(x)):
sleep(1)
logger.info('this is task1 '+str(i))
return x


@shared_task
def scheduletask1():
now = datetime.datetime.now()
logger.info('this is scheduletask '+now.strftime("%Y-%m-%d %H:%M:%S"))
return None

在tasks.py中我们定义了两个任务,这两个任务要用@shared_task装饰起来,否则celery无法管理。
在这里插入图片描述

为了放便执行我们通过views把这两个任务通过函数方法调用起来,用URL进行发布。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
views.py
from django.http import JsonResponse
from . import tasks
# Create your views here.


def runtask(request):
x=request.GET.get('x')
tasks.task1.delay(x)
content= {'200': 'run task1 success!---'+str(x)}
return JsonResponse(content)


def runscheduletask(request):
tasks.scheduletask1.delay()
content= {'200': 'success!'}
return JsonResponse(content)

在这里插入图片描述

在urls中加入路由进行发布

1
2
3
4
5
6
7
8
from django.urls import path

from taskapp import views

urlpatterns = [
path('task', views.runtask),
path('runscheduletask', views.runscheduletask),
]

在这里插入图片描述

在项目的主urls中加入子项目的urls
在这里插入图片描述

2、启动celery

在启动celery之前,先要启动redis服务,因为celery在settings中配置要用到redis作为消息中间件和结果存储。
windows环境下启动redis的命令为redis-server.exe redis.windows.conf

在控制台启动celery的worker

1
celery -A taskproject worker -l debug -P eventlet

在这里插入图片描述

启动django访问url调用任务,看异步效果
在这里插入图片描述

3、查看任务

控制台查看异步任务执行的情况,可以看web的url很快返回响应结果,后台控制台一直在执行异步任务。
在这里插入图片描述

三、实现定时任务

Celery实现定时任务也很方便

1、定义调度器

在settings.py中加入定时任务的定义就可以实现定时任务

1
2
3
4
5
6
7
8
9
10
11
from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
'every_5_seconds': {
# 任务路径
'task': 'taskapp.tasks.scheduletask1',
# 每5秒执行一次
'schedule': 5,
'args': ()
}
}

这里这个scheduletask1是前面tasks.py中定义的任务,当然也可以定义多个定时任务,如加一个task1,task1是有参数的,可以在’args’: ()中传入参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CELERYBEAT_SCHEDULE = {
'every_5_seconds': {
# 任务路径
'task': 'taskapp.tasks.scheduletask1',
# 每5秒执行一次
'schedule': 5,
'args': ()
},
'every_10_seconds': {
# 任务路径
'task': 'taskapp.tasks.task1',
# 每10秒执行一次,task1的参数是5
'schedule': 10,
'args': ([5])
}
}

在这里插入图片描述

这里定义了task1是10秒执行一次,传入的参数是5。

2、启动beat

需要保持worker进程,另外开一个控制台启动beat

1
celery -A taskproject beat -l debug

3、查看任务

启动任务后看控制台打印的日志task1和scheduletask1都按计划定时执行了。
在这里插入图片描述

三、通过数据库配置定时任务

虽然通过settings.py的配置可以实现定时任务的配置,做为实际项目中可能还是不够实用,更加工程化的做法是将定时任务的配置放到数据库里通过界面来配置。同样Celery对此也提供了很好的支持,这需要安装django-celery-beat插件。以下将介绍使用过程。

1、安装djiango-celery-beat

1
pip install django-celery-beat

2、在APP中注册djiango-celery-beat

1
2
3
4
INSTALLED_APPS = [
....
'django_celery_beat',
]

3、在settings.py中设置调度器及时区

在settings.py中屏蔽到原来的调度器,加入

1
CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler'

在这里插入图片描述

在setings.py中设置好语言、时区等

1
2
3
4
5
6
7
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_TZ = False

4、进行数据库迁移

1
python manage.py migrate django_celery_beat

5、分别启动woker和beta

在两个控制台分别启动woker和beta

1
celery -A taskproject worker -l debug -P eventlet
1
celery -A taskproject beat -l debug

6、启动django服务,访问admin的web管理端

访问 http://localhost:8000/admin/ 可以看到周期任务的管理菜单,管理定时任务非常方便。
在这里插入图片描述

7、配置定时任务

点击“间隔”
在这里插入图片描述

点击“增加间隔”来增加定时任务的配置,增加一个5秒执行一次的定时器。
在这里插入图片描述

看到有个每5秒的定时器
在这里插入图片描述

这时可以用这个定时器去新建调度任务了。选择周期性任务,点击“增加周期性任务”
在这里插入图片描述

填入任务名,选择需要定时执行的任务
在这里插入图片描述

因为task1需要参数,在后面参数设置中进行参数的设置。
在这里插入图片描述

保存后可以看到新加了一条“每5秒执行一次task1”的调度任务。
在这里插入图片描述

8、查看调度效果

在woker和beta的控制台都可以看到有定时任务执行的信息,说明任务被成功调度执行了。
在这里插入图片描述

四、通过django的web界面监控任务执行情况

在控制台监控任务执行情况,还不是很方便,最好是能够通过web界面看到任务的执行情况,如有多少任务在执行,有多少任务执行失败了等。这个Celery也是可以做到了,就是将任务执行结果写到数据库中,通过web界面显示出来。这里要用到django-celery-results插件。通过插件可以使用Django的orm作为结果存储,这样的好处在于我们可以直接通过django的数据查看到任务状态,同时为可以制定更多的操作,下面介绍如何使用orm作为结果存储。

1、安装django-celery-results

1
pip install django-celery-results

2、配置settings.py,注册app

1
2
3
4
INSTALLED_APPS = (
...,
'django_celery_results',
)

3、修改backend配置,将Redis改为django-db

1
2
3
4
# BACKEND配置,使用redis
#CELERY_RESULT_BACKEND = 'redis://:12345678@127.0.0.1:6379/1'
# 使用使用django orm 作为结果存储
CELERY_RESULT_BACKEND = 'django-db' #使用django orm 作为结果存储

4、迁移数据库

1
python manage.py migrate django_celery_results

可以看到创建了django_celery_results相关的表
在这里插入图片描述

5、查看任务

启动django服务后,执行异步和定时任务,就可以在管理界面看到任务的执行情况,执行了哪些任务,哪些任务执行失败了等。
在这里插入图片描述

五、通过Flower监控任务执行情况

如果不想通django的管理界面监控任务的执行,还可以通过Flower插件来进行任务的监控。FLower的界面更加丰富,可以监控的信息更全。以下介绍通过Flower来进行任务监控。

1、安装flower

1
pip install flower

2、启动flower

1
celery -A taskproject flower --port-5566

在这里插入图片描述

3、使用flower进行任务监控

在这里插入图片描述

点击失败的我们可以看到执行失败的详情,这里是故意给task1的参数传了个‘a’字符,导致它执行报错了。可以看到任务执行的报错信息也展示出来了。
在这里插入图片描述

六、实现任务异常自动邮件告警

虽然可以通过界面来监控了,但是我们想要得更多,人不可能天天盯着界面看吧,如果能实现任务执行失败就自动发邮件告警就好了。这个Celery当然也是没有问题的。
通过钩子程序在异常的时候触发邮件通知。

1、加入钩子程序

对tasks.py的改造如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import datetime
from time import sleep
from celery import shared_task
from celery import Task
from django.core.mail import send_mail
import logging
logger = logging.getLogger(__name__)

class MyHookTask(Task):
def on_success(self, retval, task_id, args, kwargs):
info=f'任务成功-- 0task id:{task_id} , arg:{args} , successful !'
logger.info(info)
send_mail('celery任务监控', info, 'sendmail@qq.com', ['tomail@qq.com'])

def on_failure(self, exc, task_id, args, kwargs, einfo):
info=f'任务失败-- task id:{task_id} , arg:{args} , failed ! erros: {exc}'
logger.info(info)
send_mail('celery任务监控异常', info, 'sendmail@qq.com', ['tomail@qq.com'])

def on_retry(self, exc, task_id, args, kwargs, einfo):
logger.info(f'task id:{task_id} , arg:{args} , retry ! erros: {exc}')


@shared_task(base=MyHookTask, bind=True)
def task1(self,x):
for i in range(int(x)):
sleep(1)
logger.info('this is task1 '+str(i))
return x


@shared_task
def scheduletask1():
now = datetime.datetime.now()
logger.info('this is scheduletask '+now.strftime("%Y-%m-%d %H:%M:%S"))
return None

在这里插入图片描述

2、重启服务

将work和beta服务关掉,在两个控制台分别重新启动woker和beta

1
celery -A taskproject worker -l debug -P eventlet
1
celery -A taskproject beat -l debug

3、验证效果

在任务成功或失败的时候发邮件通知。
在这里插入图片描述

任务执行成功通知
在这里插入图片描述

任务执行异常告警通知
在这里插入图片描述

Django如何发送邮件见 https://blog.csdn.net/fullbug/article/details/128495415

至此,本文通过几个简单的应用介绍了Django+Celery+Flower实现异步和定时任务及其监控告警。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

通过Django发送邮件

发表于 2022-12-30 | 更新于: 2024-06-13 | 分类于 技术 | | 阅读次数:
字数统计: 926 | 阅读时长 ≈ 3

通过Django发送邮件非常的简单,在Python中已经内置了一个smtplib邮件发送模块,Django在此基础上进行了简单地封装,我们可以在Django的环境中方便的发送邮件。大部分邮件发送成功主要是邮件的参数配置,本文以常用的126邮箱和QQ邮箱为例介绍Django发送邮件的配置,其他提供smtp邮件服务的邮箱都是一样的。

一、Django邮件配置

用Django发送邮件需要告诉你的邮件服务器相应的参数配置,需要在settings.py中进行配置好。
默认情况下,使用配置文件中的EMAIL_HOST和EMAIL_PORT设置SMTP服务器主机和端口,EMAIL_HOST_USER和
EMAIL_HOST_PASSWORD是用户名和密码。如果设置了EMAIL_USE_TLS和EMAIL_USE_SSL,它们将控制是否使用相应的加密链接。
典型的配置如下:

1
2
3
4
5
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.126.com' #126邮箱的邮箱服务地址
EMAIL_PORT = 25 #端口,大部分都是默认25
EMAIL_HOST_USER = 'yourmail@126.com' #这里是你的邮箱账号
EMAIL_HOST_PASSWORD = 'yourpassword' #注意这里不能用你邮箱账号的密码,而要用申请的设备授权码。

这里要注意的两个地方,一个是EMAIL_PORT端口、一个是EMAIL_HOST_PASSWORD密码。
端口一般默认是25,但有些邮箱改了默认端口或需要用加密链接465、578端口,可以从邮件服务商查到。
密码以前可以用邮箱账号密码,但这几年随着安全要求的提高,大部分主要的邮件服务提供商都要用申请的授权码进一步加强安全系数。
这里介绍这些关键的信息如何在邮件服务商获取。

注意EMAIL_HOST_PASSWORD这里不能用你邮箱账号的密码,而要用申请的设备授权码。

126邮箱

进入到邮箱配置界面,点击“POP3/SMTP/IMAP”,注意要开启SMTP。
126邮箱配置界面

授权码是用于登录第三方邮件客户端的专用密码,点击”新增授权密码”,降会弹出一个账号安全验证,扫描后可以快速的发短信。
账号安全验证界面

用你的注册手机发完短信后点击”我已发送”就会弹出一个授权码的窗口,要把这个授权码记下来,这个窗口只显示一次。
授权码显示界面

QQ邮箱

进入到QQ邮箱WEB界面后点击“设置”,点击“邮件设置”的“账户”页签拉到“账户安全”处就可以看到相关的SMTP服务信息

QQ邮箱配置界面

点击“生成授权码”,将弹出验证密保的界面。
验证密保界面

根据提示发送短信后,点击我已发送,将会弹出生成授权码的界面显示授权码。
授权码生成界面

如果需要SSL加密方式,可以进一步查看服务商的SMTP服务说明
如QQ邮箱的服务说明 https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=331
服务说明界面

看到使用SSL,端口号是465或587

1
2
3
4
5
6
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com' #QQ邮箱的smtp服务器
EMAIL_PORT = 465 #端口为465或587
EMAIL_USE_SSL = True #SSL加密方式设置为True
EMAIL_HOST_USER = 'yourmail@qq.com' #这里是你的邮箱账号
EMAIL_HOST_PASSWORD = 'yourpassword' #注意这里不能用你邮箱账号的密码,而要用申请的设备授权码。

二、测试发送邮件

可以用django的环境在shell中测试。

1
2
3
python manage.py shell
from django.core.mail import send_mail
send_mail('test','this is test mail','yourmail@qq.com',['yourmail@126.com','yormail@qq.com'])

在这里插入图片描述

如果反回1就表示发送成功了, 查收邮件到达。

如果发送不成功,请仔细核对邮箱服务的相关配置,一般来说与django无关。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

安全托管与重保安全服务

发表于 2022-12-28 | 更新于: 2024-06-13 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 1k | 阅读时长 ≈ 3

近年来,高新技术数字经济快速发展,数字化转型成为各个行业高质量发展的重要引擎和创新路径。网络安全作为数字化建设的安全基石,却面临着网络安全人才缺口不断攀升的直接挑战。各安全公司依托自己网络安全经验的人才优势向客户提供各类安全服务,最常见的就是安全托管和重保安全。

安全托管服务与重保安全服务都是为客户提供安全服务,这两者有啥区别呢?

一、安全托管服务

安全托管服务(Managed Security Service,MSS),是由Gartner于2011年提出,简单来讲,即网络安全厂商通过自身的安全运营服务,包括人员、工具、平台等,为其用户提供7*24小时的安全托管服务。MSS安全托管服务最直接的目的,就是解决用户自身安全能力不足的问题,将专业的事情交给专业的人来做。说白了其实就是企业将自身的安全运营外包给有能力的安全厂商,解决自身安全运营能力不足的问题。

二、重保安全服务

重保安全服务(Cybersecurity in Important Period, CIP),是指在特殊时期(如HVV等)、重要活动(如两会等)、重大节日(如国庆等)期间为用户构建全方面的重要敏感时期的安全保障服务。保障网络基础设施、重点网站和业务系统安全,提供全方位的安全防守建设咨询以及事前、事中、事后的全面安全建设托管服务,确保企业客户的业务系统能够在重大活动期间安全平稳运行。

三、安全托管服务与重保安全服务的区别

从安全托管服务与重保安全服务的概念和定义上,个人理解安全托管服务与重保安全服务还是有所区别的。

一般来说,安全托管服务(MSS)服务侧重于管理和运营,以保障企业IT业务稳定运行为目的,主要是日常的安全运营。而重保安全更接近实战化主要侧重于重保期间的防护值守,有重点的企业客户的业务系统能够在重大活动期间安全平稳运行。

拿平时我们见到社会安保来类比,日常安全运营就是我们平时看到的日常治安巡逻;重保就是比如国庆期间、两会其间有针对性的加大安保防范力度如特警武装上岗执勤、某些重要场所限制人流、加强舆情监控等必要的防控手段。

  • 从具体的服务内容来看:

安全托管服务主要是日常安全运营相关的内容如:资产的定期梳理、暴露面的检测、定期的漏扫、漏扫后的安全加固整改、安全监测、事件协助处置、安全策略定期优化等。

重保安全服务主要是针对重保时期有重点的安全保障更贴近实战化如:准备阶段的资产清查、暴露面识别、暴露面收敛等;重保初期的重点系统(或靶标系统)专项加固、情报收集、攻击阻断演练等;重保阶段的安全事件分析、响应处置、溯源反制、防守报告等。

  • 从人员配置来看:

重保安全服务的人员配置不管是从人员数量还是个人网络安全专业水平来看都要比安全托管服务的高。一般来说重保安全服务的核心人员都会要求有攻防对抗能力。可以想像一下普通安保人员与武装特警的区别。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

认识XDR-扩展威胁检测与响应平台

发表于 2022-10-13 | 更新于: 2024-06-13 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.6k | 阅读时长 ≈ 8

近年安全圈XDR的概念非常火,是近几年热点的安全技术之一,究竟什么是XDR,XDR核心能力是什么?能够解决什么问题,XDR与EDR、NDR关系和区别又是什么?让我们带着这些问题一起来认识一下XDR。

一、什么是XDR

XDR 于 2018 年由 Palo Alto 首席技术官 Nir Zuk 提出,2020-2021 年连续入选 Gartner 端点安全、安全运营技术成熟度曲线,目前处于创新启动期。

XDR全名是Extended Detection and Response(扩展检测和响应),因为缩写与EDR重名了,所以就取了Extended第二个字母X,缩成了XDR。

Gartner给出的XDR定义为:XDR是一种基于SaaS的、绑定于特定供应商的安全威胁检测和事件响应工具,它将多个安全产品集成到一个统一了所有许可安全组件的内聚安全运营系统中。

通常情况下,可以认为XDR是一个融合了多种安全检测、响应能力的平台框架,只要是为了解决威胁检测与响应的问题能力模块,都可以往里装。它需要将多个安全产品能力有机的结合在一起,有统一的数据格式、策略、交互界面。相对于EDR(端点的检测与响应)和NDR(网络的检测与响应)来说,特别的强调X的概念,也就是可以扩展(Extended)的检测与响应。这里X覆盖了云、网、端、威胁情报等,EDR和NDR及其他的检测设备都可以作为XDR的能力模块为XDR提供数据来源和检测手段。

二、XDR解决什么问题

近期, Gartner正式发布了2022安全运营技术成熟度曲线(Hype Cycle),正如大家所预测的那样,XDR终于站上了Peak of Inflated Expectations的顶端,成为安全运营体系中最炙手可热的技术之一,具体如下图所示:

2022安全运营技术成熟度曲线

那么在企业安全运营过程中究竟有什么困惑,XDR又能解决什么问题呢?

1、安全运营的困惑

  • 单兵作战/数据孤岛

企业虽然有了SIEM/SOC等日志类数据分析平台,或是IDS、IPS、WAF、防火墙、EDR等单点安全设备,但前者无法理解下游检测设备告警,数据多而不准,安全误报多;后者获取的数据又有限,不同设备数据还无法紧密集成,最后变成了真实风险看不到,出现威胁防不了。

  • 告警疲劳,误报多

安全人员每天都会收到来自不同安全设备的上万条威胁告警,而头疼的是,绝大多数(90%以上)都并非真实威胁,所以安全人员不是身体在处理误报的路上,就是精神在遭受误报的折磨,压力非常之大。

  • 全局态势不可见

企业虽然买了一堆的安全设备,这些设备都产生了相应的告警,但是没有形成统一的全局的安全风险态势,对于安全主管来说要重点防范哪些地方,企业的安全建设还有哪些短板,这些都不可以知不可见。

  • 响应处置能力弱

发生网络安全事件以后,无法有效溯源,快速的处置,尤其是多设备的联动处置,大多还停留在手工处置的阶段,处置效率先对比较低,不及时。

2、XDR的作用

XDR通过统一的交互框架、统一的数据标准、统一的数据存储方式进行安全数据采集、安全威胁集中分析、安全事件统一处置、响应编排。

XDR的核心作用在于能够跨越不同数据源与IT架构,集中汇集云、网、端、威胁情报等多源安全数据/工具。通过大数据与人工智能、用户行为分析等智能分析手段,对安全数据/事件进行关联分析,还原攻击路径,达到对整个攻击面的全面可视,解决安全孤岛的问题。基于动态更新的事件库与预置处置场景将产出的告警进行自动化编排与分诊,实现自动化响应。解决安全运营过程中数据孤岛、告警疲劳、全局态势不可见、响应处置能力弱的问题,更重要的是将企业安全运营水平和标准化产品挂钩,而非依赖不稳定的个人技术水平。

XDR的作用

三、XDR与EDR、NDR的区别

EDR从端点侧做威胁检测,确实能检测到攻击的准确信息,但是端点检测这种方式需要在用户主机上安装检测agent程序,无法覆盖用户所有的资产。并且端点检测的部署成本相比网络检测也更高,对于端点的操作系统、硬件配置、网络情况都有要求。

NDR从网络侧做威胁检测,检测到的更多都是攻击的特征或者攻击意图,此时攻击很有可能并未真正发生,或者并未造成严重后果。如果全部转化为威胁事件,则会造成告警风暴,给运营带来困难。

所以EDR的特点是检测的深但是覆盖面窄,而NDR的特点是检测的浅但是覆盖面广。

XDR则结合了这两者的全部优点,对于重点资产可采用端点检测方式,对于其他资产可采用网络检测方式。XDR平台会将这两种能力检测到的原始事件信息进行自动化关联,最终可将这些疑似的攻击信息,关联分析形成精准的威胁告警事件。

四、XDR的架构和核心能力

1、XDR的架构

因为XDR是一个融合了多种安全检测、响应能力的平台框架,XDR的架构其关键组件包括前端组件(感应器,主要负责数据采集及检测)和后端平台组件(主要负责数据的汇聚、分析、威胁检测、响应处置)

XDR的架构
XDR前端组件,由生成安全遥测数据的“触角”(感应器)组成,这些触角包括但不限于EDR(终端检测与响应-Endpoint Detection and Response)、EPP(终端防护平台-Endpoint Protection Platforms)、NDR(流量检测与响应平台-Network Detection and Response)、SSE(安全服务边缘-Security Services Edge)、CWPP(云工作负载安全防护平台-Cloud Workload Protection Platforms)、蜜罐、邮件安全。

而XDR的后端平台,则是吸收所有关键位置的遥测数据、日志、威胁上下文信息,之后再对所有的数据进行关联、高级分析、从而完成威胁检测、调查分析、攻击溯源、工具编排、自动化响应等工作。

从整体架构上XDR可以看成是融合了各安全能力组件(EDR、NDR等)+SDC(安全数据中心)+SIEM/SA(安全信息事件管理/态势感知)+SOAR(安全编排与自动化响应)形成的一个安全运营系统。

2、核心能力

XDR核心能力包括数据集成、检测技术、可视化、编排响应技术。

  • 安全数据全面集成

对不同安全设备的数据进行全面的采集包括:内部(资产、脆弱性)、外部(流量、日志)以及云端威胁情报接入等相关安全数据的全面采集,汇聚、分析。

  • 安全威胁深度检测

对多源安全告警进行关联分析、规则分析、情报分析、机器学习等,发现潜伏的高级持续性威胁,提升告警检出率和准确率。

  • 安全态势集中展示

告警可视、事件可视、攻击可视,从多安全事件、攻击方向、攻击趋势、影响范围等多维度多视角进行态势可视化呈现。

  • 安全事件快速处置

通过可视化剧本编排,快速实现人员、流程、工具的有效协同,对接联动安全防护设备,在安全事件发生时自动下发阻断策略,并在必要时下发通知预警,及时完成安全闭环。

XDR成熟度模型如下:
XDR成熟度模型

五、XDR应用场景

XDR集中汇集云、网、端、威胁情报等多源安全数据/工具,解决安全运营过程中数据孤岛、告警疲劳、全局态势不可见、响应处置能力弱的问题。可以有效应用于企业常态化安全运营及重保攻防实战对抗场景。

XDR威胁检测联动响应示意图

  • 日常安全运营场景

日常安全运营,通过XDR提升安全运营的威胁检测能力和响应效率。
精准响应:更好的检测效果及响应能力,解决原有海量告警导致事件难以有效检测、溯源深度不足导致响应效果差的问题,有效应对攻防对抗加剧带来新的安全风险。
风险管理:从被动事件响应转向有计划的风险管理,预防重大安全事件。
处置闭环:采用简单有效的方式开展安全分析、管理、处置工作,实现事件处置的有效闭环管控。
态势可见:安全态势统一呈现,安全运营有地放矢,哪里不足补哪里。

  • 攻防实战对抗场景

攻防实战,通过XDR实现异构可扩展的威胁检测响应能力,进行快速响应、加固优化安全措施、攻击反制。
检测深度:更精准的高级威胁检测和安全事件溯源能力。
检测广度:拥有丰富的数据,包括事件完整的上下文信息、原始报文等供客户深度挖掘;全方位的的威胁数据采集,全面的威胁检测分析,全局的态势呈现。
敏捷响应:可进行快速响应、加固优化安全措施、攻击反制。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

Django自定义manage.py命令实现hexo博客迁移

发表于 2022-07-27 | 更新于: 2024-06-13 | 分类于 技术 | | 阅读次数:
字数统计: 1.2k | 阅读时长 ≈ 4

实现了hexo的md文件格式解析,通过什么方式怎么来迁移hexo的博客到django的博客呢?开始想到的是通过Django的manage.py的shell命令,通过shell可以执行写好的python脚本进行hexo的md文件格式解析并入库。后来想想为啥不直接自定义一个manage.py的命令直接进行迁移呢?就如我们新建Django工程迁移数据库一样,执行python manage.py migrate来迁移数据库。我们可以定义python manage.py xxx来执行的迁移hexo博客。

自定义Django-admin命令分三步:创建management文件夹、编写命令代码、测试验证

一、创建management文件夹

自定义的Django-admin管理命令本质上是一个python脚本文件,它的存放路径必须遵循一定的规范,一般位于app/management/commands目录。整个文件夹的布局如下所示:
注意app要在setting中注册
在blog/management/commands包下面创建transblog.py文件

在这里插入图片描述

这里有两个要注意的地方:

1、app要在setting中注册。如blog在setting中注册了所以可以在blog/management/commands包下面创建transblog.py文件,api和common都没有在setting中注册所以在这两个目录下创建的不会作为管理命令生效。
2、创建的management/commands是Python包,不是单纯的目录,区别就是目录里必须有init.py文件,空文件都可以。

二、编写命令代码

创建命令管理文件后就可以在该文件中编写命令代码了。
每一个自定义的管理命令本质是一个Command类, 它继承了Django的Basecommand或其子类, 主要通过重写handle()方法实现自己的业务逻辑代码,而add_arguments()则用于帮助处理命令行的参数,如果运行命令时不需要额外参数,可以不写这个方法。
transblog.py的参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# -*- coding: utf-8 -*-
"""
:author: XieJava
:url: http://ishareread.com
:copyright: © 2021 XieJava <xiejava@ishareread.com>
:license: MIT, see LICENSE for more details.
"""
import os

from blog.models import BlogPost,BlogCategory,Tag
from utils.parseblog import parseblog
from django.core.management.base import BaseCommand

class Command(BaseCommand):
help='读取指定目录的.md文件解析至ishareblog'

def add_arguments(self, parser):
parser.add_argument('--path',help='输入.md文件的目录')
parser.add_argument('--file',help='输入.md文件的路径')

def handle(self, *args, **options):
inputfile = input('请输入指定的目录路径或.md文件路径:')
if inputfile.find('.md') > 0:
self.transblogbyfile(inputfile)
else:
self.transblogbypath(inputfile)
if options['path']:
self.transblogbypath(options['path'])
if options['file']:
self.transblogbyfile(options['file'])

'''读取目录解析md文件并写入数据库'''
def transblogbypath(self,filepath='',):
try:
files = os.listdir(filepath)
for file in files:
if file.find('.md') > 0:
blog_file = os.path.join(filepath, file)
self.transblogbyfile(blog_file)
except FileNotFoundError as e:
print('请确认输入是否正确。',e)

'''读取md文件入库'''
def transblogbyfile(self,blogfile=''):
blog_info = parseblog(blogfile)
filename=os.path.basename(blogfile)
#判断是否存在相同的title
qs=BlogPost.objects.filter(title=blog_info['title'])
if len(qs)==0:
category = None
tag_objs = []
if 'categories' in blog_info:
categories=blog_info['categories']
if len(categories)>0:
category_title = categories[0]
category_qs=BlogCategory.objects.filter(title=category_title)
if len(category_qs)>0:
category=category_qs[0]
if 'tags' in blog_info:
tags=blog_info['tags']
for tag in tags:
tag_obj,b=Tag.objects.get_or_create(tag=tag)
print(tag_obj.id)
tag_objs.append(tag_obj)
blog = BlogPost()
blog.title = blog_info['title']
blog.content = blog_info['content']
blog.isShow = 1 #默认显示
blog.summary=blog.content[0:200] #默认提取内容的前200个字作为摘要
blog.category=category
blog.blogSource = filename
blog.pubTime=blog_info['date']
blog.save()
if len(tag_objs)>0:
blog.tags.add(*tag_objs)
print(filename + '读取解析入库成功!')
else:
print(blog_info['title']+'已经存在!')

代码很简单,就是根据读取命令行的参数,这个参数就是需要迁移hexo的.md文件的目录或文件路径,读取目录或文件路径进行文件的解析,并写入到数据库。
.md文件的解析参考:Python二十行代码实现hexo的md文件格式解析

三、测试验证

命令代码写完后就可以进行测试了。
在命令行输入python manage.py 可以看到自定义的transblog已经加入到管理命令了

transblog已经加入到管理命令

输入 python manage.py transblog -h
会提示命令的参数和用法:
管理命令帮助

如执行 python manage.py transblog 会提示”请输入指定的目录路径或.md文件路径:”

1
2
(venv) PS D:\Python\study\pythonproject\ishareblog\ishareblog> python manage.py transblog
请输入指定的目录路径或.md文件路径:

我们输入需要迁移的.md文件或路径
如:E:\CloudStation\personal\xiejavablog\myhexo\myblog\source_posts\2022-07-27-Python二十行代码实现hexo的md文件格式解析.md
不出意外的情况下控制台会打印“XXXX.md读取解析入库成功!”的信息
执行效果

访问博客,可以看到文章已经迁移过来了
执行效果
全部代码仓库:https://gitee.com/ishareblog/ishareblog


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

Python二十行代码实现hexo的md文件格式解析

发表于 2022-07-27 | 更新于: 2024-06-13 | 分类于 技术 | | 阅读次数:
字数统计: 521 | 阅读时长 ≈ 2

最近用django+Vue实现了一个博客应用,原来的hexo的博客用着也挺好,想继续留着用,于是就想将hexo生成的.md的博客内容文件解析后直接写到django的博客数据库里做同步显示。

hexo生成的.md文件内容主要分两部分,一部分是博客的信息、一部分是博客内容,博客信息包括标题、目录、标签、发布日期等,博客内容就是具体博客写的内容主体了。
hexo生成的.md文件内容

其中博客信息通过”—“来区分,夹在两个”—“块之间。博客的信息是yaml来描叙的需要解析并提取出相应的字段及内容,博客内容就更简单了直接是markdown描叙的不需要再解析了。
这里要做的事情就是提取两个”—“符号之间的内容,并解析相应的字段,提取两个”—“符号后面的内容作为博客的内容,形成字典,便于后面的入库。

代码示例如下:
yaml的解析可以直接用Python的PyYAML库

1
pip install PyYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# -*- coding: utf-8 -*-
"""
:author: XieJava
:url: http://ishareread.com
:copyright: © 2021 XieJava <xiejava@ishareread.com>
:license: MIT, see LICENSE for more details.
"""
import yaml

'''将md文件转成blog对象'''
def parseblog(blog_md_file):
#读md文件
md_f = open(blog_md_file, "r",encoding='utf-8')
md_f_str=md_f.read()
#解析两个---之间的内容
pattern='---'
blog_data={}
pattern_list=list(pattern_search(md_f_str, pattern))
if len(pattern_list)>=2:
blog_info_str=md_f_str[pattern_list[0]+len(pattern):pattern_list[1]]
blog_data=yaml.load(blog_info_str,Loader=yaml.SafeLoader)
blog_data['content']=md_f_str[pattern_list[1]+len(pattern):]
md_f.close()
return blog_data

'''分割符号匹配检索'''
def pattern_search(string,pattern):
index=0
while index<len(string)-len(pattern):
index=string.find(pattern,index,len(string))
if index==-1:
break
yield index
index+=len(pattern)-1

if __name__ == '__main__':
blog_data=parseblog('E:\\CloudStation\\personal\\xiejavablog\\myhexo\\myblog\\source\\_posts\\2022-07-19-Vue3解析markdown解析并实现代码高亮显示.md')
print(blog_data)

效果:
可以看到hexo的md文件正确解析出来,形成字典。后续可以直接进行入库操作了。

解析效果

Python的库还是很丰富实用的,用Python二十行代码就实现hexo的md文件格式解析。

源代码仓库:https://gitee.com/ishareblog/ishareblog

<1…121314…22>
XieJava

XieJava

214 日志
11 分类
27 标签
RSS
GitHub
友情链接
  • 爱分享读书
  • CSDN
  • 豆瓣
© 2025 XieJava | Site words total count: 434.9k

主题 — NexT.Muse
0%