XieJava's blog

记录最好的自己


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

网络安全之资产及攻击面管理

发表于 2023-03-05 | 更新于: 2025-08-10 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 3.2k | 阅读时长 ≈ 10

“摸清家底,认清风险”做好资产管理是安全运营的第一步。那么什么是资产,资产管理的难点痛点是什么,如何做好资产管理,认清风险。带着这些问题我们来认识一下资产及攻击面管理。

一、资产的定义

《GBT 20984-2007信息安全技术信息安全风险评估规范》中,对于资产的定义为“对组织有价值的信息或资源,是安全策略保护的对象”。

对于网络空间资产来说,这里的资产是指赛博空间中某机构所拥有的一切可能被潜在攻击者利用的设备、信息、应用等数字资产。具体对象包括但不限于硬件设备、云主机、操作系统、IP地址、端口、证书、域名、Web应用、业务应用、中间件、框架、机构公众号、小程序、App、API、源代码等。概括来说,只要是可操作的对象,不管是实体还是属性。都可以称之为“网络空间资产”。
安全资产视图

借用“魔方安全”的图,一切可操作对象和属性,都是资产。

二、资产管理的挑战

通过上面的定义和图示,可以看到其实网络空间资产,所涉及的覆盖面特别广,给企业资产管理安全运营带来的巨大的挑战:
1、对象多
按数字资产类型划分如网站、IP、域名、移动门户和云服务等一切可能被潜在攻击者利用的设备、信息、应用等都是网络空间资产。所以资产管理需要纳管的类型多,且随着业务的互联网化、社交化,导致资产及暴露面快速增长。
2、分布广
随着数字化应用的深入,资产分布在多个数据中心、私有云、公有云、混合云、边缘计算和物联网等各种基础设施环境中,照成了资产信息割裂碎片化,给资产的统一管理带来了困难。
3、变化快
随着数字化转型业务发展和新型IT技术应用,为快速响应市场和业务需求,互联网暴露资产无时无刻都在跟着生产运营动态变化。
4、更隐蔽
影子资产的存在,包括钓鱼欺诈网站、暗网交易数据、用户信息泄露、代码仓库等外部隐藏的企业资产,给企业经济或商誉上带来更大的伤害。

三、解决方案

一切可能被潜在攻击者利用的设备、信息、应用等都是网络空间资产。你永远都无法知道攻击者如何利用这些网络空间资产进行攻击。

所以摸清家底是第一步,要搞清楚自己的资产都有哪些,分布在那里,有哪些漏洞风险。这里互联网暴露资产及影子资产尤为关键。影子IT(shadow it):指那些不在企业和组织IT部门掌控下的IT设备、软件及服务。影子资产就是影子IT中资产。互联网暴露面是网络攻击的入口,是网络安全运营的第一道防线;影子资产的存在更是让安全运营人员防不胜防,因为“你无法保护你看不见的东西”。为了解决这些问题业界推出了攻击面管理的概念。

攻击面管理以保护组织数字资产安全为出发点,聚焦在攻击者视角去审视网络空间内不同形态种类的资产所组成的攻击暴露面,同时特别强调“可观测性”、“可运营”,这意味着资产的全面性可度量、风险可度量、响应处置可度量。

攻击面管理的包括暴露面资产全面发现、资产脆弱性风险识别、多源数据融合分析、专项暴露面收敛。

1、暴露面的全面发现

暴露面的发现主要以攻击者视角为主,涵盖外部信息、网络资产等维度。

外部信息包括攻击者能够收集到的机构信息、在开源代码共享平台上的代码、外部接口等。

  • 机构信息收集

潜在攻击者首先会搜集用户的机构信息,搜集维度包括但不限于总部及分支机构名称、品牌、安全管理制度、业务运行时间、集团行政架构、各分支机构间的关系等等;针对高权限的IT管理人员,重点搜集姓名、邮箱、手机号、VPN账户、昵称、社会关系等等;搜集渠道主要有各大搜索引擎、天眼查类平台、网盘文库、官网、公众号、钉钉群、微信群、代码共享平台等。因此,安全团队可以通过外部攻击面发现平台,对此类信息做持续周期性的发现。先于攻击者发现此类资产,为响应收敛争取时间。

  • 源代码发现与收敛

代码共享平台存在隐匿的攻击暴露面,例如管理后台URL、VPN账户密码等,开发运维人员因缺乏安全意识,无意中将此类敏感信息上传至GitHub、Gitee等代码共享平台,为信息安全事故埋下导火索。攻击者主要是以用户机构的业务关键字、品牌名称、公司名称、IT人员的个人GitHub账户等渠道搜集这类信息,因此安全团队应以技术监测手段与内部行政管理相结合的方式,对此类攻击暴露面进行持续发现、收敛。

  • 外部接口管理

除了代码平台,还有一类常被忽视的攻击暴露面是外部接口,如与合作伙伴或第三方平台的API数据接口,与微信公众号菜单对接的URL、小程序或H5中隐含的数据接口等。这类外部接口,开发测试使用过后,即随着项目结束而被遗忘,极易成为潜在的攻击暴露面。同代码平台监测一样,安全团队应当以“技术+管理”相结合的方式,对此进行持续发现、收敛。

  • 网络资产攻击面覆盖

通过扫描探测、流量监听、主机代理、特征匹配、其他CMDB系统对接等多种方式,持续动态的发现、汇集资产数据,建立与业务之间的关联关系,安全责任落实责任人,做到摸清家底,解决资产掌握的“不准”、“不全”问题。建立统一的资产台账,对台账数据进行定期自动化探测稽核以及持续动态监测,发现未能了解或掌握暴露于网络空间的资产攻击面,对未申报的遗漏暴露面资产(影子资产)进行自动发现并预警,解决“大海捞针”的工作困扰。

2、脆弱性风险识别

脆弱性风险识别包括弱口令识别、漏洞发现、安全配置不合规项的检查识别

  • 弱口令识别

弱口令没有严格和准确的定义,通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令。近年来,账户密码的不断泄露导致暗网的密码数据库不断增加,日益开放的网络环境降低了边界的可防御性,远程设备的迅速涌入使互联网络上的用户和终端身份的安全管理更加复杂。可以说,金融行业的弱口令攻击面仍然是在不断扩大的。因此,攻击面发现能力中,对攻击面脆弱性的评估,首先还是要关注弱口令。
弱口令的发现方式相对也并不复杂,在发现管理后台页面、口令认证接口等类型资产时,相关产品或工具能够进一步辅以口令字典进行测试即可。这里的字典要支持用户上传进行自定义,同时针对不同的资产发现场景和任务,修改不同级别的弱口令测试强度,不影响业务。

  • 漏洞发现

作为攻击者,往往依赖于新爆出的0day或1day漏洞。这就决定了在新的漏洞威胁出现后,安全团队需要抢在攻击者之前,更快、更全、更准地定位潜在受漏洞威胁的风险资产。攻击面管理首先要做到在漏洞爆发之前,就对资产台账中的所有资产信息按照业务优先级进行标记,同时对所使用的系统、应用、中间件及资产的版本号等关键信息做到精细管理、持续更新。如此一来,在漏洞爆发时,才能第一时间做到资产快速筛选、PoC快速分发、漏洞精准匹配、虚拟补丁临时修复等快速检测与响应,赶在攻击者行动之前完成风险收敛。

  • 安全配置合规检查

安全配置通常都是由于人为的疏忽造成主要包括了账号、口令、授权、日志、IP通信等方面内容,反映了系统自身的安全脆弱性。攻击者往往利用主机、中间件的如脆弱的访问控制配置漏洞进行渗透。安全配置基线合规管控方案是能够有效保障网络设备、信息系统安全的手段之一,其内容主要涉及:登录配置、远程管理保护、访问控制、安全日志、安全协议等多方面内容,只有实现及时自动的采集和核查发现安全配置不合规项并进行整改,才能更好的保障网络资产的安全。

3、多源数据融合分析

随着数字化应用的深入,资产分布在多个数据中心、私有云、公有云、混合云、边缘计算和物联网等各种基础设施环境中,无论用户的单独一个部门亦或是单独某一家供应商,不可能覆盖所有资产,因此,统一的攻击面管理一定要具备“多源资产数据的接入并融合分析”的能力。主要解决统一可视化管理的问题,包括资产的可视化、资产与资产之间的关系可视化、风险可视化、业务影响可视化、责任可视化。这都要求具备统一的资产及攻击面管理平台实现多源资产数据的统一接入汇聚,多源数据的融合与分析。

  • 多源资产数据接入

应能对接的多源资产数据,包括但不限于CMDB、终端管理平台、AD域等运维数据,以及NDR、EDR、HDR(含HIDS)等具备资产发现能力的安全产品及解决方案。接入范围应该覆盖企业数据中心、私有云、公有云、混合云、边缘计算和物联网等各种基础设施环境中的所有的数据资产数据。

  • 数据融合与分析

多源资产数据接入汇总后,并非简单的叠加,而是要进行持续的交叉验证、去重/扩充、属性补全、标记等操作。需要结合业务数据流、网络流量、访问拓扑等多个维度,综合描绘出资产之间的关系链,建立“人-地-网”进行深度的关联和立体化模型,对地理、资产、事件、情报等大数据进行融合分析,结合可视化呈现技术,实现企业整体统一全面的资产地图,让网络资产“看得到、看得清、管得好”,到对于攻击能够“防的住”。

4、专项暴露面收敛

通过前面的暴露面资产发现、脆弱性设别筛选定位出所有潜在威胁的风险资产,然后根据资产的业务优先级、所属部门,下发不同的响应策略。在不影响业务连续性的前提下,确定漏洞修复方案前,对部分资产做临时下线处理。对于一小部分受业务连续性要求,既不能下线又不能修复的资产,则通过“虚拟补丁/透明补丁”的方式临时加固,待将来允许时,再行修复。


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


“fullbug”微信公众号

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

学习英语,你认为“长期”的坚持是多长,“大量”的阅读又是多少?

发表于 2023-03-02 | 更新于: 2025-08-10 | 分类于 人生 | | 阅读次数:
字数统计: 796 | 阅读时长 ≈ 2

English
今天在豆瓣上翻到我在2020年4月发的一篇文章《看完全套149本《书虫》是种什么样的体验》。有豆友留言在问“现在英语怎么样了”?顿时感觉脸上火辣辣的,被啪啪打脸!

豆瓣回复

到今天2023年3月了,快三年了,自己的英语又回到了原点。在我学习英语的生涯中又添加了一次英语学习失败的经历。陷入了第N+1轮的从坚持到放弃,从放弃到开始的魔咒。

终究还是把英语学习看得太轻了!对于英语的学习,我经历过《坚持了330天,我终于放弃了背单词》、《看完全套149本《书虫》是种什么样的体验》、《英语学渣的我是如何撸完这本英文原著的》。经历了1年的背单词的过程,半年的看完全套书虫,半年撸完10本英文原著(见豆列《我读过的英文读本》)。

关于学习英语这件事,大家都知道需要“长期”的坚持,“大量”的阅读应用。那么你认为长期的坚持是多长,大量的阅读是多少呢?我前前后后花了两年的时间,完成了149本书虫,看完了上十本英文原著,我觉得我已经很努力了,很能坚持了。当我试图在网上寻找这个答案时,发现自己认为花了两年的时间很长,人家已经坚持了七八上十年了;自己嘚瑟看完了全套书虫,人家不但晒完了全套书虫还晒完了哈利波特系列、床头灯系列后每年还坚持撸完二三十本原著。你所谓的“坚持”和“大量”,在人家眼里那只能是渣渣!学英语的路上,总能遇到比你厉害的人却还比你更努力!

学习这件事,真的没有捷径,谁更用功谁功夫深。好在已经有大量的人已经验证过,英语这个技能是可以通过“长期”的坚持和“大量”的应用可以习得的,我们应该笃信这个事情。“长期”的坚持是多长,”大量”的阅读是多少,最终只能通过效果来验证。

学习拐点

知识和能力的习得与积累是有复利效应的。所以,应该要相信自己能够通过“长期”和“大量”的积累和复利获得成功和成长,实现自己的英语应用的自由。有人通过自己的长期坚持和大量的积累成功的突破了拐点,实现了自己的目标。自己还没有成功,说明坚持得不久,积累得不够,在拐点到来之前就慢慢的放弃了,如果继续放弃那以前花费的时间精力只能是变成沉默成本不会有任何效果了。实现英语阅读自由只能是梦想了。

革命尚未成功,同志仍需努力!梦想还是要有的,现在开始继续坚持英语学习吧!



“fullbug”微信公众号

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

安全评估之漏洞扫描、基线检查、渗透测试

发表于 2023-03-01 | 更新于: 2025-08-10 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.3k | 阅读时长 ≈ 7

为保证业务系统运营的安全稳定,在业务系统上线前需要开展三同步检查,针对新业务系统上线、新版本上线、项目验收前开展安全评估。可以帮助其在技术层面了解系统存在的安全漏洞。今天就来了解一下安全评估之漏洞扫描、基线检查、渗透测试。

安全评估的内容主要涉及主机漏洞扫描、安全基线检查、渗透测试三个方面:

主机漏洞扫描

主机漏洞扫描一般是采用漏洞扫描工具,根据其内置的弱点测试方法,从网络侧对被评估对象进行一系列的检查,从而发现弱点。发现其存在的不安全漏洞后进行人工分析和确认,针对每个漏洞的整改意见完成报告的输出。被评估对象系统的管理人员根据扫描的结果以及修复建议修复网络安全漏洞,在黑客攻击前进行防范。被评估对象系统的管理人员对这些漏洞进行修复后,安服工程师会对漏洞扫描报告中每个漏洞进行漏洞复测,并输出复测报告。使用户更加全面的了解全网的安全状态,提高对安全漏洞的认识和管理能力,并通过对漏洞的修补加强应用系统抵御恶意入侵的能力。

安全基线检查

安全基线检查是通过采用安全检查设备以及人工检查两种方法从对应目标的安全合规性等方面开展对系统的全量安全基线检查,从而发现其基线的不合规项。其次在发现基线不合规项之后由安服工程师进行人工二次确认,依据工信部基线安全标准,针对性提供每个基线不合规项的整改建议,并完成基线不合规项报告输出。评估对象系统的管理人员可根据输出报告对基线不合规项进行基线整改。整改完成后,安服工程师会对按照工信部基线安全标准对所涉及不合规项进行安全基线复测,并输出复测报告。确保系统安全性得到提升,建立系统基础的安全防御体系。

渗透测试

渗透测试主要是模拟黑客的攻击手法,通过自动化漏洞扫描工具结合手工测试的方式对系统进行无害化的安全评估。渗透测试包含应用安全测试和业务安全测试两部分,应用安全测试包括但不限于如下内容:

序号 应用安全检查项 检查项说明
1 注入类攻击 注入攻击漏洞,例如SQL,OS以及LOAP注入,这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候,攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者访问未授权的数据。
2 跨站脚本(XSS) 当应用程序收到含有不可信的数据,在没有进行适当的验证和转义的情况下,就将它发送给一个网页浏览器,这就会产生跨站脚本攻击(简称XSS)。XSS允许攻击者在受害者的浏览器上执行脚本,从而劫持用户会话、危害网站、或者将用户转向恶意网站。
3 失效的身份认证和会话管理 与身份认证和会话管理相关的应用程序功能往往得不到正确的实现,这就导致了攻击者破坏密码、秘钥、会话令牌或攻击其他的漏洞去冒充其他用户的身份
4 不安全的直接对象引用 当开发人员暴露一个对内部实现对象的引用时,例如,一个文件、目录或数据库秘钥,就会产生一个不安全的直接对象引用,在没有访问控制检测或者其他保护时,攻击者会操作这些引用去访问未授权数据。
5 跨站请求伪造 一个跨站请求伪造攻击迫使登陆用户的浏览器将伪造的HTTP请求,包括该用户的会话cookie和其他认证信息,发送到一个存在漏洞的web应用程序,这就允许了攻击者迫使用户浏览器向存在漏洞的应用程序发送请求,而这些请求会被应用程序认为是用户的合法请求。
6 安全配置错误 好的安全需要对应用程序、框架、应用程序服务器、web服务器、数据库服务器和平台,定义和执行安全配置。由于许多设置的默认值并不是安全的,因此,必须定义、实施和维护所有这些设置。这包括了对所有的软件保持及时地更新,包括所有应用程序的库文件。
7 不安全的加密存储 许多web应用程序并没有使用恰当的加密措施或Hash算法保护敏刚数据,比如信用卡、身份证等等。攻击者可能利用这种弱保护数据实行身份盗窃、信用卡诈骗或其他犯罪。
8 没有限制URL访问 许多web应用程序在显示受保护的链接和按钮之前会检测URL访问权限。但是,当这些页面被访问是,应用程序也需要执行类似的访问控制检测,否则攻击者将可以伪造这些URL去访问隐藏的页面
9 传输层的保护不足 应用程序时常没有进行身份认证,加密措施,甚至没有保护敏感网络数据的保密性和完整性。而当进行保护时,应用程序有时采用弱算法,使用过期或者无效的证书,或不正确地使用这些技术。
10 未验证的重定向和转发 WEB应用程序经常将用户重新定向和转发到其他网页和网站,并且利用不可信的数据去判定目的页面,如果没有得到适当验证,攻击者可以重定向受害用户到钓鱼软件或恶意网站,或者使用转发去访问未授权的页面

业务安全测试包括但不限于如下内容:

序号 业务安全检查项 检查项说明
1 身份认证管理 该项测试主要针对身份认证环节,以及在非授权情况下访问一些授权用户才能访问的页面,或进行授权用户的操作。
2 业务一致性 该项测试主要针对办理业务过程中用户的身份与用户办理的业务是否相关联一直的安全测试
3 业务授权安全 该项测试主要针对于是否存在非授权情况下访问一些授权用户才能访问的页面,或进行授权用户的操作。
4 用户输入合法性验证 Web应用程序没有对用户输入数据的合法性进行判断,就会使应用程序存在安全隐患。从而容易受到跨站脚本及SQL注入等攻击
5 误操作回退 手动进行误操作尝试,看系统是否能够正确回滚。例如,交易操作,在购买未完成时异常退出,看系统是否能够自动释放被购买物的锁定状态。又例如办理操作,如话费套餐变更,更改过程出错或异常退出是否能正确回滚到办理之前的状态
6 验证码机制 验证码控制是一种由WEB应用程序生成的随机数,以确保用户提交的请求不是由bot生成。
7 业务数据篡改 该项测试主要针对于办理业务过程中用户浏览器端传递至服务端的字段篡改测试。
8 业务流乱序 该项测试主要针对业务的处理流程是否有正常的顺序,确保不会通过技术手段绕过某些重要流程步骤。
9 信息正确呈现 对于用户提交的请求,是否能够返回用户需要的页面信息。
10 业务接口恶意调用 1.对于敏感的业务接口,是否预先有身份认证机制?查看此类可能被恶意大规模调用的业务接口,如用户登录模块、密码找回、密码重置等等。
2.对于具有查询展示办理功能的业务皆苦,如果不需要身份认证是否有强制验证码机制防止机器人程序等自动化大规模的恶意调用。

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


“fullbug”微信公众号

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

写给两年后2025年的自己

发表于 2023-03-01 | 更新于: 2025-08-10 | 分类于 人生 | | 阅读次数:
字数统计: 473 | 阅读时长 ≈ 1

致未来

2025年的我应该是实现了架子鼓演奏自由,可以轻松的驾驭并享受架子鼓演奏带来的愉悦和快乐。可以很自信的在抖音或B站上上传自己平时很惬意的架子鼓日常练习,不用再担心有人说”节奏不稳、勉强还行”了。技巧应该很熟了,什么重轻音、滚奏、双踩都不在话下了,16分节奏型速度在120以上那都是小case,可以挑战一些有难度的歌曲了。可以很有底气的说我会打架子鼓!要不要来表演一段?

2025年的我应该是实现了英语阅读的自由,可以享受在英语文献中获取知识带来的快乐,可以不带字幕的看懂大部分的美剧大片了。不用再忍受看一页原版英语小说还要不停的翻英汉字典,搞得阅读兴趣全无了。应该可以畅快的看懂英文的计算机相关的技术文档了,可以尝试翻译英文技术文档了。

2025年的我技术能力水平应该更高了,心智更加成熟,思考更加有深度了,更加乐意写技术文章做技术分享了。CSDN账号的粉丝应该是到了10W,可以小小的嘚瑟一下了!

2025年的我还没有达到财富自由,上班还是在上班,但心态没有这么累了,应该是在享受工作了。开了多年的老爷车应该是换了,换成了新能源的混动车,偶尔可以开着新车去旅行,感受不一样的风景了。

如今的各种不如意,都是来自于过去的不努力!

2025年的我,要感谢现在努力的自己!



“fullbug”微信公众号

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

网络安全之认识挖矿木马

发表于 2023-02-22 | 更新于: 2025-08-10 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 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 | 更新于: 2025-08-10 | 分类于 人生 | | 阅读次数:
字数统计: 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 | 更新于: 2025-08-10 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 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-08-10 | 分类于 技术 | | 阅读次数:
字数统计: 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 | 更新于: 2025-08-10 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 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 | 更新于: 2025-08-10 | 分类于 技术 | | 阅读次数:
字数统计: 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”微信公众号

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

<1…111213…21>
XieJava

XieJava

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

主题 — NexT.Muse
0%