7.6.2 Istio授权策略

与其他Istio配置对象一样,Istio提供了两个Kubernetes CustomResourceDef inition(CRD)对象用于配置Istio授权策略:ServiceRole和ServiceRoleBinding。其中,ServiceRole定义了一组访问服务的权限;ServiceRoleBinding授予ServiceRole特定,例如用户、组或服务。

通过指定ServiceRole和ServiceRoleBinding,Istio定义了谁被允许在哪些条件下做什么,具体来说:

·“谁”指的是ServiceRoleBinding中定义的主体subjects。

·“做什么”指的是ServiceRole中定义的许可permissions。

·“哪些条件”是指ServiceRole或ServiceRoleBinding中定义的条件。

ServiceRole定义了一系列规则,或者称之为权限。每条规则都有以下标准字段:

·services:服务名称列表。可以将值设置为“*”,此时是指包括了指定命名空间中的所有服务。

·methods:HTTP方法列表。可以将值设置为“*”,此时是指包括了所有HTTP方法。如果服务为TCP和gRPC时,该字段无效。

·paths:HTTP路径或gRPC方法。gRPC方法必须采用以下形式“/packageName.serviceName/methodName”,并且区分大小写。

·除了标准字段外,还可以在constraints字段中使用自定义key添加一个约束。

ServiceRole规范只适用于metadata部分中指定的命名空间,规则定义中services字段是必需的,其他字段是可选的。如果未指定字段或将其值设置为*,则Istio将该字段应用于所有实例。

ServiceRoleBinding定义了以下两个部分:

·roleRef指的是同一命名空间中的ServiceRole资源。

·subjects指的是分配给角色的主体列表。可以明确地指定一个主体为一个用户或一组属性。其中,ServiceRoleBinding定义中,主体下的一个属性可以使用条件来指定一组分配给此角色的帐户。它包含一个key及其允许的值。

以下示例显示了一个ServiceRoleBinding,名称为srb-sample,它将两个主体绑定到名称为sr-viewer的ServiceRole上,其中一个主体是服务帐户service-account-a,另一个主体表示Ingress服务的服务帐户"istio-ingress-service-account"且源命名空间为abc:


apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: srb-sample
  namespace: default
spec:
  subjects:
  - user: "service-account-a"
  - user: "istio-ingress-service-account"
     properties:
        source.namespace: "abc"
  roleRef:
    kind: ServiceRole
    name: "sr-viewer"

如果要公开访问服务,可以设置subject为user:"*"。此值将分配ServiceRole给所有(经过身份验证和未经身份验证的)用户和服务,例如:


apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: srb-sample
  namespace: default
spec:
  subjects:
  - user: "*"
  roleRef:
    kind: ServiceRole
    name: "sr-viewer"

要ServiceRole仅分配经过身份验证的用户和服务,请将source.principal:"*"改为使用,例如:


apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: srb-sample
  namespace: default
spec:
  subjects:
  - properties: "*"
        source.principal: "*"
  roleRef:
    kind: ServiceRole
    name: "sr-viewer"