跳过内容

C8:全面保护数据

该控制措施的新版本已发布!

您正在查看OWASP十大积极控制措施的2018年旧版。您可以在OWASP十大积极控制措施2024中的C2:使用加密技术保护数据中找到关于同一控制的信息!

描述

密码、信用卡号、健康记录、个人信息和商业秘密等敏感数据需要额外保护,特别是当这些数据受到隐私法(欧盟《通用数据保护条例》GDPR)、金融数据保护规则(如PCI数据安全标准PCI DSS)或其他法规的约束时。

攻击者可以通过多种方式从Web和Web服务应用程序窃取数据。例如,如果敏感信息在没有通信安全措施的情况下通过互联网发送,那么共享无线连接上的攻击者可以看到并窃取其他用户的数据。此外,攻击者还可以利用SQL注入从应用程序数据库中窃取密码和其他凭证,并将这些信息公开。

数据分类

对系统中的数据进行分类,并确定每条数据所属的敏感度级别至关重要。然后,每个数据类别可以映射到每个敏感度级别所需的保护规则。例如,不敏感的公共营销信息可能被归类为公共数据,可以放置在公共网站上。信用卡号可能被归类为私人用户数据,可能需要在存储或传输过程中进行加密。

传输中数据加密

通过任何网络传输敏感数据时,应考虑某种形式的端到端通信安全(或传输中加密)。TLS是迄今为止最常见和广泛支持的用于通信安全的加密协议。它被许多类型的应用程序(Web、Web服务、移动)用于通过网络安全地进行通信。TLS必须以多种方式正确配置,以妥善保护安全通信。

传输层安全的主要好处是,在客户端(Web浏览器)与Web应用程序服务器之间,以及Web应用程序服务器与后端及其他非浏览器企业组件之间传输Web应用程序数据时,保护数据免受未经授权的泄露和修改。

静态数据加密

敏感数据管理的首要原则是尽可能避免存储敏感数据。如果您必须存储敏感数据,那么请确保它以某种方式受到加密保护,以避免未经授权的泄露和修改。

密码学(或加密技术)是信息安全领域中更高级的课题之一,其理解需要最多的学习和经验。它很难正确实施,因为加密方法众多,每种方法都有其优缺点,需要Web解决方案架构师和开发人员充分理解。此外,严肃的密码学研究通常基于高等数学和数论,这构成了严重的入门障碍。

强烈建议不要从零开始构建加密功能,而是使用经过同行评审的开放解决方案,例如Google Tink项目、Libsodium,以及许多软件框架和云服务内置的安全存储功能。

移动应用:安全本地存储

移动应用程序尤其面临数据泄露的风险,因为移动设备经常丢失或被盗,却包含敏感数据。

通常,移动设备上应仅存储所需的最少数据。但如果您必须在移动设备上存储敏感数据,那么敏感数据应存储在每个移动操作系统特定的数据存储目录中。在Android上,这将是Android密钥库;在iOS上,这将是iOS钥匙串。

秘密生命周期

密钥可用于多种敏感功能。例如,它们可用于签署JWT、加密信用卡、签署哈希、提供各种形式的身份验证等。在管理密钥时,应遵守以下(但不限于)多项预防措施:

  • 确保任何秘密密钥都受到保护,防止未经授权的访问
  • 按照应用程序秘密管理中的描述,将密钥存储在适当的秘密保险库中
  • 当需要多个密钥时,使用独立的密钥
  • 在需要时构建支持更改算法和密钥的功能
  • 构建应用程序功能以处理密钥轮换

秘密数据类型

当使用不可变数据类型(如string)存储秘密时,秘密可能会以明文形式在内存中长时间存在。即使您尝试将字符串值置空,它仍然会保留在内存中。string是一个不可变类型,无法更改。当您修改字符串(尝试覆盖它)时,会创建一个新的副本。这意味着未经保护的秘密的另一个副本将保留在内存中。此外,无法保证垃圾回收器何时会清理秘密。这增加了明文秘密在内存中暴露的风险。

如果秘密在内存中未受保护,它们可能会通过多种情况(例如服务器崩溃日志、缓存、序列化或内存分页)泄露到磁盘或外部日志聚合器中。

处理秘密的一种安全方法是使用一次读取模式。一次读取是一种防御性设计模式,其中一个值只能被访问一次。首次读取后,该值将从内存中清除,后续无法访问。有关示例实现,请参阅此帖子

应用程序秘密管理

应用程序包含许多安全操作所需的“秘密”。这些包括证书、SQL连接密码、第三方服务账户凭证、密码、SSH密钥、加密密钥等。未经授权地披露或修改这些秘密可能导致整个系统被攻陷。在管理应用程序秘密时,请考虑以下事项。

  • 不要将秘密存储在代码、配置文件中或通过环境变量传递它们。使用GitRobTruffleHog等工具扫描代码库以查找秘密。
  • 将密钥和其他应用程序级秘密保存在秘密保险库中,如KeyWhizHashicorp的Vault项目Amazon KMS,以在运行时提供应用程序级秘密的安全存储和访问。

防止的漏洞

参考资料

工具