构建安全、弹性和可扩展的云原生应用程序需要一套不同于传统应用程序开发的新最佳实践。从这六个开始。
云原生架构的出现极大地改变了应用程序的开发、部署和管理方式。虽然云原生架构在可扩展性、弹性和灵活性方面具有显著优势,但它们也带来了独特的安全挑战。
这些挑战通常与传统的单体式应用程序不同。了解这些细微差别对于开发人员来说至关重要,特别是因为现代云原生应用程序是新旧安全挑战的混合体,必须全面解决。
本文概述了六种安全编码实践,这些实践对于构建安全、可复原且可扩展的云原生应用程序至关重要。这些做法不仅仅是“锦上添花”,而是有助于任何云原生应用程序的整体安全态势的基本原则。
在云原生生态系统中,微服务的模块化特性既带来了优势,也带来了挑战。在开发微服务时,不应在更广泛的应用程序上下文中对其使用做出假设。微服务的本质在于它们可以是可重用的模块化组件。这意味着,最初为一个应用程序中的特定目的而设计的相同微服务,以后可以集成到具有完全不同安全约束的不同应用程序中。
鉴于这种流动性,以零信任的心态处理每个微服务至关重要。通过这样做,您可以确保没有服务盲目信任另一个服务,从而加强每个微服务的防御,无论其使用上下文如何。零信任的两个关键要素是微分段和服务到服务身份验证。
微分段涉及将应用程序划分为更小、更易于管理的组件(微服务),并为每个组件设置独立的安全控制。这样可以确保即使一个组件遭到入侵,攻击面也会受到限制。示例:在云原生电子商务应用程序中,您需要将库存、付款和用户身份验证分离到不同的微服务中,每个微服务都有自己的安全协议。
服务到服务身份验证不仅仅依赖于用户身份验证,而是确保服务在交换信息之前相互进行身份验证。这可以使用双向 TLS (mTLS) 等技术来完成。示例:当电子商务平台中的库存微服务从支付微服务请求付款详细信息时,可以使用双向 TLS 来验证这两种服务的身份。
SQL 注入和文件路径遍历等攻击通常会利用糟糕的输入验证。在微服务可能公开多个 API 的云原生应用程序中,此类攻击的风险成倍增加。确保对每个输入进行严格的验证和清理对于安全性至关重要。这意味着所有数据(无论是来自最终用户、其他服务,甚至是内部数据库)都应被视为潜在的恶意数据。
严格的 API 安全措施包括类型检查、边界验证和白名单。类型检查和边界验证涉及验证输入的数据类型,确保它们与预期类型匹配,并为某些类型的输入设置边界或限制,以防止溢出、下溢或其他基于输入的恶意攻击。
示例:如果电子商务网站有一个用于表示要购买的商品数量的字段,请确保它只接受正整数。拒绝负数或字母字符等输入。还要设置上限,例如 100 件商品,以防止不切实际或可能有害的订单。
白名单涉及维护可接受的输入或值范围的列表。只有满足这些预定义条件的输入才应被接受。示例:对于接受自定义功能的颜色输入的 API,请使用白名单仅允许特定颜色代码,例如红色的 #FF0000。
暴露在 Internet 上的应用程序元素越多,攻击面就越大。对于云原生应用程序尤其如此,其中的功能通常被划分为多个松散耦合的服务。将互联网访问限制为仅基本组件会限制攻击者的潜在进入点。关键的互联网暴露控制包括防火墙规则、Virtual Private Cloud (VPC) 和漂移管理。
使用高级防火墙设置阻止所有非必要端口。对网络进行分段以隔离不同的服务,并最大程度地减少每个服务的暴露。示例:将支付网关与主应用程序服务隔离开来,确保即使一项服务遭到入侵,另一项服务也保持安全。
实施 VPC 以隔离应用程序的不同部分。这应该包括每种服务类型的单独子网和网络 ACL,以限制它们之间的流量。示例:将您的电子商务应用程序划分为单独的 VPC,用于用户身份验证、产品目录和付款处理。
监视服务中的配置偏移。通常,由于其他地方的更改,内部服务可能会无意中暴露给公众,例如为适应不相关的 API 请求而进行的修改。针对任何意外的配置更改建立警报,并及时解决任何偏差。
示例:假设有一个内部报告服务仅用于管理访问。如果不相关的 API 修改无意中将此服务暴露给普通员工或公众,则偏移管理工具会提醒开发团队这种无意的暴露,并立即进行修复。
将数据存储在文件中,尤其是敏感数据,需要更高的安全级别。虽然数据库有其自身的一系列风险,但如果处理不当,文件存储可能会更加不稳定。基于文件的数据在静态时应始终加密。此外,应该有严格的控制措施来限制谁可以访问这些文件。
安全文件存储实践包括静态加密和基于角色的访问控制。还要密切关注临时文件。临时文件不是临时的。
始终使用平台原生加密方法,以确保最安全的数据存储。即使不良行为者获得了对物理存储的访问权限,他们也无法读取数据。例如,使用云存储解决方案提供的内置加密方法在存储用户数据之前对其进行加密。
使用基于角色的访问控制 (RBAC) 机制来管理对存储文件的访问。记录所有访问以创建审计跟踪。示例:在医疗保健应用程序中,仅允许某些医务人员访问患者记录。
在进程或调试期间生成临时文件时要小心。它们可能会无意中包含敏感信息。实现例程以自动清理这些文件,并确保它们不会停留超过必要的时间。
示例:如果开发人员生成临时日志来排查用户身份验证错误,则必须有一个自动化流程,在问题解决后清除这些日志,以确保不会遗漏敏感数据。请记住,疏忽很容易发生(即使对于 Microsoft 也是如此),因此清理过程中的勤勉至关重要。
应用最小权限原则对于云原生应用程序开发至关重要。服务应仅具有执行其功能所需的权限。这样可以最大限度地降低被入侵的服务被用于攻击系统其他部分的风险。在代码中应用最小特权的可操作步骤包括作用域权限、临时凭据和定期审核。
微调权限设置,使其与每个组件的特定职责保持一致。从许多角度来看,这都很重要,但往往会忽略 API 的视角。您的 API 需要读写吗?如果是这样,请使它们成为两个不同的 API,并为每个 API 提供所需的最低权限。
示例:用户注册服务(可能进行更改)应具有与报告数据的只读服务不同范围的权限集。
对需要比平时更多权限的任何操作使用短期凭据。确保这些内容在任务完成后立即过期。示例:对于需要提升权限的备份操作,请使用备份完成后立即过期的临时凭据。
定期和频繁地进行审计,以识别过于宽松的角色并采取纠正措施。自动化工具可以标记此类角色并提出纠正措施。示例:使用自动审核工具定期检查系统的角色和权限,突出显示任何具有超必要访问权限的角色和权限。然后采取纠正措施,将这些权限的范围缩小到后面。
日志记录对于监视和调试至关重要,但日志也可能包含敏感信息。数据屏蔽可确保当日志中出现敏感信息时,将其替换为隐藏版本,从而降低数据泄露的风险。在日志中实施数据屏蔽的关键组件包括自动修订工具、集中式日志管理和日志保留策略。
使用专门的软件工具自动扫描和编辑日志中的敏感信息。这些工具可以被编程为识别社会安全号码、信用卡号或密码等模式。示例:在财务应用程序中,确保在记录信用卡信息之前自动编辑,仅保留最后四位数字以供参考。
部署集中式日志管理系统,聚合来自各种来源的日志。这不仅增强了监控,还确保了在所有日志中统一应用屏蔽和编辑策略,从而减少了敏感数据泄露的机会。示例:在具有多个微服务的分布式云原生应用程序中,将所有服务的日志聚合到一个集中式系统中,确保数据屏蔽规则一致地应用于所有传入日志。
制定严格的策略,规定日志文件的保留时间。使此策略与任何合规性要求保持一致,并自动删除超过此期限的日志。示例:根据 GDPR,将包含个人数据的日志设置为在 30 天后自动删除,除非出于审核或法律原因需要。
构建安全、弹性和可扩展的云原生应用程序需要一套不同于传统应用程序开发的新最佳实践。关键是尽早将这些实践(从零信任架构到日志数据脱敏)集成到开发生命周期中,使安全性成为设计和部署过程中不可或缺的一部分。
同时,认识到实际实施的实际挑战也至关重要。在快节奏的开发环境中,同时集成所有这些安全实践似乎是一项艰巨的任务。也就是说,开发人员必须认识到相关风险。与其追求瞬间的完美,不如优先了解每种实践,然后根据特定应用程序的需求和上下文战略性地决定集成哪些实践以及何时集成。
随着网络安全环境的不断发展,我们保护这些错综复杂的分布式系统的战略也必须不断变化。借助本文中介绍的实践和见解,您可以更好地规划云原生应用程序安全方面的明智且敏捷的旅程。