凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此。
今天,我们就来谈谈Istio第二主打功能---保护服务。
那么,便引出3个问题:
l Istio凭什么保护服务?
l Istio具体如何保护服务?
l 如何告诉Istio发挥保护能力?
1 Istio凭什么保护服务?将单体应用程序分解为一个个服务,为大型软件系统的开发和维护带来了诸多好处,比如更好的灵活性、可伸缩性和可复用性。但这也带来了一些安全问题:
l 为了抵御中间人攻击,需要对流量进行加密
l 为了提供灵活的服务访问控制,需要 mTLS(双向的安全传输层协议)和细粒度的访问策略
l 要审计谁在什么时候做了什么,需要审计工具
Istio 尝试提供全面的安全解决方案来解决这3个问题。
如上图所示,
Istio 安全的三大目标是:
l 默认安全(Security by default):应用程序代码和基础结构,无需更改。
l 深度防御(Defense in depth):与现有安全系统集成,提供多层防御。
l 零信任网络(Zero-trust network):在不受信任的网络上,构建安全解决方案。
为了实现这3个目标,Istio 安全功能提供了4大守护系统:
l 强大的身份(Identity)系统
l 健壮的策略(Policy)系统
l 认证,授权和审计(AAA:Authentication,Authorization,Accounting)系统,用于保护服务和数据
l 透明的 TLS 加密(Encryption)系统。
就保护对象而言,Istio 安全系统可以抵御来自内部或外部的威胁,这些威胁主要针对服务网格内的端点(Endpoints),通信(Communication),平台(Platform)和数据(Data)。
2 Istio具体如何保护服务?在安全方面,Istio具备3个远大的目标,配备了4大守护系统,那么它到底是通过怎样的架构实现这个目标的呢,又通过什么样的安全基础设施,和kubernetes配合呢?
2.1 Istio安全架构
如上图,与Istio的4大守护系统相对应,Istio 中涉及安全的组件有:
l Pilot :将授权策略和安全命名信息分发给代理
l Proxy :实现客户端和服务端之间的安全通信
l Citadel :用于密钥和证书管理
l Mixer :管理授权和审计
由此可见,Pilot不仅负责流量规则和策略的分发,还负责安全相关策略的下发,有点像皇上的贴身太监,负责宣读圣旨;Proxy有点像各州属的州官,负责奉天承运;Citadel有点像玉玺和虎符,负责鉴真去假;Mixer有点像三省六部,负责授权审计。
2.2 两个安全基本概念 2.2.1 Identity身份(Identity)是几乎所有安全基础架构的基本概念。在服务和服务的通信开始前,双方必须用其身份信息交换凭证,以达到相互认证的目的。在客户端,根据安全命名(secure naming)信息,检查服务端的标识,以查看它是否是该服务的授权运行程序;在服务端,服务端可以根据授权策略(authorization policies)信息,确定客户端可以访问哪些数据,审计其在什么时间访问了什么,拒绝未授权客户端的访问。
在 Istio 身份模型中,Istio 使用一流的服务标识来确定服务的身份。这为表示人类用户,单个服务或一组服务提供了极大的灵活性和粒度。在没有此类身份的平台上,Istio 可以使用可以对服务实例进行分组的其他身份,例如服务名称。
不同平台上的 Istio 服务标识:
l Kubernetes: Kubernetes 服务帐户
l GKE/GCE: 可以使用 GCP 服务帐户
l AWS: AWS IAM 用户/角色 帐户
l On-premises (non-Kubernetes): 用户帐户,自定义服务帐户,服务名称,istio 服务帐户或 GCP 服务帐户。
做个类比,京东和天猫都有自己的一套非常成熟的服务账户系统,淘宝只需要复用天猫的账户系统即可,无需重新开发一套,这样我们就可以用天猫的账号,直接登录淘宝。而Istio也更倾向于复用业界一流的服务账户系统,如Kubernetes和AWS的,但也可以自定义服务账户,并按需复用Kubernetes的账户系统。
2.2.2 PKIIstio PKI(Public Key Infrastructure)建立在 Istio Citadel 之上,可为每个工作负载提供安全且强大的工作负载标识。Istio 使用 X.509 证书来携带 SPIFFE 格式的身份信息。PKI 还可以大规模自动化地进行密钥和证书轮换。
Istio 支持在 Kubernetes pod 和本地计算机上运行的服务。目前,Istio为每个方案使用不同的证书密钥配置机制,下面试举例Kubernetes方案的配置过程:
Citadel 监视 Kubernetes apiserver,为每个现有和新的服务帐户创建 SPIFFE 证书和密钥对。 Citadel 将证书和密钥对存储为 Kubernetes secrets。
创建 pod 时,Kubernetes 会根据其服务帐户通过 Kubernetes secret volume 将证书和密钥对挂载到 pod。
Citadel 监视每个证书的生命周期,并通过重写 Kubernetes secret 自动轮换证书。