保护微服务的 13 个最佳实践

微服务架构展现出极大的灵活性与可扩展性,它允许在不影响整个应用的前提下,对软件组件进行修改、新增或移除。这种架构的优势不仅在于更短的软件开发周期、更精干的开发团队和灵活的编程语言选择,还能在不干扰其他组件的前提下,对特定的功能或服务进行扩展或故障排除。

通常,微服务方法将庞大的单一应用程序分解为可以独立部署的多个不同服务。然而,这些独立的较小服务也意味着组件数量的增加,随之而来的就是保护这些组件的复杂性和难度也增加了。

单体架构与微服务架构对比图:红帽公司

通常,典型的微服务部署会涉及硬件层、服务或应用层、通信层、云平台、虚拟化层以及编排层。每一层都有其特定的安全需求、控制措施和挑战。

微服务面临的安全挑战

微服务通常是广泛分布的系统,它们具有复杂的访问规则、更大的流量监控需求以及更广阔的攻击面。此外,大多数微服务云部署在云环境中,这些环境本身也具有不同的安全配置和控制。

由于暴露的API、端口和组件数量众多,传统的防火墙可能难以提供足够的安全保障。这些问题使得微服务部署更容易遭受各种网络威胁,例如中间人攻击、注入攻击、跨站脚本攻击(XSS)、分布式拒绝服务攻击(DDoS)等等。

网络安全是微服务面临的另一大挑战。尤其是在身份和访问控制方面,其复杂性达到了一个新的高度。其他的安全漏洞包括不安全的代码以及服务发现系统中的缺陷。

尽管保护微服务比保护单体应用更加困难,但通过制定完善的安全策略并遵循最佳实践,我们仍然可以有效地保护它们。

理想情况下,这种架构需要一种分布式的安全方法,该方法应该覆盖所有不同的组件。

需要重点关注的典型领域包括:

  • 保护应用程序、微服务和用户
  • 保护身份和访问管理
  • 保护数据
  • 增强服务之间的通信安全性
  • 监控微服务和安全系统

保护微服务的最佳实践

最佳的安全策略是结合使用最佳实践、工具和控制措施来保护整个生态系统。具体的方法可能因服务类型、应用程序、用户、环境以及其他因素而异。

如果您决定采用微服务架构,则需要确保满足服务、连接和数据的所有安全需求。

接下来,让我们探讨一些有效的微服务安全实践。

#1. 从一开始就融入安全理念👮

将安全性作为开发周期的重要组成部分。理想情况下,应从一开始就将安全性集成到微服务的开发和部署中。与在软件开发接近完成时才添加安全措施相比,这种方式解决安全问题更简单、更高效,且成本更低。

#2. 采用纵深防御机制

纵深防御(DiP)是一种在服务和数据上应用多层安全保护的技术。这种做法可以使攻击者更难以穿透多层防御,从而为您的服务和数据提供强大的安全保障。

与诸如防火墙等外围安全解决方案不同,纵深防御的概念截然不同。它依赖于防病毒软件、防火墙、补丁管理、反垃圾邮件软件等工具的组合,在整个系统中提供多层安全保护。

纵深防御多层安全示意图:Imperva

使用这种方法,您首先必须识别敏感服务,然后在它们周围应用适当的安全层。

#3. 在容器📦级别部署安全性

在大多数情况下,微服务依赖于容器技术。因此,保护容器的内部和外部安全是一种减少攻击面和风险的方法。理想情况下,以最小特权安全原则为目标是一种很好的做法,这需要结合多种策略,包括但不限于:

  • 将权限限制在所需的最低限度
  • 避免使用 sudo 或特权账户运行服务及其他任何内容。
  • 限制或控制对可用资源的访问和消耗。例如,限制容器对操作系统资源的访问有助于防止数据被盗或泄露。
  • 不要将机密信息存储在容器磁盘上。
  • 使用适当的规则来隔离对资源的访问。

确保容器镜像没有任何漏洞或安全问题也很重要。定期对容器进行安全和漏洞扫描将有助于识别风险。

常用的镜像扫描工具包括:Clair, Anchore 等。

#4. 部署多因素身份验证🔒

启用多因素身份验证可以增强前端的安全性。

访问的用户需要提供其用户名和密码信息,以及另一种形式的验证,例如发送到其手机或指定电子邮件地址的代码。该技术使得那些可能使用了被盗或被黑客攻击的凭据的攻击者更难访问微服务,因为他们无法提供二次身份验证。

#5. 使用用户身份和访问令牌

在微服务部署中,大量的应用和服务需要安全的授权和访问控制。OAuth 2.0和OpenID等授权框架使您能够安全地处理令牌,从而保护您的微服务。因此,这允许第三方应用程序访问用户的其他服务或数据。

在一个典型的部署中,主应用程序会提示用户授权第三方服务。接受后,应用程序会为会话生成一个访问令牌。

特别是,OAuth是最有效的用户身份和访问控制策略之一。尽管还有其他几种授权协议,您也可以构建自己的授权协议,但最好使用OAuth,因为它更标准、更稳定,并且被广泛接受。

#6. 创建 API 网关

通常,微服务由分布在不同网络上的多个组件组成,可以从各种系统和客户端访问。公开微服务会增加漏洞和安全风险。保护它们的一种方法是创建一个单一且安全的入口点,这有助于您集中来自外部系统和客户端的所有访问。

为了实现这一点,部署一个API网关来筛选所有传入的请求,然后再将它们路由到适当的微服务。API网关位于客户端应用程序和微服务之间。它限制了暴露的微服务,同时提供了额外的请求管理功能,例如身份验证、SSL终止、协议转换、监控、请求路由、缓存等。

通过这种方法,API网关将所有外部服务路由到微服务,同时还支持纵深防御的安全原则。

微服务API网关示意图: Manning Livebook

典型的API网关包括:NGINX, Kong, Tyk, Ambassador, AWS API Gateway 等。

要了解更多关于API安全的信息,请查阅我们关于如何以及为何要保护API端点的指南。

#7. 基于部署区域配置API

通过确保用户只能访问他们需要的API和服务来实施基于角色的限制。由于大多数恶意软件通常会将服务暴露给更多人,因此将访问权限限制为仅授权用户可以降低风险。减少暴露的一种技术是根据应该有权访问API的用户来标记API。通常,API可以分为:

  • 公共API:用于向数据中心外的外部世界公开的服务。
  • 企业区API:用于内部私人流量。
  • DMZ API:处理来自互联网的流量。
  • 混合区API:用于数据中心部署。

#8. 保护服务之间的通信

一种有效的做法是在两个微服务通信时对请求进行身份验证和授权。

通常,您可以使用三种主要技术来保护服务间通信。它们是信任网络、JSON Web令牌(JWT)和相互传输层安全性(mTLS,或相互TLS)。

使用JWT保护服务间通信示意图:Manning Livebook

在这三者中,最受欢迎的是mTLS。在这种方法中,每个微服务都必须携带一对公钥/私钥。然后,客户端微服务使用密钥对通过mTLS向接收微服务验证自己。

在身份验证期间,每个微服务都会生成一个证书。之后,每个微服务都会使用对方的证书来验证自己的身份。

虽然TLS为传输中的数据提供完整性和机密性,但它还使客户端能够识别微服务。客户端微服务通常知道其他微服务。然而,由于TLS是单向的,接收微服务无法验证客户端微服务,攻击者可以利用此缺陷。另一方面,mTLS提供了一种方法,其中每个微服务都可以识别另一个微服务。

#9. 限制🚏客户端流量的速率

限制外部流量可以防止诸如拒绝服务(DoS)攻击以及某些客户端占用大部分应用程序带宽的情况。一种方法是应用各种规则,这些规则可以根据IP、时间等监视和控制从客户端发送或接收的流量速率。

将您的服务配置为在检测到多次失败的API登录尝试或任何其他可疑活动时减慢速度。

一个缓慢的系统会阻止攻击者,并可能放弃他们访问服务的尝试。您可以使用API网关、代码或其他任何技术来进行速率限制。通常,大多数SaaS环境都有API速率限制,以最大限度地减少用户滥用和攻击。

#10. 使用编排管理器

除了增强安全性之外,编排管理器还允许您自动执行配置、协调和其他微服务管理任务。通常,这些工具使您能够管理多个容器、限制元数据访问、隔离工作负载、收集日志等等。

一些编排工具还具有附加功能,使开发人员能够存储和共享敏感信息,例如SSL证书、加密密钥、密码和身份令牌。

有效的微服务编排的两种常用方法是:

  • 将编排编码为微服务
  • 使用API网关提供编排层

由于需要扩展服务时存在挑战,因此不建议通过API网关进行编排。

微服务编排层示意图: GlobalLogic

典型的编排管理工具包括:Kubernetes, Istio, Azure Kubernetes Service (AKS) 等。

要了解更多信息,请浏览有关DevOps容器编排的内容。

#11. 监控所有系统和服务

由于微服务依赖于分布式系统,因此您需要为所有单独的组件制定可靠且有效的监控策略。

部署持续监控可以使您及时检测和解决安全风险。为此,有广泛的微服务监控解决方案,包括:Prometheus, Statsd, InfluxDB, Logstash 等。

微服务架构内部监控

使用适当的工具来监控内部系统和服务。一些最佳实践包括:

  • 在应用层启用日志记录。 您可以使用Splunk, Grafana, ELK Stack以及其他在应用程序、容器、网络和基础设施级别收集日志的工具。
  • 监控指标的使用情况。
  • 使用CPU、内存、响应时间、错误、通知等指标的趋势来检测异常活动,这些活动可能表明存在或潜在的攻击。
  • 审核传入的客户端请求、数据库记录、容器和其他区域的日志,以识别不一致或异常的活动。

#12. 自动化安全活动

自动化安全流程,例如部署更新、漏洞扫描、监控、执行策略和其他活动。此外,检查更新以确保它们是安全的,并且不会引入新的漏洞。

更新后,安全软件最好对所有容器和微服务进行测试,看看之前是否存在漏洞或安全问题。

#13. 时刻保护🛡️数据

保护传输中和静止的数据。理想情况下,强制对所有通信使用HTTPS,以保护传输中的数据,并对所有静态的敏感数据进行加密。避免传输和存储代码之外的纯文本密码、密钥、凭据和敏感数据。

最好的策略是尽早使用标准技术加密所有敏感数据。此外,尽可能晚地解密数据,以减少暴露。

总结

微服务依靠分布式组件来提供更大的灵活性和部署选项等优势。但是,在使用微服务时,组织必须调整内部的安全策略和措施,以采用更加云原生和分布式的方法。

理想情况下,目标是减少攻击面,保护微服务环境、API、应用程序和数据。