作者:胡宏伟 腾讯金融云解决方案中心
2016 年 9 月 14 日,Envoy 的开源标志着应用技术架构进入到服务网格(Service Mesh)时代,2017 年 5 月 24 日,Google、IBM、Lyft 共同宣布 Istio 开源标志着进入由控制面和数据面组成的服务网格成为主流。Istio 是当前最受欢迎的服务网格技术。
什么是服务网格?服务网格(Service Mesh)是管控服务间通信网络的逻辑隔离空间,提供一致透明的服务发现、流量和全链路观测管理环境。同一网格可管理来自多个 Kubernetes 集群,甚至异构 VM 的服务,同一网格内的服务默认网络互通。
Service Mesh 技术的关注点在于服务间通讯,其目标是剥离客户端 SDK,为应用减负,提供的能力主要包括安全性、路由、策略执行、流量管理等。
服务网格是微服务架构的升级,核心的动作是业务逻辑和网络通信的拆分。Service Mesh 技术的优势是屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑。
服务是服务网格管理流量的基本单位,一个服务可对应多个 endpoint 实例,对应关系可来源于服务网格对 Kubernetes 集群的 K8S Service 自动发现,或手动注册 endpoint 与服务的对应关系。
数据面包括边缘代理网关与 sidecar proxy。边缘代理网关以独立 Pod 的形式部署于网格服务发现 Kubernetes 集群中,管控观测南北向流量;sidecar proxy 部署于业务 Pod 内,或业务虚拟机内,管控观测东西向流量。
控制面管理和配置,数据面做流量的路由转发。
服务网格架构对
安全防御带来的改变
服务网格在提供微服务间的通信管理、流量控制和安全性方面发挥了重要作用,但在实施和维护过程中也面临一些安全挑战:
问题一:服务网格对内、对外的网络访问策略应该如何管控?
虽然服务网格提供了细粒度的访问控制策略,但复杂、错误的策略可能导致未授权访问或过度限制合法流量。
网格内的访问控制
Istio 的流量路由规则可以让您轻松地控制服务之间的流量和 API 调用。
微服务有特殊的安全需求,包括防止中间人攻击、灵活的访问控制、审计工具和相互的 TLS。Istio 包括一个全面的安全解决方案,提供了强大的身份、强大的策略、透明的 TLS 加密,以及验证、授权和审计(AAA)工具来保护服务和数据。
如何在服务网格中管理7层流量?
Sidecar 模式是最成熟的服务网格部署模式,已被广泛采用在生产环境中,得到了充分的验证和支持。Sidecar 模式每个服务实例一个 L4 和 L7 的代理,安全性高,因为每个服务实例都是隔离的,减少了潜在的攻击面。
● 网络代理:管理服务间的通信,拦截和处理进出服务的流量。
● 日志和监控:收集和转发日志、指标和追踪信息。
● 安全性:实现身份验证、授权和加密。
● 配置管理:动态加载和更新配置。
Sidecar和控制中心协同,鉴权处理需要访问控制中心的服务授权信息,对于日志处理需要拦截日志后将日志写入到消息中间件。
网格间的访问控制
一个大的微服务应用需要对外统一暴露API接口服务的时候,这些场景仍然需要使用API网关或微服务网关。
我们可以使用Envoy Gateway 或者 Istio Ingress Gateway,让开发人员可以专注于业务逻辑,简化了应用程序的开发,通过将灰度发布、蓝绿部署、流量镜像等运维能力从应用程序中剥离出来,让运维能力不再依赖开发团队。
安全隔离
以 service-based 的认证与授权机制,在容器化动态 IP 场景下,可以实现可控的服务认证与访问控制管理。支持 JWT 请求身份认证、自动 mTLS 实现零信任网络,以及基于身份和流量特征限制访问权限。
实现基于身份认证的旁路阻断
在服务网格架构中,流量可能绕过服务网格的控制和管理,从而导致安全性、可观察性和流量管理缺失的风险。
● 直接服务调用风险:如果微服务之间直接通过 IP 地址或其他方式进行调用,而不是通过服务网格的代理(如 Envoy),则会绕过服务网格的流量管理和安全策略。
● 不当的网络配置:网络配置不当(如防火墙规则、路由设置等)可能导致流量绕过服务网格的代理。
● 依赖外部服务风险:微服务可能依赖于外部服务(如第三方 API),如果这些调用不经过服务网格,可能导致旁路风险。
可以通过部署腾讯无侵入旁路风险检测产品的方式,实现基于身份认证的旁路阻断:
流量监控和异常检测:实施流量监控和异常检测机制,实时监控请求的行为,识别潜在的旁路攻击。可以使用机器学习算法分析流量模式,及时发现异常行为。
● 集成身份和访问管理(IAM):使用 IAM 解决方案来管理用户和服务的身份验证和授权。IAM 系统可以提供强大的身份验证机制,确保只有经过验证的用户和服务才能访问资源。
● 实施强身份验证机制:使用多因素身份验证(MFA)等强身份验证机制,增加身份验证的安全性,防止未授权访问。
● 部署腾讯NDR套件:通过侧栽的方式接入服务网格流量镜像,识别风险,发现恶意攻击和潜在威胁,对攻击事件进行分析、溯源,并以旁路方式实现精准阻断,对业务无侵入。
问题二:高可用环境下对服务网格安全策略的影响?
在高可用环境中,服务网格的安全策略需要综合考虑身份验证、授权、数据加密、流量管理、监控与审计等多个方面。
身份验证与授权
● 服务间身份验证:在高可用环境中,服务可能会在多个实例之间进行负载均衡。服务网格需要确保每个服务实例都能安全地验证其他服务的身份,通常通过使用短期证书(如 mTLS)来实现。
需要确保身份验证机制的高可用性,以避免单点故障(SPOF)。可以考虑使用分布式身份管理系统。
● 细粒度授权:高可用环境中,服务的访问控制策略需要灵活且高效。服务网格可以实现基于角色的访问控制(RBAC)或基于属性的访问控制(ABAC),确保只有授权的服务能够访问特定资源。
需要定期审查和更新授权策略,以适应动态变化的服务实例和环境。
数据加密
● 传输层加密:在高可用环境中,服务之间的通信可能会通过多个网络路径进行。服务网格应确保所有服务间的通信都经过加密(如使用 mTLS),以防止数据在传输过程中被窃取或篡改。
需要考虑加密证书的管理和更新策略,以确保在高可用环境中不会因证书过期而导致服务中断。
● 静态数据加密:除了传输层的加密,静态数据的加密也至关重要。确保存储在数据库或其他存储系统中的敏感数据是加密的,以防止数据泄露。
流量管理与安全策略
● 流量控制:在高可用环境中,流量管理策略(如限流、熔断、重试等)需要与安全策略相结合,以确保在高负载情况下仍能保持服务的安全性和可用性。
例如,流量限制可以防止恶意攻击(如 DDoS 攻击),而熔断机制可以在服务故障时保护其他服务。
● 安全策略的动态调整:高可用环境中的服务可能会频繁变化(如自动扩展、故障转移等),因此安全策略需要能够动态调整,以适应这些变化。
可以使用服务网格的控制平面来动态更新安全策略,而不需要重启服务。
安全访问监控与审计
● 安全事件监控:在高可用环境中,监控安全事件(如未授权访问、异常流量等)是确保系统安全的重要环节。服务网格可以集成监控工具,实时收集和分析安全相关的指标和日志。
需要支持输出访问日志、统计指标和调用跟踪等可观测性数据,以便和现有的安全系统进行能力集成。需要设置报警机制,以便在检测到异常活动时及时响应。
● 审计与合规:高可用环境中的服务需要遵循合规要求,因此审计日志的收集和分析至关重要。服务网格应能够记录所有安全相关的事件,并提供审计功能,以便后续分析和合规检查。
问题三:服务网格如何实现身份管理?
服务网格支持通过多种机制和工具实现身份管理,以确保微服务之间的安全通信和访问控制。
身份管理在服务网格中主要涉及服务的身份验证、授权和证书管理。以下是服务网格如何实现身份管理的几个关键方面:
● 证书管理:服务网格通常使用 mTLS 来确保服务间的安全通信。管理和轮换证书可能会变得复杂,尤其是在大规模环境中。服务网格的控制平面(如 Istio、Linkerd)负责自动化证书的生成、分发和更新,确保服务实例在运行时始终拥有有效的证书。服务网格通常使用短期证书(如 mTLS)来实现服务间的身份验证。这些证书的有效期较短,通常为几小时到几天,减少了证书被盗用的风险。
● 身份验证:确保所有服务和用户都经过适当的身份验证是一个挑战,尤其是在动态环境中,服务实例可能频繁变化。服务网格通过代理(如 Envoy)处理服务间的通信,确保所有请求都经过身份验证和授权检查。尽管 mTLS 提供了加密保护,但如果证书管理不当,仍然可能面临中间人攻击的风险。
● 安全监控与设计:服务网格可以记录身份验证和授权的相关事件,生成审计日志,以便后续分析和合规检查。这些日志可以帮助识别潜在的安全问题和不当访问行为。通过集成监控工具,服务网格可以实时监控身份管理相关的指标(如身份验证失败次数、授权请求等),及时发现异常情况。
● 安全策略的动态调整:服务网格支持动态更新身份管理策略,以适应不断变化的环境:管理员可以通过服务网格的控制平面动态更新身份验证和授权策略,而无需重启服务。这种灵活性使得服务网格能够快速响应安全需求的变化。
问题四:安全可观测性和监控
服务网格的安全可观测性是指在微服务架构中,通过监控、日志记录和追踪等手段,实时了解和分析服务间的安全状态和行为。这种可观测性对于识别潜在的安全威胁、确保合规性以及优化安全策略至关重要。
● 安全指标监控:服务网格可以监控与安全相关的指标,例如身份验证失败次数、授权请求的成功与失败、TLS 连接的状态等。这些指标可以帮助识别异常行为和潜在的安全问题。
通过集成监控工具(如 Prometheus、Grafana),可以实时可视化这些指标,便于运维团队进行分析和响应。
● 流量监控及异常检测:监控服务间的流量模式,识别异常流量(如 DDoS 攻击、数据泄露等)。服务网格可以提供流量的详细视图,包括请求的来源、目的地、协议等信息。在复杂的服务网格环境中,识别异常行为和潜在的安全威胁可能变得更加困难。
● 分布式追踪:服务网格可以实现分布式追踪,记录请求在微服务间的流转情况。这有助于了解请求的完整路径,识别潜在的安全漏洞。通过追踪工具(如 Jaeger、Zipkin),可以可视化请求的延迟和错误,帮助识别安全问题的根源。
问题五:依赖性管理中的安全问题
在服务网格的依赖性管理中,安全问题是一个重要的关注点。由于微服务架构的复杂性和服务之间的紧密耦合,安全漏洞可能会在不同服务之间传播,导致严重的安全风险。
● 服务间的信任关系问题: 服务网格中的服务可能会建立不必要的信任关系,导致某个服务的漏洞影响到其他服务。
应对策略:实施最小权限原则,确保服务之间的信任关系仅限于必要的服务。使用服务网格的安全策略(如 Istio 的授权策略)来限制服务之间的通信。
● 供应链安全问题:服务网格通常依赖于多个第三方库和服务,这些依赖项可能存在安全漏洞,会影响整个系统的安全性。需要确保所有依赖项都是最新的并且没有已知漏洞。
应对策略:定期审查和更新第三方依赖,确保使用的库和服务是最新的,并且没有已知的安全漏洞。实施供应链安全策略,确保所有依赖的来源是可信的。
网格大小的划分
在设计和实施服务网格时,合理的大小划分是确保系统可维护性、可扩展性、安全性和性能的关键因素。服务网格的大小划分通常涉及到微服务的划分、服务之间的关系、流量管理、以及团队的组织结构等多个方面。
在实际的应用案例中,一般都是基于业务模块维度,或者基于单元化原则来进行网格的划分。过大的网格,会导致管控策略的复杂度大幅升高;而把网格拆的过细,也会导致服务解耦成本的上升。
微服务的功能划分,总体应基于单一职责原则,即每个微服务应专注于特定的业务功能或领域,遵循单一职责原则。这样可以减少服务之间的耦合,提高服务的可维护性。其次,应考虑服务之间的依赖关系,过于复杂的依赖关系可能导致服务网格的管理和维护变得困难。对于高度依赖的服务,可以考虑将它们聚合为一个服务,以减少交互的复杂性。相反,对于功能过于庞大的服务,可以拆分为多个小服务。
也可以根据流量模式和使用情况划分服务。例如,某些服务可能会处理大量的请求,而其他服务则相对较少。可以根据流量需求进行服务的划分和部署。考虑服务的负载均衡策略,确保服务能够有效地处理流量。过多的网格,也会带来更精细的流量管理和安全策略需求,以确保跨集群的通信安全和可靠。
可以考虑根据团队的组织结构划分服务。每个团队可以负责一个或多个微服务,确保团队能够独立开发、测试和部署服务。
总之,服务网格的大小划分是一个复杂的过程,需要综合考虑微服务的功能、依赖关系、流量管理、团队结构、监控需求、性能要求、技术栈和基础设施等多个因素。通过合理的划分,可以提高系统的可维护性、可扩展性和性能,确保服务网格能够有效支持业务需求。
尽管服务网格提供了许多安全功能,但在实施和维护过程中仍然面临多种安全挑战。组织需要采取综合措施,包括合理的配置管理、有效的身份和访问管理、监控和日志分析、以及团队培训,以应对这些挑战并确保服务网格的安全性。