Istio是一种具备流量治理,安全性,可察看性,可扩大的服务网格解决方案。那么Istio的受权模型是什么?其如何实现对网格中的工作负载进行访问控制的?

实现架构

在Istio中,Envoy代理是“受权引擎”,因为它蕴含用于确定是否必须回绝或容许一个申请的所有策略。因为间接从代理进行决策,因而Istio中的受权速度十分快。代理应用AuthorizationPolicy自定义资源进行配置,当你将其利用于集群时,该资源将由Istiod获取并配置指标工作负载的服务代理。

AuthorizationPolicy

作用域

AuthorizationPolicy的作用域能够是mesh命名空间工作负载范畴的,具体取决于命名空间和spec/selector字段。

如果AuthorizationPolicy处于istio root 命名空间(通常是istio-system),并且没有selector字段,那么该策略的作用域是mesh级别,即该规定将在所有命名空间的网格范畴内强制执行。

如果AuthorizationPolicy处于非istio root 命名空间,并且没有selector字段,那么该策略的作用域是命名空间级别,即该规定将对该命名空间内的所有工作负载起作用。

如果AuthorizationPolicy处于非istio root 命名空间,并且蕴含selector字段,那么该策略的作用域是工作负载级别,即该规定将对该命名空间内的对应工作负载起作用。

动作

策略反对ALLOWDENY动作。

ALLOWDENY动作同时用于工作负载时,将首先评估DENY策略。评估由以下规定确定:

  • 如果有任何与申请匹配的DENY策略,回绝该申请。
  • 如果没有针对工作负载的ALLOW策略,则容许该申请。
  • 如果任何ALLOW策略与申请匹配,则容许该申请。
  • 拒绝请求。

Rules

AuthorizationPolicy蕴含规定列表,这些规定形容匹配的申请,而后依据操作容许或回绝哪些申请。规定由三局部组成:fromtowhen

  • from -- 指定申请的起源。如果未设置,则容许任何起源。
  • to -- 指定申请的操作。如果未设置,则容许任何操作。
  • when -- 指定申请的其余条件列表。如果未设置,则容许任何条件。

示例

首先咱们从一个典型的AuthorizationPolicy加深对三大因素的了解。

apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata: name: httpbin namespace: foospec: action: ALLOW rules: - from:   - source:       principals: ["cluster.local/ns/default/sa/sleep"]   - source:       namespaces: ["test"]   to:   - operation:       methods: ["GET"]       paths: ["/info*"]   - operation:       methods: ["POST"]       paths: ["/data"]   when:   - key: request.auth.claims[iss]     values: ["https://accounts.google.com"]

该示例,httpbin受权策略,位于foo命名空间, 并且没有selector,那么其是命名空间级别的受权策略,其作用于foo命名空间下所有工作负载。

该示例动作设置为"ALLOW”,目标是创立容许策略。

在示例中,source是principals,但也能够是requestPrincipalsnamespacesipBlocks

咱们也来看看operation字段:与methods一起应用的无效的匹配项是hosts,ports,paths及其排除对,例如notHosts

在大多数状况下,能够省略“when”字段,通常仅在简单的状况下应用,但能够应用反对的Istio属性列表来进一步自定义申请匹配。

综上所述,该策略容许满足上面条件的请求者:

  • 服务账户为 “cluster.local/ns/default/sa/sleep”
  • 位于 test 命名空间

能够拜访满足上面条件的工作负载:

  • 拜访前缀门路为“/info” 的Get办法
  • 拜访门路为“/data”的POST办法

当申请具备 “https://accounts.google.com”签发的非法JWT token时。

总结

Istio可用于应用AuthorizationPolicy自定义资源在服务网格中的工作负载之间施行访问控制。这种访问控制是由Envoy Sidecar代理在应用程序层施行的。它为用户提供了Kubernetes工作负载之间十分弱小,灵便但高效的受权形式。