译者 | 刘汪洋
审校 | 重楼
软件的开发、部署和管理模式已经因云原生架构而发生了根本性的变革。尽管它在可扩展性、弹性和灵活性上提供了巨大优势,但同时也带来了一些特有的安全挑战。
这些挑战与传统单体应用的安全问题有着显著的区别。对于开发人员而言,理解这些差异至关重要。尤其是在现代云原生应用程序中,既有传统安全挑战又有新兴安全问题,这要求开发者进行全面应对。
本文将介绍六种用于构建安全、弹性和可扩展的云原生应用程序的关键安全编程最佳实践。这些实践不仅是理想选择,更是构筑任何云原生应用程序综合安全架构的基石。
云原生应用的六大安全最佳实践
- 零信任架构
- 输入验证
- 网络暴露控制
- 安全的文件存储
- 最小权限原则
- 日志数据脱敏
零信任架构
在云原生生态中,微服务的模块化设计既有其优势,也伴随着挑战。在开发微服务时,我们不能预设它们在更广泛应用程序中的具体使用方式。微服务的核心特征是可复用性和模块化,这意味着最初为特定目的设计的微服务,可能在未来被用于具有完全不同安全要求的应用中。
因此,在云原生环境中,对每个微服务采用零信任的策略是至关重要的。这种方法保证各个服务之间不会盲目信任,进而无论如何使用,都能提升每个微服务的安全防护水平。零信任的两个核心组成部分是微分段和服务间认证。
微分段是将应用程序拆分成更小、更易于管理的部分(即微服务),并为每个部分实施独立的安全措施。这样,即使某个部分受到攻击,其影响也能被限制在最小范围内。比如,在云原生电商应用中,可将库存管理、支付处理和用户认证拆分为独立微服务,并为每个服务实施合适的安全措施。
服务间认证不仅限于用户验证,它还确保了服务之间在交换数据前相互验证身份。这可以通过相互 TLS(mTLS)等技术实现。比如,在电商平台中,库存微服务在请求支付微服务提供支付信息时,可以利用相互 TLS 进行双方身份的验证。
输入验证
攻击手段,如 SQL 注入和文件路径遍历,常通过利用弱输入验证机制来实施。在一个包含多个 API 的云原生应用程序中,这种攻击的风险更加突出。因此,对每个输入进行严格的验证和清洗是维护安全的关键。所有数据,无论来源于终端用户、其他服务还是内部数据库,都应被视为潜在的安全威胁。
严格的 API 安全措施包括实施类型检查、边界验证和建立白名单。类型检查和边界验证要求验证输入数据的类型,确保它们符合预期,并为不同类型的输入设定限制,防止溢出、下溢或其他基于恶意输入的攻击。
举例来说,一个电商网站的“购买数量”字段应只接受正整数,拒绝负数或非数字字符,并可能设定最大数量限制(如 100),以防大量虚假或有害的订单。
白名单机制涉及维护一个允许的输入或值范围列表,仅接受符合这些预设标准的输入。例如,一个用于自定义功能的 API 若接受颜色输入,则应使用白名单来限制特定的颜色代码,如用 #FF0000 代表红色。
网络暴露控制
应用程序在互联网上暴露的部分越多,其攻击面就越广。这对于云原生应用程序尤其重要,其功能通常分布在众多松散耦合的服务之间。通过限制仅将互联网访问权限赋予必需组件,可以减少潜在的攻击入口。关键的网络暴露控制措施包括防火墙规则、虚拟私有云(VPC)的配置和管理配置漂移。
应用高级防火墙设置以封锁所有不必要的端口,并通过网络分段来隔离不同服务,最小化每项服务的暴露程度。例如,可以将支付网关与主应用服务隔离,确保即使一个服务被攻破,其他服务依然安全。
部署 VPC 以隔离应用程序的不同部分,包括为不同服务类型设置独立的子网,并通过网络访问控制列表(ACL)来限制它们之间的流量。例如,可将电商应用划分为用户认证、产品目录和支付处理等不同的 VPC。
监控服务配置的漂移情况。通常,由于其他地方的变更,内部服务可能无意间被公开暴露,例如为适应与无关的 API 请求的修改。对任何意外的配置更改设置警报,并及时处理任何漂移情况。
例如,假设一个仅供管理层使用的内部报告服务,因无关的 API 变更而意外暴露给普通员工或公众,配置漂移管理工具能够提醒开发团队这一变化,并促使他们立即进行修复。
安全文件存储
在存储数据时,尤其是涉及敏感信息的文件,需要采取更高级别的安全措施。虽然数据库本身存在安全风险,但不当处理的文件存储可能更加危险。存储的文件,尤其是包含敏感数据的文件,应在不被访问或使用时(即静止状态)进行加密。此外,还需要严格的访问控制措施,以限制对这些文件的访问权限。
安全文件存储的实践包括对文件进行静态加密和实施基于角色的访问控制(RBAC),同时也要特别注意临时文件的安全管理,因为这些“临时”文件可能并非真正的临时。
为确保数据存储的安全性,应始终采用由存储平台提供的内置加密技术。即使攻击者获得了物理存储设备,加密也使得数据无法被读取。例如,在云存储解决方案中,使用内置的加密方法对用户数据进行加密,然后再存储。
实施基于角色的访问控制来管理对存储文件的访问,并记录所有访问活动以形成审计跟踪。例如,在医疗保健应用程序中,可能只允许某些医疗人员访问病人记录。
在处理或调试过程中产生的临时文件需小心处理,以防它们不经意间包含敏感信息。应实施自动化清理这些文件的程序,并确保它们不会超出必要时间存留。
例如,如果开发人员在排查用户认证问题时生成了临时日志,那么在问题解决后自动清除这些日志就至关重要,以确保敏感数据不会遗留。要记住,疏忽可能导致安全漏洞(即便是像微软这样的大公司也不能幸免),因此在清理过程中保持警觉至关重要。
最小权限原则
在云原生应用程序开发中实行最小权限原则是非常重要的。服务应仅具备执行其功能所必需的权限,这样可以最大限度地减少一个服务被攻破后用于攻击系统其他部分的风险。在代码中应用最小权限原则的具体做法包括限定权限范围、使用临时凭证和定期进行权限审计。
细化权限设置,确保其与每个组件的具体职责相匹配。例如,API的权限设置经常被忽视。你的 API 真的需要读写权限吗?如果是的话,可以考虑将其拆分为两个不同的 API,并在每个 API 中仅授予必需的最小权限。
例如,一个用户注册服务(可能需要修改数据)应该拥有与仅提供数据报告的只读服务不同的权限范围。
对于需要更多权限的操作,使用短期凭证,并确保这些凭证在任务完成后立即失效。例如,在进行需要较高权限的备份操作时,可以使用临时凭证,并在备份完成后立即使其失效。
定期且频繁地进行审计,以识别权限设置过于宽松的情况,并采取纠正措施。自动化工具可以用于标记这些过度权限并提出改进建议。例如,定期使用自动化审计工具审查系统的角色和权限,突出显示任何权限过大的情况,并采取相应措施将这些权限范围缩小。
日志数据脱敏
日志记录是监控和调试的关键环节,但日志中可能含有敏感信息。数据脱敏能够确保当敏感信息出现在日志中时,它们被替换为屏蔽版本,从而降低数据泄露风险。实施数据脱敏的关键步骤包括自动化编辑工具的使用、集中式日志管理和严格的日志保留政策。
采用专业软件工具自动识别并编辑日志中的敏感信息。这些工具可以被编程来识别社会安全号码、信用卡号码或密码等敏感信息的模式。例如,在金融应用中,确保在记录日志前自动编辑掉信用卡信息,仅保留用于参考的最后四位数字。
部署集中化日志管理系统,汇总来自不同来源的日志。这不仅加强监控,还确保脱敏和编辑策略在所有日志上统一应用,减少敏感数据泄露的风险。例如,在多个微服务的分布式云原生应用中,将所有服务的日志汇总到一个中心系统中,确保所有传入日志统一应用数据脱敏规则。
制定严格的日志保留政策,并与任何合规要求保持一致。自动删除超出保留期限的日志。例如,为了遵守欧盟通用数据保护条例(General Data Protection Regulation,简称 GDPR),设定包含个人数据的日志在 30 天后自动删除,除非出于审计或法律原因需要保留。
朝着更优秀的安全实践迈进
构建安全、弹性和可扩展的云原生应用程序需要与传统应用开发不同的最佳实践。关键是从零信任架构到日志数据脱敏,将这些实践尽早整合到开发生命周期中,使安全成为设计和部署过程中不可或缺的一部分。
同时,了解在实际开发环境中实施这些安全实践所面临的挑战也非常重要。在快节奏的开发环境中,整合所有这些安全实践看似一项艰巨任务。然而,开发者必须意识到相关风险。关键不是一蹴而就能达到完美,而是要优先了解每种实践,并根据特定应用程序的需求和背景,策略性地决定何时整合哪些实践。
随着网络安全环境的不断发展,我们保护这些复杂、分布式系统的策略也必须跟上。理解本文阐述的实践和见解,对于你制定出具有洞察力和灵活性的云原生应用安全策略将大有裨益。
译者介绍
刘汪洋,51CTO社区编辑,昵称:明明如月,一个拥有 5 年开发经验的某大厂高级 Java 工程师,拥有多个主流技术博客平台博客专家称号。
原文标题:6 security best practices for cloud-native applications,作者:Yossi Pik