这个号叫安全防御,也应该分享一点个人在安全防御方面的一些心得。作为在攻防对抗的防守方,个人觉得有点类似对一个城池进行防守一样。而防守的目的,便是识别异常的能力。当然,这种能力不是与生俱来的,需要经过大量的事前准备,知识储备,应急演练等等才可以形成。在我之前的书中,以知己,知彼的角度写了一些心得,这次笔者再从平台(知己),技术(知彼),以及运营这几个纬度进行。
一 平台层面(知己):
工欲善其事,必先利其器。这里的平台是指搭建防御体系的产品(或者工具)的能力,因为对于防御者来说,并没有任何银弹可以使用,指望着一招鲜吃遍天的想法基本上来说是不现实的,因此好的防御应该是层次型的,或者立体式的防守。每层可以互相弥补不足,协同完成发现异常的过程。
如上图所示,把一个传统IDC 分为网络层,业务层(HTTP),主机层,以及周边部分,在不同的层上,使用不同的技术进行监控。
1 网络层
笔者认为是眼睛的作用,这里在笔者之前的书中已经介绍过,这里不多做介绍。可以使用的开源检测工具例如suricata等。当然如果有能力做一个监控平台,那么就要考验开发能力和工程化的能力了,毕竟不同于做工具能使用即可的思路,需要考虑稳定性,在大流量下的可扩展性,操作的简易性,甚至对于误报,漏报,策略的准确性等等都要仔细考虑进去。
例如笔者这套自行开发的监控系统,基本上就算满足了上面的需要。另外讨论比较多的问题是关于流量的加密问题,其实主要分为两个部分,可解密场景,即业务访问,这个场景,因为证书是自己这边的,可以通过在抓取ssl卸载节点后的流量即可解决。另外一个是无法解密的情况,类似木马,webshell之类。这种情况,可能就需要下一个层面主机层进行协同了。
2 主机层
针对网络层无法了解具体主机行为的这一缺陷,就可以在主机层进行进一步的布防,例如hids,xdr产品等等。这些系统可以针对主机文件,进程,端口变化,系统日志等信息进行收集并加以分析。另外现在的hids,或xdr产品,也有资产收集的功能,可以协助防守方了解资产情况。现在各种类型的hids已经层出不穷,例如笔者书里花了不少篇幅介绍的ossec,或者一些商业软件等等。
3 周边部分
可布防的区域除了主机,网络层外,还可以在数据库层,端口,DNS,堡垒机,vpn等众多地方进行监控,覆盖的范围越广,发现异常的概率也就越高,考验的其实也就是资产识别的能力。
4关于资产识别
笔者认为这是在进行安全防御中非常重要的环节,这就好比在守城中,如果将领对自己一方的人员,粮草,环境都不了解,那结果,基本上就可想而知了。笔者在书中用自创的圆圈理论已经阐述过,而且,公司越是大,资产识别越是一个苦差事,但不能说因为苦,就放弃这项工作,而相反,这算是考验安全能力的最基本功,先不说很多攻击都是从未识别到的资产中得手的情况,单说攻防对抗最重要的环节之一就是时间,如果监控到有问题,第一时间可以联系到相关业务的负责人,那也可能会在劣势中及时止损,争得时间。因此对于资产识别的重要性已经不言而喻了。当然对资产识别的颗粒度越细,那在监控中或对抗中越可以取得时间上的优势。而对于容器的使用,笔者推荐了一款个人认为比较出色的工具:neuvector,具体可以参考之前的文章《NeuVector ---功能丰富且强大的容器安全开源软件》。
二 技术层面(知彼)
攻防对抗,本身来说就是一个非常有技术挑战的事情,因为我们的对手是同样有着各种思想,不同目的人,因此笔者认为,不真正经历过一线的攻防对抗,提出来的策略基本上也就只能是纸上谈兵。而在对抗过程中能够灵活与变通,往往会是制胜的关键。但对于防守方来说,这两点更应该是日常积累才可能做到的,例如对于防守方来说,除了要了解攻击者可能使用的技术,工具外,还可能需要了解各种漏洞产生的原理,利用方式,甚至是系统或者语言等特性,因为在现实中可能就是因为对某种特性不熟悉,而导致被利用的情况发生。例如笔者能想到的基于资源的约束委派攻击便是利用了msDS-AllowedToActOnBehalfOfOtherIdentity这一特性,通过伪造管理员申请ticket的方式进行的。再比如webshell中,利用了evel,system函数可以执行系统命令等等。
再例如反弹shell这个场景,如下图所示(ps:此图非本人原创,来源于AnonySec@安恒《实战中内网穿透的打法》)
那么针对这么多情景,就需要有针对性的梳理和检验出来可以检测出的规则
而这对于防守方来说,便算是日常积累的事情,webshell的检测也是同理:
除此之外,例如一些特殊日志的产生,如下图所示:
(异常情况下的命令执行,执行账户:机器名)
(正常情况下的管理员命令执行,执行账户:普通用户或管理员)
也是可能产生异常行为,或攻击方攻击成功的标志,而作为防御方,则需要把对应的日志提炼成相应的规则。另外笔者在自己的书里第八章安全监控中也介绍了需要了解的其他攻击手段的技术,这里就不再赘述。
三 运营
有了平台,也有了技术,但最终的结果还需要人为做最终决断,因此,对于策略的运营也是非常重要的一环。而目前来说,笔者认为的主要手段有以下几种:
1 关键字监控:
这种方式是应用最广泛的方式,只要了解攻击中的任何特征,便可以建立监控规则,对于已知攻击来说,是最有效的检测手段。
2 频率监控:
用于弥补未知攻击的一种手段,例如极少数访问,或者某ip突发访问某url等情况。通过建立正常基线的方式,发现可能的异常行为,并进行判断。
3 行为分析:
通过发现异常行为,或设定一些场景,进而发现攻击的手段。例如非业务时间访问、不该有的访问或者端口开方等等。
4 机器学习:
频率监控的升级版本,目前来说针对DGA识别比较有效,(笔者用来识别公交车的图像识别也比较成功:P) 也可以先对异常进行第一步筛查,减少告警后,再使用人工进行二次判断,进而不断反馈规则经验,形成闭环,使报警更加准确。
5 关联分析:
笔者认为告警的最高境界,并一直研究的方向,(怎奈水平有限,突破很少)通过收集各个系统之间的日志(报警,行为)从而产生非常准确的告警,并可以把攻击路径完整识别。
除此之外,针对告警的运营,笔者认为还有几点也非常重要:
策略的优化:
尽量将做到告警的准确化,力争每条告警都是准确的,毕竟动辄999+的告警,再有责任心的人耐心也会终将被耗尽,因此个人认为,作为防御者,应该把最大的精力用在规则的准确化上。
监控覆盖面:
就如同开篇介绍的,防守是个全方面的工作,任何一个细小的疏漏,都可能导致千里之堤,毁于蚁穴。因此对防守区域的了解,对资产的了解,对监控覆盖面的了解,便是能否做好防御的一个因素,更不应出现马奇诺防线这种情况发生。但在部署agent的情况下,又需要对自己的agent,系统有一定的了解,不能因此而影响业务,这又一次回到了技术领域的范畴。
责任心/好奇心:
笔者认为,这个是做安全工作,尤其是前者是防御工作的重要素质,笔者见过很多攻击事件,告警明明已经产生,但是由于没人去看,导致攻击的手,这非常令人惋惜。另外,笔者觉得很多攻击都是非常“朴素”的,不需要什么0day,只用一个可能n年前已知的漏洞,一个简单的弱口令,普通的再不能普通的bash反弹,便打穿了整个防御体系。因此需要有足够的责任心,要从告警(哪怕是海量)中抽丝拨茧,发现问题。这里笔者有个非常深刻的感触,就是lake2之前说的一个案例,他们可以从一个告警中发现cve,个人觉得这应该算防御的一个最高境界了,而笔者个人觉得,一般公司做到这样固然好,但是没有那么强的技术能力,从告警中能识别到攻击,也已然非常不错了 。
最后,笔者还认为,既然建立了监控体系,那么就应该多用,因为只有使用了,才可以从中发现问题与不足,从而进一步完善系统与策略,毕竟只有平时像战时,才能战时像平时。
以上便是个人的一点点关于安全防御的粗浅理解,在这条路上,个人觉得还是初学者,还有很长的路要走,也有很多经验需要学习,希望可以抛砖引玉,共同学习。