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

version: 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 语义 。就像来源一样,操作是成对的,有正反两面的匹配 。设置在操作字段的值是字符串:
  • hostsnotHosts
  • portsnotPorts
  • methodsnotMethods
  • pathsnotPath
所有这些操作都适用于请求属性 。例如,要在一个特定的请求路径上进行匹配,我们可以使用路径 。paths:["/api/*","/admin"] 或特定的端口 ports: ["8080"],以此类推 。
3.4 条件为了指定条件,我们必须提供一个 key 字段 。key 字段是一个 Istio 属性的名称 。例如,request.headerssource.ipdestination.port 等等 。关于支持的属性的完整列表 , 请参考 授权政策条件 。
条件的第二部分是 valuesnotValues 的字符串列表 。下面是一个 when 条件的片段:
...- when:- key: source.ipnotValues: ["10.0.1.1"]四.实战:授权(访问控制)4.1 访问控制在这个实验中 , 我们将学习如何使用授权策略来控制工作负载之间的访问 。
首先部署 Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: gateway spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- '*'将上述 YAML 保存为 gateway.yaml,并使用 kubectl apply -f gateway.yaml 部署网关 。
接下来,我们将创建 Web 前端部署、服务账户、服务 和 VirtualService 。

推荐阅读