13个保护微服务的最佳实践
微服务架构提供了灵活性、可扩展性以及在不影响应用程序其他部分的情况下修改、添加或移除软件组件的能力。
除了较短的软件开发周期、更小的团队和灵活的编程语言选择外,它还允许您在不干扰其他组件的情况下扩展或排查特定功能或服务。
通常,微服务允许将大型单体应用程序拆分为可以独立部署的不同服务。然而,这些较小的独立服务增加了组件的数量,因此增加了安全性的复杂性和难度。
通常,典型的微服务部署将包含硬件、服务或应用程序、通信、云、虚拟化和编排层。每个层都有特定的安全要求、控制和挑战。
与微服务相关的安全挑战
微服务通常是分布式系统,具有复杂的访问规则、需要监视的更多流量和更大的攻击面。此外,大多数微服务云运行在具有不同安全配置和控制的云环境上。
由于大量的API、端口和组件是exposed的,传统防火墙可能无法提供足够的安全性。这些问题使得微服务部署更容易受到各种网络威胁的攻击,如中间人攻击、注入攻击、跨站脚本、DDoS等。
网络安全是微服务面临的另一个挑战。特别是身份和访问控制变得更加复杂。其他漏洞包括不安全的代码和服务发现系统中的缺陷。
尽管保护微服务比保护单体应用程序更困难,但通过建立良好的策略和遵循最佳实践,您可以有效地保护它们。
理想情况下,架构需要采用分布式方法,覆盖所有不同的组件。
需要解决的典型领域包括:
- 保护应用程序、微服务和用户
- 保护身份和访问管理
- 保护数据
- 增强服务间通信的安全性
- 监控微服务和安全系统
保护微服务的最佳实践
最佳策略是使用一系列最佳实践、工具和控制来保护整个生态系统。实际的方法可能根据服务类型、应用程序、用户、环境和其他因素而有所不同。
如果您决定使用微服务,您需要确保满足服务、连接和数据的所有安全要求。
现在让我们看一些有效的微服务安全实践。
#1. 从一开始就建立安全性 👮
将安全性作为开发周期的一部分。理想情况下,integrate security从一开始就纳入微服务的开发和部署中。以这种方式解决安全问题比在软件开发接近完成时再添加更容易、更有效、更便宜。
#2. 使用深度防御机制
深度防御机制(DiP)是一种在服务和数据上应用多个安全层的技术。这种做法使攻击者更难穿透多层,从而为您的服务和数据提供强大的安全性。
与周边安全解决方案(如firewalls)不同,深度防御概念有所不同。它依赖于多种工具的组合,如防病毒软件、防火墙、补丁管理、反垃圾邮件软件等,以在系统中分布多个安全层。
通过这种方法,您必须首先确定敏感服务,然后在其周围应用适当的安全层。
#3. 在容器层面部署安全 📦
大多数情况下,微服务依赖于container技术。因此,保护容器(内部和外部)是减少攻击面和风险的一种方式。理想情况下,以最小权限安全原则为目标是一种良好的做法,需要采用多种策略,包括但不限于:
- 将权限限制为最低所需
- 避免使用
sudo
或特权帐户运行服务和其他任何内容。 - 限制或控制可用资源的访问和使用。例如,通过容器限制对操作系统资源的访问有助于防止数据盗窃或妥协。
- 不要将机密存储在容器磁盘上。
- 使用适当的规则隔离对资源的访问。
还需要确保容器镜像没有任何漏洞或安全问题。定期对容器进行安全性和漏洞扫描有助于识别风险。
#4. 部署多因素身份验证 🔒
启用多因素身份验证可以增强前端的安全性。
访问用户需要提供用户名和密码详细信息,以及另一种验证形式,例如发送到其手机或指定电子邮件地址的代码。这种技术使得攻击者更难以访问微服务,因为他们无法提供第二个身份验证方式,而他们可能正在使用盗窃或被黑客攻击的凭据。
#5. 使用用户身份和访问令牌
在微服务部署中,大量的应用程序和服务将需要进行安全授权和访问控制。OAuth 2.0和OpenID等授权框架使您能够安全地处理令牌,从而保护您的微服务。因此,这允许第三方应用程序从用户那里访问其他服务或数据。
在典型的部署中,主应用程序将提示用户授权第三方服务。在接受后,应用程序为会话生成访问令牌。
特别是,OAuth是用户身份和访问控制的最有效策略之一。虽然还有其他几种授权协议,您也可以构建自己的授权协议,但最佳实践是使用OAuth,因为它更标准、稳定且被广泛接受。
#6. 创建API网关
一般来说,微服务由分布在不同网络上的多个组件组成,可从各种系统和客户端访问。暴露微服务会增加漏洞和安全风险。保护它们的一种方式是创建一个单一且安全的入口点,帮助您将所有外部系统和客户端的访问集中在一起。
为实现这一目标,请部署一个API网关,以在路由请求到适当的微服务之前检查所有传入请求的安全问题。API网关位于客户端应用程序和微服务之间。它限制了暴露微服务的同时提供额外的请求管理功能,如身份验证、SSL终止、协议转换、监控、请求路由、缓存等。
使用这种方法,API网关将所有外部服务路由到微服务,同时支持防御深度安全原则。
典型的API网关包括NGINX、Kong、Tyk、Ambassador、AWS API gateway等等。
要了解更多关于API安全的信息,请查看我们的指南Why and How to Secure API Endpoint。
#7. 根据部署区配置API配置文件
通过确保用户只能访问他们所需的API和服务,实施基于角色的限制。由于大多数恶意软件通常会向更多的人公开服务,限制只授权用户访问可以减少风险。一种减少曝光的技术是根据应该访问它们的用户对API进行标记。一般而言,API可以是:
- Ethernet API-面向数据中心外部世界公开的服务。
- Corporate Zone API-用于内部私有流量
- DMZ API-处理来自互联网的流量
- Hybrid Zone API-用于数据中心部署
#8. 保护服务与服务之间的通信
有效的做法包括在两个微服务之间通信时对请求进行身份验证和授权。
一般来说,有三种主要的技术可以用来保护服务之间的通信。它们是“信任网络”、“JSON Web Token”(JWT))和“Mutual Transport Layer Security”(mTLS,或者叫作“Mutual TLS”)。
这三种中最受欢迎的是mTLS。在这种方法中,每个微服务必须携带一个公钥/私钥对。然后,客户端微服务使用密钥对通过mTLS向接收微服务进行身份验证。
在身份验证过程中,每个微服务都会生成一个证书。随后,每个微服务将使用另一个微服务的证书进行身份验证。
虽然TLS可以保护数据在传输过程中的完整性和机密性,但它也可以使客户端能够识别微服务。客户端微服务通常知道另一个微服务。然而,由于TLS是单向的,接收微服务无法验证客户端微服务-攻击者可以利用这个缺陷。另一方面,mTLS提供了一种让每个微服务能够识别其他微服务的方法。
#9. 限制客户端流量 🚏
限制外部流量可以防止拒绝服务(DoS)攻击等问题,也可以防止一些客户端占用大部分应用带宽的情况。一种方法是应用各种规则,根据IP、时间等监控和控制从客户端发送或接收的流量速率。
如果您的服务检测到多次登录尝试失败或任何其他可疑活动,可以配置您的服务减慢速度。
一个缓慢的系统会让攻击者望而却步,可能会放弃尝试访问服务。您可以通过API网关、代码或其他技术来限制速率。通常,大多数SaaS环境都有API速率限制,以减少用户滥用和攻击。
#10. 使用编排管理器
编排管理器允许您自动化配置、协调和其他微服务管理任务,以增强安全性。通常,这些工具使您能够管理多个容器,限制元数据访问,隔离工作负载,收集日志等等。
一些编排工具具有额外的功能,使开发人员能够存储和共享敏感信息,如SSL证书、加密密钥、密码和身份令牌。
有效的微服务编排有两种常用方法:
- 将编排编码为一个微服务
- 使用API网关提供编排层
由于在需要扩展服务时存在挑战,不建议通过API网关进行编排。
典型的编排管理工具包括Kubernetes、Istio、Azure Kubernetes Service (AKS)等。
要了解更多信息,请浏览Container Orchestration for DeOps。
#11. 监控所有系统和服务
由于微服务依赖于分布式系统,您需要为所有单独的组件拥有可靠和有效的监控策略。
部署持续监控可以让您及时检测和解决安全风险。为此,有各种微服务监控解决方案,包括Prometheus、Statsd、InfluxDB、Logstash等。
在微服务架构内部进行监控
使用适当的工具监控内部系统和服务。一些最佳实践包括:
- 在应用程序层启用日志记录。您可以使用链接收集应用程序、容器、网络和基础设施级别的日志的工具。
- 监控使用情况指标
- 使用指标趋势,如CPU、内存、响应时间、错误、通知等,检测现有或潜在攻击的异常活动。
- 审计日志,如传入的客户端请求、数据库记录、容器等,以识别不一致或异常活动。
#12. 自动化安全活动
自动化安全流程,如部署更新、漏洞扫描、链接执行策略和其他活动。此外,检查更新以确保其安全性,并确保其不会引入新的漏洞。
更新后,安全软件应该在所有容器和微服务上执行测试,以查看之前是否可能存在漏洞或安全问题。
#13. 随时保护🛡️数据
保护数据在传输和静态时的安全性。理想情况下,强制使用HTTPS来保护所有通信中的数据传输,并对静态敏感数据进行加密。避免传输和存储明文密码、密钥、凭据和存储在代码之外的敏感数据。
最好的策略是尽早使用标准技术加密所有敏感数据。此外,尽量延迟解密数据以减少暴露。
结论
微服务依赖于分布式组件以提供更大的灵活性和部署选项。然而,在使用微服务时,组织必须调整内部安全策略和战略,向更云原生和分布式的方法转变。
理想情况下,目标是减少attack surface,保护微服务环境、API、应用程序和数据。