一、写在前面
本篇文章是出于自己的认知和观感,不代表任何立场。写这篇文章的目的初衷是帮助网络安全从业人员的发展与提升。
如果你存在在网络安全领域的攻防遇到了瓶颈或在销售技术支持类岗位力不从心的感觉,推荐你看这篇文章。当然你是校招生那更好了,因为你可以跳过我写Python的阶段直接去第二阶段深化自己的专业方向能力。
二、我转型的动机与原因
最开始我自己首先是项目经理出身在乙方从事安全系统的交付与售后工作,然后从事的是渗透测试与应急相应的工作。在两年的实践过程中我察觉了自己在渗透测试领域能完成基本的渗透测试与业界顶尖的白帽子相比仍有差距,应急响应方面虽然在业界做出了几个相对能有所交代的case,但总体而言还是基于套路和经验的堆叠感觉还是很快达到了技术瓶颈。加之当年互联网甲方的风潮,我从乙方转型为甲方。开始接触安全研发。简言之就是攻防领域天赋有限,加之行业浪潮有了转型。
三、转型远期收益和我的看法
优势:
研发工程师是大多数职业中发力最早的行业,对于同龄人而言获得一份可观的收入。对自己的人生规划如买房、结婚都有比较好的先发优势。
研发工程师的发展路径比较明确,只要用功肯吃苦,肯学习,主观能动性强。薪资是一定能追上行业预期的,只要技术过硬在一定年龄前薪水一定是稳步上涨的。
学习路径比较明确,无论Java,Golang,C。网上“八股文”较多。一方面八股文的确提升内卷,但积极的一面,即使你在个相对小的平台也能获得大厂的知识点与技术经验。平台制约相对小一些,即在大公司才能做到业界核心的项目,小的平台做不到。在一定年龄内,自身的能力水平基本上与公司职级岗位成正比,如果在一个中型公司都不能去作为一个系统核心主程,去大公司大概率也无法实现这个目标。
劣势:
所有程序员的劣势,安全研发都存在。上文一直在强调在一定年龄内,请务必注意这个前提。如果想转型要趁早,中肯建议工作3年转型要慎重,工作5年以上尽量不要转。
四、如何开展转型工作与制定职业发展方向
这个段落是本文的干货,会记录自己几个阶段是如何发展的,成功的点以及遇到的痛苦。仅供后辈们参考。
Step 1:安全攻防转python
我自己解决的问题:
成功由一个安全人员转型为了Python,Python作为一门工具语言使用场景极广。从企业内部一个人全栈构建一个Web平台的CRUD,到机器学习,到大数据Spark,Flink都有覆盖的领域。综合自己的安全业务经验渗透攻防等,能很好的把业务经验转化为代码。遇到海量数据可以写个Spark脚本试一下,遇到机器学习分类场景可以模型训练下。原来的攻防积累的业务场景与脑洞实践能力获得了极大的提升。
做得不好待改进的点:
我是半路出家程序员。感觉这个阶段没做好的点有两个
第一、研发工具使用生疏:单步调试,线程调试等、比如IDE的快捷键等,给人观感不如应届生。
第二、命名规范比较粗犷:驼峰大小写,注释,Swegger不会用等。会让有2-3能的程序员看起来有点外行。
当时对自己的能力认知不太准确,当时在公司实现了一套堡垒机系统,觉得自己技术非常厉害。实际上只达到了实现功能的研发水平,无论专业的大厂方向,还是服务稳定性都很有差距。现在回想起来应该多去公司和线上业务的程序员沟通,让他们提出问题并指正。
Step 2:python转对应场景语言,从做广到做精
自己目前在这个阶段,已经度过了接近三年的时间,这块由于尚未结束,身在进展过程中不能更好的客观复盘自己做的好与坏。这个段落更多是从安全研发的视角向大家分享如何从做广到做精,避免盲目的学习各种技术给企业与别人一种杂而不精不精的感觉,导致浪费自己宝贵的职场时间与获得不了良好的职场机会。
数据分析、威胁情报挖掘、风控数据挖掘等:
这个领域可以保留自己的Python语言能力,把钻研语言细节的精力:如如何更好的写出高内聚,低耦合的代码转变为研究如何更好的利用现有的机器学习算法解决实际的业务问题。把钻研语言细节的精力留出来去学习统计方法、机器学习算法理论、顶会文章复现等。数据分析重要的是从数据中挖掘出来准确的业务详情而非工程化稳定性能力。所以在语言本身,面向对象,crud性能调优等优先级可以先放一放。更多精力留在补算法,补高数,补统计学原理,补机器学习模型经验,补调参经验,复现顶会论文等场景上。
安全服务系统开发方向:
安全服务系统开发包括KMS、安全管理平台、WAF规则下发、风控拦截系统的开发等。这一块更像传统的BAT、MD后端开发工程师。目前我自己走的是这个方向,首要任务是把自己从写功能提升到写稳定系统的能力上,实现功能只是最简单的一步,一个KMS可能会耦合大量的在线场景,通过Retry等机制维持4个9是基本要求。这时要提升自己的系统化工程的分析结构能力。
举个例子,如WAF这个场景是一个要求最终一致性的场景,即我希望最终每台机器上跑的规则是一样的,并且规则尽可能的在机器上生效,避免出现规则下错无法摘除的场景。那么下发过程中,我要考虑到各种边界条件,如网络不通,机器假死,而无法下发策略的情况。我是引入etcd,还是推模型与拉模型结合。拉模型用http还是rpc等都是需要考虑和学习的问题。这块的技能技术栈可以参考bilibili和各种公众号上的大厂架构课程与面试课程。
从语言方法,为了满足高可用稳定,高内聚低耦合的系统。我们要从动态语言去转一门静态语言,如Golang或者Java,这个观点可能不成熟,但现在绝大多在线业务使用PHP,Python互联网公司在转向GO,Java的公司维持原有Java的技术栈,在特定的C语言场景选择Go作为备选。
学会估算性能与压测,要保证说出去的保证,绝对能实现。自己承诺的要求,绝对不出错。
网络安全研发(零信任,云原生、抗D、NTA)与服务器(HIDS)方向:
如果你在写Python语言为主的的公司,面临了Python转Go重构服务端的过程,并且你也参与了一些HIDS的相关agent的开发和维护工作的话,走这个方向是比较合适的。否则个人建议是不建议走这个方向的。这块涉及很多协议与Linux自身内核API的场景,如果作为半路出家的安全研发学习成本是非常高的,而且也要耐得住寂寞。
在我写Golang的时候没有这方面认知。这些方向主要的能力主要在于协议分析能力以及Linux Device Driver等方面的知识。这个方向可以深化Golang语言学习,有能力可以多看看C语言的项目,很多Golang中的场景最终也是Golang耦合C来实现的。比如Linux agent开发需要了解hook机制,也需要有用户态和内核态的概念,以及Linux开发常见的系统API接口。网络方面要了解具体的协议结构,流量代理,各种高性能网关等知识。这块由于我也不太精深,为了方便大家的理解我会给大家推荐几个项目,供大家参考与学习。
前公司的HIDS项目,设计到Hook状态:
美团的HIDS设计方案:
保障IDC安全:分布式HIDS集群架构设计tech.meituan.com
网络流量方向可以看下mesh的业界代理方案,理解网络流量:
前端工程师方向:
由于在写Python阶段自己是个全栈工程师,接触了很多Jquery与Js的的知识。如果要走这个方向也是可以的,这时候应该把自己的主要前端语言从JQuery转到写Vue和React。注意跨端稳定性与多端适配的学习。在大厂前端是一个非常紧缺的岗位,尤其安全部门更加明显。而且从我的视角,前端的发展路径也是比较明确的。因为我对一个好前端未来转型成一个好产品也充满信心,因为他深知用户的交互逻辑与习惯。
客户端方向(安卓与IOS和Windows):
目前客户端研发在零信任领域与反作弊设备指纹方向比较火热,随着移动办公的火热。不过客户端的门槛非常高,建议从安全转型过来的工程师不要入这个领域,非常深。基本上Linux device driver与安卓Java开发的相关生态都要掌握。不适合半路出家的程序员。应届生如果做移动开发或者客户端方向可以考虑这个方向。
转型线上开发工程师脱离安全:
我承认你可能觉得安全研发太简单了,没有太多的高TPS与分布式事务场景。这块进入我的知识盲区了。
Step 3:从做精到一专多精统筹规划
如果能做精上面的一个方向应该已经转型为了一个合格的研发工程师了,慢慢你会发现一个人的能力太有限了。随着年龄的发展,你会发现在特定的技术领域是会者不难,难者不会的状态。自己会机器学习,但系统写不稳定。自己系统写的稳,但搞不定机器学习的算法。这时候你需要一个团队,也需要从一专变成多精,而多精需要团队的partner来帮助实现。
例如做一套可在公司落地的WAF,最低要配置5-6个人的最简人手,涉及的可能不止安全研发一个领域的,攻防人才,前端人才,后端人才,产品经理可能都是必需的。如何说服你的老板,如何计算ROI,如何定项目的关键节点预期,万一招来的人不符合自己的预期关键节点无法交付怎么办,万一老板压排期我该怎么办等。你可能面临上面老板给我压指标,下面六个兄弟要还房贷期望升职加薪,这比做单点技术复杂的多得多。我自己没有经历过还,希望在未来的文章中能有幸跟大家分享。
五、写在最后
祝每个安全人心怀梦想,追梦成功。在奋斗的道路上,也能满足自己物质生活的需要。
感谢一路提携的领导与同事。特别感谢我在上家公司的研发的领路人五道门(微信:IndigoMaple),让我有了火速成长的能力与机会。