关于应用的性能和可伸缩性,以及确保应用在企业环境中稳定的最佳实践,我们已经讨论了很多。我们必须了解用户体验对于使应用在企业内部获得成功是多么重要。但你认为我们遗漏了什么吗?
想象一下,我们拥有构建成功的企业应用的所有组件,并且我们能够使其具有可扩展性,同时还能以最少的偏离预期行为的方式为用户提供适当的响应时间。但是,任何人都可以轻松地从我们的应用中访问记录。如果存在漏洞,允许用户从应用收集敏感数据,甚至不进行登录,该怎么办?是的,这就是缺少的环节:应用安全性。在企业内部,应用的安全性是一个非常重要的因素。不安全的应用可能会将敏感和机密数据泄漏给意外方,还可能对组织造成法律上的严重破坏。
应用安全是一个大话题,即使是一本 500 页的书也不足以深入讨论这个话题。但在本章的整个过程中,我们将快速介绍如何处理应用安全性,并让用户在使用应用时感到安全。
作为一名读者,在本章结束时,您将了解以下内容:
- 企业应用安全的重要性
- 用于破坏应用安全的不同类型的攻击向量
- 应用开发中导致违规的常见错误
- 使您的应用安全
在本章中,我们希望用户了解配置 web 服务器的基本知识和网络通信的基本知识。
应用安全性是一个非常重要的话题,您可能会讨论如何保护机密数据不被泄露,使应用具有足够的弹性以应对破坏攻击。
说到企业,这个话题就变得更加严肃了。这是因为大多数企业都在处理大量的个人数据,其中可能包括可用于识别个人用户的信息或与其财务详细信息相关的信息,如信用卡号、CVV 代码或支付记录。
大多数企业花费大量资金来提高其业务的安全性,因为它们无法承受其链中可能导致其存储的机密信息遭到破坏的薄弱环节。违规行为可能给组织带来的影响首先是对未能维护机密数据安全的组织处以罚款,并扩展到可能导致组织破产的信任损失。
安全性不是开玩笑的,没有一种解决方案适合所有人。相反,为了使事情变得更加复杂,用于突破组织安全屏障的攻击变得越来越复杂,也越来越难以建立防范措施。如果我们回顾一下网络安全漏洞的历史,我们可以找到一些例子来说明网络安全问题会受到多大的冲击。例如,近年来,我们看到一些涉及主要组织的违规行为,其中一个组织发现超过 3000000000 个用户帐户被违规;在另一次攻击中,一个游戏网络发现了安全漏洞,并持续了大约一个月,给该组织造成了巨大的经济损失。
网络安全领域清楚地表明了一件事:这是一个不断发展的领域,每天都会发现新类型的攻击,并且正在研究新的缓解措施以及时克服它们。
现在,让我们来看看为什么企业应用安全是一个重要的话题和不应该妥协的话题。
大多数企业,无论规模大小,都要处理相当数量的用户数据。这些数据可能涉及公开的用户信息,也可能涉及机密数据。一旦这些数据进入组织的存储器,组织就有责任保护数据的机密性,使未经许可的任何未授权方都无法访问这些数据。
为了实现这一目标,大多数企业都加强了网络安全,并建立了多重屏障,以防止未经授权访问其用户数据系统。那么,让我们来看看为什么企业安全如此重要的一些原因:
- **数据保密:**很多机构。。。
信息技术领域发展迅速,每天都有新技术涌现。双方之间的通信方式也在不断发展,提供了更有效的远程通信。但这一演变在系统安全方面带来了自己的一系列挑战。让我们来看看对组织造成系统安全困难的挑战:
- **不断增加的数据量:**随着大多数组织构建其系统来利用 AI 和 ML 为其用户提供更个性化的体验,他们也在收集大量关于其用户的信息,以改进建议。如此巨大的数据存储量使得数据的安全性更难维护,因为现在越来越多的机密信息被保留,使得系统成为攻击者获利的机会。
- **通过公共服务提供商分发数据:**许多企业现在正在缩减其存储基础架构,并越来越依赖第三方公共存储提供商,后者以更低的成本提供相同数量的存储,同时降低了维护成本。这也使企业安全面临风险,因为现在数据由第三方服务提供商的安全策略管理,而数据的所有者对数据的安全策略几乎没有控制权,数据通过该策略受到保护。存储服务提供商的一次违规可能会暴露不同组织的多个用户的数据。
- **越来越多的设备接入互联网:**随着越来越多的设备接入互联网,攻击面也随之增加。即使是单个设备内部有一个薄弱环节,无论是在加密标准方面,还是由于没有实施适当的访问控制,整个系统的安全性都很容易被破坏。
- **复杂的攻击:**攻击变得越来越复杂,攻击者现在在系统中使用 day zero 漏洞,甚至利用组织尚未发现的漏洞。这些攻击会破坏大量数据,并对整个系统构成巨大的安全风险。更为复杂的是,由于这些漏洞是新的,它们没有立即的解决方案,导致响应延迟,有时甚至延迟了对攻击发生的识别。
- **国家发起的攻击增加:**随着全球范围内信息技术驱动的通信和流程的不断发展,战争环境也在发生变化。过去战争是在地面进行的,现在战争是通过网络进行的,这导致了国家发起的攻击。这些攻击通常针对收集情报或造成重大破坏的企业。国家发起的攻击的问题在于,这些攻击本质上非常复杂,并且使用了大量资源,这使得它们难以克服。
有了这些,我们现在知道是什么不同的因素使得企业难以提高其系统的安全性。这就是为什么网络安全总是在迎头赶上,企业正在提高安全性,抵御攻击者用来攻击 IT 系统的不断变化的攻击向量。
现在,有了这些知识,是时候让我们了解真正影响应用安全性的因素了。只有了解不同的攻击向量,我们才能前进,使我们的应用免受攻击。那么,让我们开始这段旅程吧。
每一次破坏系统安全性或使其崩溃的攻击都会利用运行应用的系统的一个或另一个漏洞。这些漏洞因各种应用而异。为系统本机构建的应用可能与为 web 开发的应用具有不同的攻击向量。
为了充分保护应用免受攻击,我们需要了解针对不同应用类型使用的不同攻击向量。
接下来,我们将简要介绍两种最常见的应用类型以及可能用于针对这些应用的攻击向量。
本机应用是专门为其运行的平台构建的应用。这些应用利用给定平台提供的库和函数来充分利用平台功能。这些应用可能遇到的安全问题通常是影响运行这些应用的底层平台的安全问题,或者是由于应用开发人员留下的漏洞。因此,让我们来看看影响本地应用安全性的一些问题:
- **底层平台漏洞:**当应用在平台上运行时,其功能受底层平台公开的内容控制。如果基础平台容易受到安全问题的攻击,那么平台上运行的应用也会受到攻击,除非它们在应用级别实施适当的措施来缓解这些漏洞。这类问题可能涉及硬件问题,例如最近影响 x86 平台的幽灵和熔毁漏洞。
- **第三方库的使用:**一些使用第三方库的应用,特别是用于在应用内部实现安全性的应用,如果开发人员停止维护这些库,或者存在一些未修复的漏洞,确实会使应用更容易受到安全漏洞的攻击。通常,更好的选择是使用平台本身提供的库,至少对于在应用中实现安全性的用例,而不是使用未记录的平台 API,这可能会对应用的使用产生无法解释的安全影响。
- **数据的未加密存储:**如果应用可能涉及数据存储的存储和检索,未加密格式的数据可能会导致数据被不受信任的来源访问,并且可能导致数据容易被误用。应用应该确保它存储的数据是加密的。
- **与第三方的未加密通信:**如今,许多应用依赖第三方服务来实现特定功能。这是正确的,即使在公司网络中,应用可能会调用网络中的第三方身份验证服务器来验证用户的身份。如果应用之间的通信未加密,则可能导致攻击,例如中间人攻击。
- **避免绑定检查:**如果应用的开发人员错过了可能的边界检查,则那些正在实施自己的内存管理技术的本机应用可能会变得容易受到攻击,从而使攻击者能够访问应用边界以外的数据。这可能会导致系统的安全性受到严重破坏,不仅来自受影响应用,而且来自其他应用的数据都会暴露在外。
这是可能影响本机应用安全性的问题的非详尽列表。其中一些问题可以很容易地解决,而另一些问题则需要应用开发人员和平台提供商付出大量努力来缓解可能的安全漏洞。
现在,有了可能影响本机应用的攻击向量的知识,是时候让我们继续了解可能影响 web 应用的攻击向量了。
Web 应用的使用率一直在不断增长。随着互联网的日益使用,越来越多的组织将其日常办公工作转移到 web 应用上,这些应用有助于在位于不同地理位置的不同办公室之间建立连接。但这些优势在安全方面也有其自身的成本。
web 应用的安全性一直是一个具有挑战性的领域,因为在 web 应用上发生攻击的方式非常多。那么,让我们来看看那些困扰 Web 应用安全的问题:
- SQL 注入:SQL 数据库支持的 web 应用的常见攻击之一是使用 SQL 注入。。。
是时候让我们了解什么样的实践通常会将应用置于安全漏洞区。可能有许多因素会导致应用出现安全问题,在我们浏览本节时,我们将了解一些通常会使应用容易受到安全漏洞攻击的错误。所以,让我们一个接一个地看一遍。
作为应用开发人员,我们希望用户信任我们的应用。这是我们确保用户使用我们的应用的唯一方法。但是,如何平等地信任我们的用户并期望他们不会做错什么呢?具体地说,通过使用我们的应用向用户公开的输入机制来获取他们的输入,从而信任他们。
以下代码片段显示了一个不过滤用户提供的输入的简单示例:
username = request.args.get('username')email = request.args.get('email')password = request.args.get('password')user_record = User(username=username, email=email, password=password) #Let's create an object to store in database ...
现在,作为应用开发人员,我们喜欢应用代码库的简单性,以便以后可以轻松地维护应用。在保持这种简单性的同时,我们认为我们的应用已经在一个漂亮的防火墙后面运行,并且每个访问都经过了彻底的检查,那么为什么不将用户的密码以明文形式存储在数据库中呢?这将帮助我们轻松地匹配它们,并帮助我们节省大量 CPU 周期。
有一天,当应用在生产环境中运行时,攻击者能够破坏数据库的安全性,并以某种方式从用户表中获取详细信息。现在,我们所处的情况是,用户的登录凭据不仅被泄露,而且还以明文格式提供。按照一般心理学,许多人会在许多服务上重复使用相同的密码。在这种情况下,我们不仅冒着用户在应用上的凭据风险,而且还冒着用户可能正在使用的许多其他应用的凭据风险。
这种试图在不使用任何强加密的情况下存储安全敏感数据的做法,不仅会使应用面临随时可能发生的安全问题的风险,还会使其用户面临安全问题的风险。
与丢失绑定检查相关的安全问题在软件应用中非常常见。当开发人员不小心忘记在他们正在实现的数据结构中实现边界检查时,就会发生这种情况。
当程序试图访问分配给它的内存区域之外的内存区域时,会导致程序出现缓冲区溢出。
例如,考虑下面的代码片段:
arr = [None] * 10for i in range(0,15): arr[i] = i
当执行此程序时,该程序会尝试更改实际上不受其管理的内存内容。如果底层平台不提供任何类型的内存保护,该程序将能够成功地覆盖。。。
大多数生产应用依赖第三方库来启用某些函数集。保持这些库过时可以节省额外的几千字节更新或维护软件,使其继续使用更新的库。但是,这也会导致应用存在未修复的安全漏洞,攻击者可能会利用这些漏洞非法访问应用和应用管理的数据。
许多应用实际上会将完全数据库权限授予应用的单个用户。有时,这些权限足以允许应用数据库用户拥有与数据库的根用户相同的权限集。
现在,这种实现有助于解决验证某个用户是否具有执行数据库操作的特定权限以及必须切换用户以完成数据库操作的问题,但也会在应用中打开一个巨大的漏洞。
想象一下,如果某个数据库用户的凭据被泄露。攻击者现在可以完全访问您的数据库,这使他们。。。
如果我们遵循软件安全的一些基本规则,并在应用的开发和生产周期中严格实施这些规则,就可以确保应用的安全:
- **永远不要相信您的用户输入:**作为应用的开发人员,我们应该确保我们不相信任何用户输入。在应用处理来自用户端的所有内容进行存储或执行任何其他类型的操作之前,都应该对其进行适当过滤。
- **加密敏感数据:**任何类型的敏感数据都应具有支持其存储和检索的强大加密功能。在生成加密版本的数据时具有一定的随机性可以帮助攻击者很难从数据中获得任何有用的信息,即使他们以某种方式访问了数据。
- **正确保护基础设施:**应正确保护用于运行应用的基础设施,配置防火墙以限制对内部网络或节点的任何未经授权的访问。
- **实现端到端加密:**两个服务之间发生的任何通信都应该进行端到端加密,以避免中间人攻击或嗅探信息。
- **仔细执行边界检查:**如果您的应用使用任何类型的数据结构,请确保适当的边界检查到位,以避免漏洞,如缓冲区溢出,这可能会导致恶意代码被执行。
- **限制用户权限:**任何应用都不应该只有一个用户拥有授予他们的所有权限。应限制用户权限,以便为用户执行操作定义边界。遵循此类建议有助于限制在权限较低的用户的凭据受损的情况下,违规行为可能造成的损害。
- **保持依赖项更新:**应用的依赖项应保持更新,以确保依赖项不存在任何已知的安全漏洞。
遵循这些指导原则有助于提高应用的应用安全性,并确保应用和数据保持安全,从而维护用户信任和数据安全。
随着本章的深入,我们了解了控制软件应用开发和操作的不同安全原则。我们讨论了需要维护企业应用的高安全标准,以及如果应用的安全性被破坏会发生什么。然后,我们了解了当今系统安全面临的挑战。然后,我们继续讨论用于危害应用安全的常见攻击向量。
一旦我们了解了攻击向量,我们就来看看一些常见的安全反模式,它们会危害应用的安全性,以及与应用相关的数据。一旦我们了解了这些反模式。。。
- 使应用安全性变得困难的不同问题有哪些?
- 什么是 XSS 攻击?
- 如何防止拒绝服务攻击?
- 哪些错误会危及应用的安全性?
如果您发现应用安全性是一个有趣的话题,并且想了解更多关于如何使用 Python 来提高应用安全性的信息,请看一看这个很棒的视频系列,“Python for Continuous Delivery and application security”(Python for Continuous Delivery and application security),该系列由 Manish Saini 编写,Packt 制作。