零信任是当今网络安全圈的一个热门话题,但每当我提出假设违规作为零信任思维的关键部分的概念时,我仍然会收到奇怪的眼神。 我认为这种反应可能出于两个原因。 首先,一些安全从业人员可能会将此解读为一种极其悲观的世界观;他们内心对“假设违规”的看法是:“所以,你是说我们都完了。 那么,我们就举手投降,不再尝试了。 ” 其他人,也许是那些比较骄傲的人,可能会有这样的态度,“好吧,你的资料可能会被泄露,但我的安全措施坚如磐石,坏人绝对不可能突破我的防御。”
我的意图并不是走向这两个极端,而是强调内化在数字世界中运作的现实,即违规行为将会发生,因此可以而且应该被考虑到任何安全系统的设计中。 这不是一个新颖的概念,我们应该从几代工匠和贸易工人的智慧中汲取灵感。
管道工、电工和其他在现实世界中工作的专业人员早已内化了“假设违约”的真正本质。 因为他们的任务是创建在有形环境中必须稳健的解决方案,所以他们隐性接受并纳入了故障发生在其工作范围内的简单事实。 他们也明白,失败并不是对他们技能的谴责,也不是放弃他们的服务的理由。 相反,只有最熟练的人才能了解自己的创造物最终会失败,从而吸取过去失败的教训,并能够预测未来可能出现的失败。
我最近就遇到过这样的故障;我家的一条下水道管道在排水通道中间被堵塞了。 这所房子已有 30 多年的历史,因此出现故障(即出现漏洞)并不奇怪。 毕竟,任何系统在较长时间内被攻破的可能性都接近 100%。
这就是重点。 对于应用安全解决方案来说,随着时间的推移预测故障就像对于我的管道系统一样真实。 此外,假设“我的管道系统永远不会出现故障”作为家庭维护策略并不比“我的网络防御永远不会被突破”更合适。
因此,水管工和网络安全从业人员的思维应该包括如何处理最终发生的故障,即违规行为。
处理系统故障(物理故障或网络故障)的有效策略通常包含三个部分。
能见度。 确保足够的可见性,以便尽快发现故障。 浴室排水管中的管道泄漏如果不加以处理,将导致下面的地板腐烂、发霉,而这可能需要数月或数年才能被发现。 或者,人们可能会注意到,在地板下的水盘溢出并且石膏板饱和之后,水从二楼浴室下方空间的天花板上滴落。 在任何一种情况下,第一次检测到问题都是在初始故障发生一段时间之后,并且已经发生了额外的二次损坏之后。
假设失败/违规的首要原则必须是在失败发生后尽快提供可能受到损害的明确指标,理想情况下甚至对可能的失败提供主动通知。 例如,依靠污水泵排水的地下室通常有传感器,当水位超过预设阈值时会发出警报。 在其他情况下,如果无法对所有可能的故障模式进行主动警报,则需要进行例行维护检查,例如每半年检查一次热水器。
在网络安全中,这意味着应用安全架构必须包含经过深思熟虑和测试的遥测策略,该策略考虑最重要的故障模式,以便及时发现任何可能的漏洞。 在实践中,应使用 AISecOps 实践将遥测数据流式传输到分析和通知工具,同时将其保存到数据存储中以供日后使用。 应使用人工智能和警报工具来提高效力并为人类提供背景信息并确保及时响应。 持久数据应该被用来进行学习并帮助增强未来的稳健性。
鲁棒性。 解决方案必须包括绕过故障或减少故障持续时间的方法。 在这种情况下,稳健性的常见模式是(a)优雅降级或(b)冗余,选择取决于使用降级组件进行操作的可行性。 有些系统(例如热水器)可以同时具有这两种功能。 例如,我的热水器使用泵供循环系统来始终提供热水以供使用。 但是如果泵出现故障,我仍然可以获得热水,但是需要等待更长的时间。 另一方面,加热线圈传感器故障(加热元件无法关闭)可能导致灾难性的故障,因此需要使用压力释放阀形式的冗余。
应该在多个系统范围内考虑稳健性。 例如,仅在排水管的范围内,从事商业级解决方案的管道工可能会安装一对冗余的处置管线,因此任何一条管线的故障都不会导致排水管无法使用。 另一方面,操作系统抽象级别的架构师可以在系统级别设计冗余,例如在附近添加第二个水槽或马桶,这也有利于解决更多的故障模式,而不仅仅是解决排水管堵塞的问题。
当然,冗余是网络安全中的常见做法,因为许多安全设备都以主动/备用(完全冗余)或主动/主动(优雅降级)模式部署。 然而,网络安全世界与现实世界略有不同。 首先,网络安全领域存在有意图和智慧的主动攻击者,这意味着故障很少是由自然原因造成的。 第二个更重要的差异是规模。 因为软件是虚拟的而不是物理的,所以它遵循“一次编写,多次部署”的模式。 虽然这对于扩展来说是一个很好的特性,但它也意味着核心软件组件中的代码漏洞可能会影响系统中该代码的所有实例。 因此,网络安全解决方案的稳健性还基于避免单点故障和单一类别的元素故障;这种策略有时被称为“纵深防御”。 多因素身份验证是这一想法在实践中的一个很好的例子。 每个因素的失效模式(妥协手段)都不同,单独任何一个因素的妥协都不会损害整个系统。
遏制。 限制故障的影响(爆炸区域)至关重要。 正如我们接受故障或违规行为会发生一样,我们也必须接受我们无法完全避免单点故障或为每个功能要求建立冗余。 因此,架构师还应该考虑如何最大限度地减少故障的影响,将努力和后果作为两个重要的优良指标。 例如,管道工可能会在排水管道上策略性地添加清理口,以减少补救时间。 对于更严重的故障,承包商可能会选择 PVC 而不是镀锌排水管,以便更容易修补管道中的泄漏,从而减少补救工作量。 一种常见的家庭管道做法是使用关闭阀来限制(检测到的)故障的后果,从而防止对梳妆台和地板造成二次损坏。
在网络安全领域,类似的概念是隔离性、可维护性和模块化。 隔离是为了最大限度地减少附带损害或止血;一个好的做法是使用微分段等技术,让基础设施可以充当断路器。 可维护性意味着,在可能的情况下,能够快速、轻松地从受损状态恢复到未受损状态;例如,重新启动受到内存溢出攻击的工作负载可能是一种有效(尽管不完整)的缓解方法。 模块化是构建系统的实践,允许轻松交换类似的功能组件,以便在无法维护或维护不充分的情况下,可以最大限度地减少补救所需的工作量。
这些是我在处理违规行为方面学到的一些最佳实践,但我当然不声称没有其他做法。 更重要的是,负责保护应用的开发人员和安全专家要明白,逃逸行为将会发生,违规行为也将不可避免地发生。 从这个角度来看,我们如何计划和处理这些故障同样重要,值得我们深思熟虑,就像我们如何尽量减少这些故障的发生频率一样。
最终,我们不仅会根据违规行为发生的频率受到评判,而且还会根据违规行为不可避免地发生时我们的反应能力受到评判。