25

解析Istio访问控制

 3 years ago
source link: https://zhuanlan.zhihu.com/p/277422812
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

实现架构

在Istio中,Envoy代理是“授权引擎”,因为它包含用于确定是否必须拒绝或允许一个请求的所有策略。由于直接从代理进行决策,因此Istio中的授权速度非常快。代理使用 AuthorizationPolicy 自定义资源进行配置,当你将其应用于集群时,该资源将由Istiod获取并配置目标工作负载的服务代理。

Fn2UZjJ.jpg!mobile

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/v1beta1
kind: AuthorizationPolicy
metadata:
 name: httpbin
 namespace: foo
spec:
 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工作负载之间非常强大,灵活但高效的授权方式。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK