古有伯乐识千里马,今有马老师聚齐十八罗汉。千里马常有,而伯乐不常有。慧眼识人是成事基础,使骥不得伯乐,安得千里之足。安全英雄齐聚,如何找到正确的人以及如何展现自己最好的一面是当代安全人需要兼具的能力。
1 安全招聘现状
1.1 薪酬最高
互联网是计算机行业中薪酬最高的,而技术工程师是互联网中薪酬最高的,而安全工程师又是技术工程师中最高的。安全行业井喷式的爆发,使得每家互联网企业的安全部门成为标配并逐渐蔓延开来,而由于高校的安全专业才开始普及,安全从业人员紧缺且入门门槛较高从而导致了薪酬水涨船高。
1.2 良莠不齐
好处是会有更多的人投身于安全,当然坏处也很明显,着急的岗位和紧缺人员导致存在大量良莠不齐的人在其中浑水摸鱼,明显的特征是你跟他聊技术细节他跟你聊推进落地,你跟他聊推进落地他跟你聊方向把控,你跟他聊方向把控他跟你聊团队管理,你跟他聊团队管理他跟你聊行业空间,如果这些方面都能聊一点那也行,更多的人是答非所问又或者句句有理但空洞没有屁用,又或者是今天这里听到一个理论还没弄明白呢明天就来跟你拽个概念,虽然这么说会得罪一部分人。
1.3 圈子文化
安全是一个小圈子,圈内的事情传播的非常快,比如谁家数据库泄露了、谁家被薅羊毛了、谁被抓了、谁被处罚了,这也是小圈子最大的好处,圈内的人很快能知道这个行业的新技术、新方向、新政策。你也可以很容易的知道每家公司的安全建设情况,比如你可以和阿里的人聊他们的线下配合公安的手段有多强,也可以和腾讯的人聊他们的SRC如何运营的这么好,也可以和百度的安全人聊如何让机器学习赋能安全产品的,这一切在安全圈内非常的容易。也有很多的安全会议可以学习到每家公司的经验,不用所有的事情都自己摸索也用闭门造车。
弊端也很明显,搞所谓的”圈子文化“,混迹于各种会议去主动认识各种圈内的人(当然这里不是指各家SRC运营的同学,这些是运营同学的工作一部分),认识的各种人如果是交流技术那也行,加了微信除了打招呼的自我介绍那句话就再也没说过有意义的东西,以为这样就进入了圈中心,可笑可悲。
2 安全从业人员的必要素质
具备基础的工程师素质是一切的基础,在这个基础之上如果在攻防渗透和软件开发、兴趣驱动和适应能力上比较亮眼,则能很好的适应工作挑战。
2.1 攻防渗透和软件开发
首先要明确一个概念,术业有专攻在安全行业不是常态。安全本身就是一个覆盖了客户端、前端、网络、后端、服务器等涉及JavaScript、Python、PHP、Java等各语言的工作,如果非要讲究术业有专攻就没法做了,当你可以有擅长的方向,但前提是你都懂,这个懂不应该停留在了解的层面,如果你是安全开发工程师除了研发技能外还必须知道常见漏洞的形成原因、利用方式和修复方案,如果你是渗透工程师除了理解各种漏洞的攻击细节外,还必须有基本的开发能力。
同时拥有攻防渗透和软件开发的人,在后面做事的方方面面会体现出极大的优势。
我们有过很资深研发工程师,但安全产品不同于用户产品,往往是都没有经验也没有参照物的,摸黑前行最好的情况是你曾住过这个房子,所以往往需要有很强的安全背景/不断的试错调整才能开发最好的产品。甚至在很多时候,沟通交流/思维上都需要进行转变才能更好的协作,减少代沟和沟通成本。这个要求并不是非要精通各种。
现状是安全行业更多的人是偏向于攻防渗透,而如果同时拥有很强的开发技能,优势将非常明显。在安全产品开发/漏洞挖掘/代码审计上。
不同岗位间的互补显得非常重要,做漏洞扫描器的如果在SRC挖过漏洞、做代码审计如果会软件开发、做合规审计的如果有CISP证书就会得心应手。
2.2 自我驱动(兴趣/金钱/上进心/不服输)
像安全产品开发一样,渗透测试也需要不断的试错,不断的将各种可能存在漏洞的地方一一测试,往往测试数百个请求才有所收获,这需要很好的坚持,但坚持这种品质无法立刻学会,但往往有很多东西能促使我们坚持,比如兴趣、金钱、上进心、不服输精神等。我对于安全的坚持就是兴趣所驱动的,我会遇到一个线索从早上折腾到凌晨,会因为一个突破点从晚上摸索到下午。 我见过太多优秀的白帽子都是因为热爱,他们能跨行业的热爱。
仅仅能驱动自己不断前行远远不够,前行对路太长了你对驱动能量是有枯竭的一天,学会自我激励是一项必备素质,在关键时刻为自己加油。
2.3 适应能力
软件工程师是三年换一轮新技术,而安全工程师则是每年都有新的方向。每天都会有新的漏洞/新的攻击方式/新的语言漏洞,每年也会有新的安全技术、安全防御手段、安全方向,而应对别无他法唯学习,良好的自驱自学能力是一切的基础。
2.4 进阶素质:智商和情商
聪明除了指IQ之外还有EQ,倾听、开放,你跟别人聊天能快速接收信息,能跟上别人的频道,快速理解别人意图,能和各个团队合作方打好交道。
2.5 敢于面对困难,乐观对待一切
聪明有才华,但如果遇到问题就抱怨也难成事。前行的路上如果一直一帆风顺的话,当遇到一个大浪可能再也起不来了。我们前行的路上会遇到各种坎坷,也许能绕过并忽略这些坎坷,但你也同时丢了这些铲平坎坷的经验。不为任何理由找借口,有条件上,没有条件创造条件上。
2.6 吾日三省吾身
又聪明又乐观但是油盐不进,看不到自己的问题,也不能妄自菲薄,吸纳各方面的信息让自己的认知更完整。
3 安全面试和笔试
如何有效的甄别一些滥竽充数的人,最重要的肯定是面试这道坎。安全圈的东西行业内的人谁都能聊一点,所以一轮面试一定得安全技术负责人亲自把关,深入的问细节来判断。
3.1 面试注意项
- 提前约好面试时间和面试方式(电话/现场)
- 做好面试准备:对岗位要求、职责有清晰认识?是否阅读了候选人简历,知晓之前面试评价?本轮面试主要考核点?对候选人的疑惑是什么,感兴趣的是什么?预留足够时间调整好状态?
- 参与每一轮面试考察的重点不相同,了解之前几面的面试评价,从前到后以此考察知识和经验、能力、意愿、动机、个性特质、价值观。
- 准时参与面试,有事情应提前电话沟通到位
- 面试时把握好节奏,及时阻止话多的,多留停顿给话少的
- 面试时不问/不透露公司敏感信息
- 即使只聊一分钟就觉得面试者不合适,也不应该立即挂断,面试应不少于20分钟;时常控制在1个小时以内;
- 及时反馈面试信息,层级、录用意见、不足之处、待下轮考察内容
3.2 面试流程
- 自我介绍下个人情况、做过的项目和技能
- 观察谈吐,看思维逻辑是否有条理,沟通交流是否顺畅
- 性格类型是否合适
- 围绕做过的项目进行细节提问,提问的问题根据岗位不同可以从3.2中抽取
- 考察项目真实性、项目角色及分工
- 对项目的理解程度、掌握程度、思考等
- 遇到解决不了的问题怎么做?
- 考察学习能力和动手解决能力
- CTF、乌云、翻墙、写技术博客、技术书籍、参与GitHub开源项目、常浏览的网站、游戏、电视剧、业余时间干嘛、业内牛人
- 综合体现出其技术热度
- 算法、前端、服务器的掌握程度
- 一些基础算法,比如快速排序、冒泡排序、选择排序、插入排序
- 一些机器学习算法,CNN、RNN、Tensorflow、验证码识别等等
- 前端JavaScript、HTML、CSS掌握程度,调试工具,编码等
- 服务器常用命令、配置、文件权限、进程栈、端口占用、异常日志等
- 自认为自己比身边人的优势
- 挖掘亮点,如何客观看待自己
- 自认为的缺点
- 客观的自我评价,讲自己没有缺点的基本可以不要了
- 最有成就感的事情
- 考察价值观,尤其对于一些未授权渗透甚至黑灰产事情的态度
- 未来职业规划?
- 请否有清晰的职业规划,对自己未来有长远思考
- 和当前岗位对匹配度
- 还有什么要问我的吗?
- 了解面试者所关心的侧重点
3.3 面试题目
3.3.1 渗透测试(Web方向)
- 挑选两到四个不同方向常见和不常见的漏洞,就漏洞原理、利用方式和修复方案进行提问,然后根据回答的情况进行详细深入的二次提问
- Redis未授权访问漏洞如何入侵利用?
- SSRF漏洞原理、利用方式及修复方案?Java和PHP的SSRF区别?
- 宽字节注入漏洞原理、利用方式及修复方案?
- 简述JSONP的业务意义,JSONP劫持利用方式及修复方案?
- CRLF注入原理?
- URL白名单绕过?
- XSS持久化?
- 渗透全流程
- 就漏洞的检测发现进行提问
- 越权问题如何检测?
- 黑盒如何检测XSS漏洞?
- 如果爬取更多的请求?
- 应急思考
- 有哪几种后门实现方式?
- webshell检测有什么方法思路?
- Linux服务器中了木马后,请简述应急思路?
- 遇到新0day(比如Struts2)后,应该如何进行应急响应?
- 新业务上线前可以从哪些方向进行安全评估?
- 现有系统可以从哪些方向进行审计发现其中的安全风险?
- 基础开发
- 简述Python装饰器、迭代器、生成器原理及应用场景?
- 简述Python进程、线程和协程的区别及应用场景?
3.3.2 安全开发(Java方向)
- Java基础
- Java虚拟机区域如何划分?
- HashMap和HashTable、ConcurrentHashMap的区别?
- 进程和线程区别,进程间、线程间通信有哪几种方式?
- Java BIO/NIO/AIO是什么?适用哪些场景?
- 算法基础
- 快速排序的过程和复杂度?
- 冒泡排序的过程和复杂度?
- CNN对比RNN区别?
- 业务基础
- 调试工具及异常排查流程?
- 数据库索引结构,什么情况下应该建唯一索引?
- 数据库分页语句如何写?
- 业务安全
- HTTPS交互过程
- OAuth2.0交互过程及其中可能存在的配置不当安全风险
- 对称加密和非对称加密的区别及优缺点
- 获取一个入参url,请求url地址的内容时应注意什么?
- 参数入库前应该如何过滤?
- 过滤器和拦截器原理和应用场景?
- SESSION ID如何不被Javascript读取?
- CSRF的Token如何设计?
- 同源策略?如何实现跨域请求?
3.3.3 安全运营(合规审计方向)
- 对于内控、合规、审计的理解
- 考察其对于要做的事情和岗位要求、公司环境是否匹配
- 考察其大局上考虑是否周全或是片面
- 传统行业和互联网行业的安全建设的区别及各自的优劣势
- 是否能准确的抓住核心原因
- 信息安全等级保护、网络安全法、GDPR
- 挑选一到两个问其对其的来源理解以及落地程度取舍
- 数据安全治理可以用什么思路做?
- 如何通过技术手段实现对异常操作的自动化监控?
- 如何对一个应用进行安全评估?
- 如何对一个应用进行安全审计?
- 如何理解权限分离、最小化权限?
- 考察一些CISP、CISSP的知识点
- 流程的设计
- 挑选一些较为复杂的流程,比如转岗、离职等,如何设计考虑其中的细节
3.3.4 安全架构(安全管理方向)
- 渗透测试、安全研发、安全运营的问题可以挑选的问一些,以确保在各个方向上比较均衡
- 对于企业不同时期、不同阶段、不同体量的安全建设的方法、区别以及侧重
- 你所做过的安全架构图和所期望的安全架构
- 安全与其他团队(运维、研发、测试、GR/PR、内控、高管及三方安全公司)的关系
- 安全建设的理念/方法论理解
- 纵深防御
- 木桶原理
- 由外而内
- 先低后上
- 能口不点
- 最小权限
- 权限分离
- 白名单和黑名单
- 漏洞和误报
- 规则经验和机器学习
- 漏洞危害证明
- 技术管控与意识提升的关系
- 安全推进方法
- 自研OR外采?
- 找到总的核心目标和各个项目的主要目标
- 创新和极致
- 责任分担
- 黑天鹅和灰犀牛
- 衡量企业安全建设的水平
- 不同公司间的安全区别或差别是什么?比如腾讯和阿里,百度和京东
- 如何制定公司安全建设的三年甚至五年计划
- 未来安全行业的发展方向?
3.4 笔试题目
面试题目往往大同小异,而由于圈子小的原因很容易传播出去,如果做过准备哪怕深入的问也可能有漏网之鱼。而笔试往往能很好的看出来其动手能力,所以应尽可能的出一些无法提前预知、无法网上查询的专属题目,题目可以侧重于开发、调试、数据操作等方面。
3.4.1 渗透测试方向
- 给定一个漏洞靶场,在一定时间内找出最多漏洞数
- 给定一个匿名访问Redis,请GET SHELL
- 给一个项目场景进行安全评估(e.g.与三方厂商进行API交互)
3.4.2 软件开发方向
- 读取一个文件第100-200行并发送到一个指定的API接口(着重考察对于各种异常情况的考虑)
- 最快的方式获取100万个子域名请求的响应内容并找出其中真实存在的子域名
3.4.3 数据结构方向
- 给一个数组
[3,4,5,6,2,1,8]
,输入所有二元组其和为8。- 每个数字只能用一次
- 数组长度不定
- 考虑时间复杂度和空间复杂度,以最高效率
- 存在一个list结构(表1),请转换为树状结构(表2)
- pid和id关系为父子关系
- name为无规律随意命名
表1:list结构(list length>1000)
[ { 'id': '111', 'pid': '0', 'name': 'A1' }, { 'id': '222', 'pid': '111', 'name': 'A-B1' }, { 'id': '223', 'pid': '111', 'name': 'A-B2' }, { 'id': '224', 'pid': '111', 'name': 'A-B3' }, { 'id': '333', 'pid': '223', 'name': 'A-B2-C1' }, { 'id': '444', 'pid': '333', 'name': 'A-B2-C1-D1' } ]
表2:最终的结构
{ 'id': '111', 'pid': '0', 'name': 'A1', 'child': [ { 'id': '222', 'pid': '111', 'name': 'A-B1' }, { 'id': '223', 'pid': '111', 'name': 'A-B2', 'child': [ { 'id': '333', 'pid': '223', 'name': 'A-B2-C1', 'child': [ { 'id': '444', 'pid': '333', 'name': 'A-B2-C1-D1' } ] } ] }, { 'id': '224', 'pid': '111', 'name': 'A-B3' } ] }
4 如何问问题
面试中大部分时间都是在倾听和问问题,如何发现其中的问题点、如何避免毫无连贯性的一问一答、如何问到关键问题点、如何辨别经过修饰的回答等等。如何有效的甄别一些滥竽充数的人,最重要的肯定是面试这道坎。
安全圈的东西行业内的人谁都能聊一点,所以一轮面试一定得安全技术负责人亲自把关,深入的倾听和问问题来判断。
4.1 避免直接问问题
避免一上来就开始查户口式的询问方式,有点前戏先热热场,让他先从自己的项目开始介绍,围绕着面试者的项目经历为主线,结合实际项目信息把想知道的问题都融入进去。
反面例子:你之前项目过程中有什么难点?难点怎么解决的?为什么选这个方案?
正面例子:结合他讲到的项目信息,对他提到的问题进行询问,为什么
4.2 问问题方法:行为连贯性问法>假设法>引导法
比如之前没有上台演讲过那么去演讲会紧张,相反如果之前有很多演讲经验那么就不会紧张。每个人做当前事情时都会受之前行为影响,那怎么询问能够知道他演讲时是否会紧张呢?
问法1:假设你去上台演讲是不是会紧张?
问法2:演讲时是不是会紧张?
问法3:你上次上台演讲的时候是什么时候?当时演讲主题是什么?当时状态怎么样?
问题要有连贯性,不是直冲主题问演讲是否紧张,而是循序渐进先问一些能让他思考当时实际情况的事情,再转而问主题,没有留下思考的时间。当然反应快的人也能马上转过来隐藏或美化一些信息,这时候就得根据现场回答情况来看。
上面三类问题分别对应着三种提问方式:假设性问题、引导性问题、行为连贯性问题。
这个项目怎么做的?为什么用这个方法?通过这个方法学到了什么?
行为连贯性问题:基于行为的连贯性进行提问,一个人过去的行为能预示他未来的行为,比如一个经常迟到的人下次还会迟到。优先使用行为连贯性问题。
假设性问题:通过假设某个场景让面试者去应对。除非他讲的内容或历史经验没有能让你切入到行为连贯性问题上,否则就不要用假设性问题。
引导性问题:通过给出一个可能的结果来引导面试者回答,对于面试者来说相当于告诉他一个答案了,同时也会影响局限他的思路。大部分情况下都不建议使用引导性问题。
4.3 深究每个问题
任何一个问题都可以拆分成十个问题,问清楚事情每个模糊点和逻辑分支,
例子:
面试者讲了之前做了一个针对研发同学将代码上传至GitHub上的监控工具历程。
常规面试官:架构是怎么样设计的?规则怎么选?频率限制怎么做的?告警怎么处理的?误报怎么处理的?
深究面试官:项目最最重要的点是什么?如何最优解决效率问题?如何突破频率限制?如何最方便的处理告警?如何对告警进行持续优化?告警可以分为几类?历史commit中泄漏信息怎么发现?
4.4 挖掘更全的
问问题是在发掘候选人的优劣势,但我们的问题会存在片面性
有时候需要一些灵活的问题来帮助候选人自我发挥讲讲自己的优劣势,对我们前面的面试作为一个补充
4.5 除了问问题也需要被问
被问问题一方面我们能看出来面试者所关心的内容,另一方面也能看出对岗位的兴趣程度。
5 招聘渠道
5.1 公司内部推荐
内推是优于招聘网站或猎头的,和找女朋友一样,熟人介绍的比媒婆介绍的要好,更不用说相亲网站的质量了。对于中高端岗位公司需要支付较高的猎头费用,所以内推渠道优于其它所有。
- 找到自己倾向的公司以及对应的招聘岗位
- 注意岗位和个人技能及职业发展的匹配度
- 找到对应公司员工请求内部推荐简历
- 优先安全岗位的,其次同公司的
- 优先熟悉自己的,其次自检写好
5.2 安全行业招聘网站
没有合适心仪的目标就上招聘网站。
6 好的简历
顺便说下好的简历是什么样的,当然一切的前提是有真才实干。
整体要简洁明了,逻辑结构清晰。要能体现出知识、技能、经历、天赋、人脉。
- 基本信息清晰:姓名、ID、性别、年龄、毕业院校·专业、电话、邮箱、居住地
- 工作&项目经验:注意空档期、担任的角色与分工、公司行业知名度
- 体现技术能力:主要的技术栈以及能佐证的事情
- 其它优势:职业证书、奖项、会议分享、开源项目等
- 工作期望和方向:希望得到一个什么样的工作或自己专注的方向
- 个人评价:全方位的总结,展示出自己的专业技能掌握程度、亮点、优势等等。
- 加分项
- 使用PDF格式,简洁不花哨
- 有GitHub并参与过开源项目,可以写一些自己做过的小项目放上去
- 有个人博客,会写一些经验和问题的解决思路
- 邮箱使用gmail、foxmail或技术类邮箱(php.net)、私人域名邮箱等
- 询问面试官对于自己的评价和可以改进的地方
7 慧眼识人
- 招聘和找女朋友一样,朋友同事推荐(内推)的比媒婆(猎头)质量高,媒婆(猎头)推荐的比相亲网站(招聘网站)质量高。
- 面试时让你觉得不舒服的人,进来之后只会让你更不舒服
- 招最合适的人而不是最好的人
- 好的人是值得等的,经常和他们聊一聊等待机会
- 不要因为着急用人而把一些不合适的人招进来
- 不要期望人事能给你招到好的人,自己筛选简历面试,你现在偷的懒后面会花更多时间来填补