2019年4月

应用型安全算法工程师的自我修养

首发阿里云先知平台,转载请注明出处。安全是个小众的行业,安全算法更是小众领域,虽然是个小领域,路比较窄走的人也很少,但是走的好的话前方就是大路,因为安全算法确是安全的核心驱动力之一。无论在大行业还是小领域,我们都应该以做本行业、本领域的专家为努力目标。

0x01 算法工程师分类

有人将机器学习算法工程师分为三类:应用型、研究型、轮子型。就像算法包括机器学习算法和统计学习算法一样,算法工程师本身包含了机器学习算法工程师,也包含其他一些传统算法工程师。算法工程师大致也可以分为这三类,应用型、研究型、轮子型。

应用型

应用型算法工程师占算法工程师的大部分,主要做算法和模型,但从数据、建模、业务到上线、运维都要做的来,技术栈需要全面,优势的技术点要突出。应用型算法工程师的灵魂是业务,算法跟着业务走,目标是让算法理解业务。给定一项工作内容,我们需要快速抽象问题,明确解决问题所需要的数据,大致采用的建模方法,预期的效果以及解决方案的可持续性和迭代性。理解业务需求,培养对业务的敏感性,以便在之后的工作中遇到类似的需求,可以快速解决问题,遇到新的问题,也可以凭借以往的经验找到解决思路。应用型算法工程师的优势来源于业务,业务不倒,优势不倒,跟紧核心业务,就算边缘业务被裁也可以立于不败之地,缺点主要是人员基数大,想要突出,需要培养核心竞争力。

研究型

研究型算法工程师只占了算法工程师的一小部分,主要做研究,暂时不用考虑落地。我理解的研究型算法工程师好比是学术界的工程师,主要做学术,改进、创造一些新的算法,发发paper,给公司挣些荣誉,做做技术储备,可以暂时不用考虑算法的商业应用。这类型属于高端领域,门槛很高,需要学术大佬来从事算法研究工作,主要集中在一些公司的Lab,比如AI Lab。研究型算法工程师的优势主要是门槛高人员少竞争稍小,可以使用工业界的资源专心做一些科研,缺点主要是一旦公司业务不景气,只保留核心业务基本盘,研究性质的说不定哪天就被裁员了。

轮子型

轮子型算法工程师基数也很少,是我最佩服的人群,主要做学术和工程的结合。追踪一些学术界最新的paper,依据强大的知识储备和工程能力进行复现,并集成到底层框架中,供应用型算法工程师使用。轮子型算法工程师像是一座桥梁,沟通了学术界和工业界,不仅要考虑算法的学术价值,也需要考虑算法的落地实现。我认为轮子型算法工程师竞争力最强,上到算法研究、复现,下到应用、代码实现,比应用型算法工程师更全栈,几乎毫无弱点,在公司旺盛时期也许看起来不如研究型和应用型光环加身,但是从自身出发,对环境的适应能力很强,就算业务调整也可以很好地完成个人转型,毕竟两条腿走路,很稳,从一定意义上讲我现在走的路和轮子型比较像,算是跨领域结合。

0x02 应用型安全算法er综合素质

有机器学习大佬将算法工程师的综合素质划分为四点:知识、工具、逻辑和业务,研究员侧重于知识和逻辑,大数据工程师侧重于工具,而算法工程师比较均衡。初见时候很赞同这种划分,后来经历了一些大佬级面试,发现大佬们考察面试者的思路貌似也可以用这种划分来理解,所以说明这种划分理解很有学习意义,现在也是按照这四点重新搭建了个人的知识体系。学习本身就是从模仿到创造的过程,学习别人优秀的思想,然后结合自身情况,创造一些属于自己的东西。

知识

知识主要是一些理论储备,拿机器学习来说,知识就是防止过拟合的方法,L1、L2的含义,样本不均匀的处理方法,VC维以及各种机器学习算法的原理,学校的书本和课程主要负责的就是教授知识,就这造成了许多应届生在知识这个层面还行,但在其他层面不足。在面试中曾经就被问到很多知识,比如GBDT和XGB的区别,XGB和LGB的区别,深度强化学习的原理,面试官考察的就是知识,包括知识面和知识深度,就广度和深度而言,个人觉得深度比广度重要,但是如果深度够广度不够,说明学习效率不行,消耗的资源会很多。

工具

工具主要是一些技术实现手段,拿机器学习来说,工具主要是TensorFlow、sklearn等机器学习框架,pandas、numpy、scipy等库的使用,比如pandas主要用来处理表格类数据或时间序列数据,XGB等算法的使用,比如XGB调参的具体步骤,ELK、Spark、SQL等大数据工具的使用,比如使用Spark进行大数据处理以及机器学习训练。对场景、攻击模式、数据的认知深度,远比选择工具重要,但这是在掌握工具的前提下。工具类比较容易上手,和知识面一样,组成了算法工程师素质的基底。

逻辑

我理解的逻辑相当于资源调度或是驱动引擎,凌驾于知识、工具之上,拿到一个业务需求,深入理解问题,给出解决方案,从数据清洗到特征工程,再到自己的持续学习以增强解决方案的鲁棒性,这一链条都需要逻辑的调度。逻辑对知识的高级调度是研究员的核心技能,这也是我一直欠缺的。逻辑是好的解决方案的必备条件,调度知识给出解决方案,使用工具调度知识实现方案的做法。

安全业务

对于应用型算法工程师来说,无论什么时候,业务永远是第一位,因此应用型安全算法工程师的灵魂是安全业务。与其说是数据驱动安全,不如说是业务驱动安全。拿到一项业务需求,我们的目标就是利用我们已有的资源来最大化解决问题,资源包括但不限于知识、工具、逻辑、数据、平台。对业务的理解深度,决定着我们解决问题的程度。拿入侵检测来说,以前的处理手段是基于规则的单点日志审计,现在手段主要是基于多日志关联和上下文的检测,从处理手段就可以看出我们对问题理解的深度逐渐加深,解决思路也进步很多。现在已有研究人员通过对场景、攻击模式和数据的深入理解,在入侵检测中引入了图计算、图检索和图推理的技术。

0x03 安全问题解决思路

安全业务

根据安全业务确定解决方案。给定一个安全业务需求,比如做自动化入侵检测,入侵检测又分为网络入侵检测和主机入侵检测,网络入侵检测可以从流量中做检测,主机入侵检测可以从文件监控、进程监控、命令监控等方面做检测,但不论是哪种,不考虑极端情况,入侵者一般都会在日志中留下一些痕迹,那么又回到了老生常谈的问题,日志安全检测。所以数据来源就是各种日志,而且都是未标记日志数据。针对日志安全检测场景,可以结合机器学习安全检测和传统安全检测手段来解决问题。使用机器学习技术解决本场景,其中难点在于数据未打标和可运营的预期,针对数据未打标这个问题,在数据阶段,可以通过传统waf、传统IDS、威胁情报、聚类等手段打标黑样本和白样本解决这个问题,解决了数据未打标的问题之后,又可以细分为二分类和单分类方案,如果白样本超级多,黑样本超级少,可以选择单分类方法,基于业务历史行为建立异常基线,在异常的基础上检测威胁,如果黑样本也挺多的,就可以采用二分类了,二分类对未知威胁的覆盖能力较弱。在建模阶段,由于攻击可能很稀少,所以也可以通过无监督学习来规避数据未打标这个问题;针对可运营的预期,可以通过概率值表示危险程度值,根据具体情况运营top N的数据。再结合传统入侵检测系统,相辅相成,相互印证,根据反馈结果,运营、迭代我们的机器学习模型。

数据和建模

日志那么多,到底选择哪些日志作为数据源呢?就像cdxy师傅ppt里说的一样,合适的日志解决合适的问题。说到这里发现之前说的自动化入侵检测场景很宽泛并不具体,可以理解成HIDS和WAF协同,如果是做HIDS的话需要内部服务日志,如果是做WAF的话需要外部通信日志。WAF和HIDS是从不同层面解决问题,针对不同的攻击模式,两者的覆盖面有所差异,所以性能可能有所差异。基础威胁建模的话就可以采用之前分析的思路,采用白名单的方式进行异常检测,再使用自动化信息收集和聚合等高级威胁建模方式从异常中过滤出威胁,比如基于攻击图的攻击路径检测,目前在图这一块研究不多,但是图好像可以作为关联日志等数据、关联HIDS和WAF等系统的有力手段,得好好学习学习。

后续

无论什么时候我们都应该加高自己的技术壁垒,培养独立思考的能力,根据自身情况培养核心竞争力,可以是业务敏感性,可以是安全研究深度,可以是某个小领域的全能。

0x04 引用