与其他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"