九 Istio:istio安全之授权( 二 )

AuthorizationPolicy 的时候,我们需要考虑三个部分 。

  1. 选择要应用该策略的工作负载
  2. 要采取的行动(拒绝、允许或审计)
  3. 采取该行动的规则
让我们看看下面这个例子如何与 AuthorizationPolicy 资源中的字段相对应 。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata:name: customers-denynamespace: default spec:selector:matchLabels:app: customersversion: v2action: DENYrules:- from:- source:notNamespaces: ["default"]使用 selectormatchLabels,我们可以选择策略所适用的工作负载 。在我们的案例中,我们选择的是所有设置了 app: customersversion: v2 标签的工作负载 。action 字段被设置为 DENY
最后,我们在 rules 字段中定义所有规则 。我们例子中的规则是说,当请求来自 default 命名空间之外时,拒绝对 customers v2 工作负载的请求(action) 。
除了规则中的 from 字段外,我们还可以使用 towhen 字段进一步定制规则 。让我们看一个使用这些字段的例子 。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata:name: customers-denynamespace: default spec:selector:matchLabels:app: customersversion: v2action: DENYrules:- from:- source:notNamespaces: ["default"]- to:- operation:methods: ["GET"]- when:- key: request.headers [User-Agent]values: ["Mozilla/*"]我们在规则部分添加了 towhen 字段 。如果我们翻译一下上面的规则,我们可以说,当客户的 GET 请求来自 default 命名空间之外,并且 User Agent 头的值与正则表达式 Mozilla/* 相匹配时,我们会拒绝 customers v2 的工作负载 。
总的来说,to 定义了策略所允许的行动,from 定义了谁可以采取这些行动,when 定义了每个请求必须具备的属性,以便被策略所允许,selector 定义了哪些工作负载将执行该策略 。
如果一个工作负载有多个策略,则首先评估拒绝的策略 。评估遵循这些规则:
  1. 如果有与请求相匹配的 DENY 策略,则拒绝该请求
  2. 如果没有适合该工作负载的 ALLOW 策略,则允许该请求 。
  3. 如果有任何 ALLOW 策略与该请求相匹配,则允许该请求 。
  4. 拒绝该请求
3.2 来源我们在上述例子中使用的源是 notNamespaces 。我们还可以使用以下任何一个字段来指定请求的来源,如表中所示 。
来源示例释义principalsprincipals: ["my-service-account"]任何是有 my-service-account 的工作负载notPrincipalsnotPrincipals: ["my-service-account"]除了 my-service-account 的任何工作负载requestPrincipalsrequestPrincipals: ["my-issuer/hello"]任何具有有效 JWT 和请求主体 my-issuer/hello 的工作负载notRequestPrincipalsnotRequestPrincipals: ["*"]任何没有请求主体的工作负载(只有有效的 JWT 令牌) 。namespacesnamespaces: ["default"]任何来自 default 命名空间的工作负载notNamespacesnotNamespaces: ["prod"]任何不在 prod 命名空间的工作负载ipBlocksipBlocks: ["1.2.3.4","9.8.7.6/15"]任何具有 1.2.3.4 的 IP 地址或来自 CIDR 块的 IP 地址的工作负载notIpBlocknotIpBlocks: ["1.2.3.4/24"]Any IP address that's outside of the CIDR block3.3 操作操作被定义在 to 字段下,如果多于一个,则使用 AND 语义 。就像来源一样,操作是成对的,有正反两面的匹配 。设置在操作字段的值是字符串:

经验总结扩展阅读