- Authorization for groups and list claims
- Before you begin
- Setup the required namespace and services
- Configure JSON Web Token (JWT) authentication with mutual TLS
- Configure groups-based authorization
- Configure the authorization of list-typed claims
- Cleanup
- 相关内容
Authorization for groups and list claims
This tutorial walks you through examples to configure the groups-baseauthorization and the authorization of list-typed claims in Istio.
Before you begin
Read the authorization conceptand go through the guide on how toconfigure Istio authorization.
Read the Istioauthentication policyand the relatedmutual TLS authenticationconcepts.
Create a Kubernetes cluster with Istio installed and mutual TLS enabled.To fulfill this prerequisite you can follow the Kubernetesinstallation instructions.
Setup the required namespace and services
This tutorial runs in a new namespace called rbac-groups-test-ns,with two services, httpbin and sleep, both running with an Envoy sidecarproxy. The following command sets an environmental variable to store thename of the namespace, creates the namespace, and starts the two services.Before running the following command, you need to enter the directorycontaining the Istio installation files.
- Set the value of the
NSenvironmental variable torbac-groups-test-ns:
$ export NS=rbac-groups-test-ns
- Make sure that the
NSenvironmental variable points to a testing-onlynamespace. Run the following command to delete all resources in the namespacepointed by theNSenvironmental variable.
$ kubectl delete namespace $NS
- Create the namespace for this tutorial:
$ kubectl create ns $NS
- Create the
httpbinandsleepservices and deployments:
ZipZip
$ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@) -n $NS$ kubectl apply -f <(istioctl kube-inject -f @samples/sleep/sleep.yaml@) -n $NS
- To verify that
httpbinandsleepservices are running andsleepis able toreachhttpbin, run the following curl command:
$ kubectl exec $(kubectl get pod -l app=sleep -n $NS -o jsonpath={.items..metadata.name}) -c sleep -n $NS -- curl http://httpbin.$NS:8000/ip -s -o /dev/null -w "%{http_code}\n"
When the command succeeds, it returns the HTTP code 200.
Configure JSON Web Token (JWT) authentication with mutual TLS
The authentication policy you apply next enforces that a valid JWT is needed toaccess the httpbin service.The JSON Web Key Set (JWKS) endpoint defined in the policy must sign the JWT.This tutorial uses theJWKS endpointfrom the Istio code base and usesthis sample JWT.The sample JWT contains a JWT claim with a groups claim key and a list ofstrings, ["group1", "group2"] as the claim value.The JWT claim value could either be a string or a list of strings; both typesare supported.
- Apply an authentication policy to require both mutual TLS andJWT authentication for
httpbin.
$ cat <<EOF | kubectl apply -n $NS -f -apiVersion: "authentication.istio.io/v1alpha1"kind: "Policy"metadata:name: "require-mtls-jwt"spec:targets:- name: httpbinpeers:- mtls: {}origins:- jwt:issuer: "testing@secure.istio.io"jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.4/security/tools/jwt/samples/jwks.json"principalBinding: USE_ORIGINEOF
- Apply a
DestinationRulepolicy onsleepto use mutual TLS whencommunicating withhttpbin.
$ cat <<EOF | kubectl apply -n $NS -f -apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: use-mtls-on-sleepspec:host: httpbin.$NS.svc.cluster.localtrafficPolicy:tls:mode: ISTIO_MUTUALEOF
- Set the
TOKENenvironmental variable to contain a valid sample JWT.
$ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.4/security/tools/jwt/samples/groups-scope.jwt -s)
- Connect to the
httpbinservice:
$ kubectl exec $(kubectl get pod -l app=sleep -n $NS -o jsonpath={.items..metadata.name}) -c sleep -n $NS -- curl http://httpbin.$NS:8000/ip -s -o /dev/null -w "%{http_code}\n" --header "Authorization: Bearer $TOKEN"
When a valid JWT is attached, it returns the HTTP code 200.
- Verify that the connection to the
httpbinservice fails when the JWT is not attached:
$ kubectl exec $(kubectl get pod -l app=sleep -n $NS -o jsonpath={.items..metadata.name}) -c sleep -n $NS -- curl http://httpbin.$NS:8000/ip -s -o /dev/null -w "%{http_code}\n"
When no valid JWT is attached, it returns the HTTP code 401.
Configure groups-based authorization
This section creates a policy to authorize the access to the httpbinservice if the requests are originated from specific groups.As there may be some delays due to caching and other propagation overhead,wait until the newly defined RBAC policy to take effect.
- Enable the Istio RBAC for the namespace:
$ cat <<EOF | kubectl apply -n $NS -f -apiVersion: "rbac.istio.io/v1alpha1"kind: ClusterRbacConfigmetadata:name: defaultspec:mode: 'ON_WITH_INCLUSION'inclusion:namespaces: ["rbac-groups-test-ns"]EOF
- Once the RBAC policy takes effect, verify that Istio rejected the curlconnection to the
httpbinservice:
$ kubectl exec $(kubectl get pod -l app=sleep -n $NS -o jsonpath={.items..metadata.name}) -c sleep -n $NS -- curl http://httpbin.$NS:8000/ip -s -o /dev/null -w "%{http_code}\n" --header "Authorization: Bearer $TOKEN"
Once the RBAC policy takes effect, the command returns the HTTP code 403.
- To give read access to the
httpbinservice, create thehttpbin-viewerservice role:
$ cat <<EOF | kubectl apply -n $NS -f -apiVersion: "rbac.istio.io/v1alpha1"kind: ServiceRolemetadata:name: httpbin-viewernamespace: rbac-groups-test-nsspec:rules:- services: ["httpbin.rbac-groups-test-ns.svc.cluster.local"]methods: ["GET"]EOF
- To assign the
httpbin-viewerrole to users ingroup1, create thebind-httpbin-viewerservice role binding.
$ cat <<EOF | kubectl apply -n $NS -f -apiVersion: "rbac.istio.io/v1alpha1"kind: ServiceRoleBindingmetadata:name: bind-httpbin-viewernamespace: rbac-groups-test-nsspec:subjects:- properties:request.auth.claims[groups]: "group1"roleRef:kind: ServiceRolename: "httpbin-viewer"EOF
Alternatively, you can specify the group property under subjects.Both ways to specify the group are equivalent.Currently, Istio only supports matching against a list of strings inthe JWT for the request.auth.claims property and the group property undersubjects.
To specify the group property under subjects, use the following command:
$ cat <<EOF | kubectl apply -n $NS -f -apiVersion: "rbac.istio.io/v1alpha1"kind: ServiceRoleBindingmetadata:name: bind-httpbin-viewernamespace: rbac-groups-test-nsspec:subjects:- group: "group1"roleRef:kind: ServiceRolename: "httpbin-viewer"EOF
Wait for the newly defined RBAC policy to take effect.
- After the RBAC policy takes effect, verify the connection to the
httpbinservice succeeds:
$ kubectl exec $(kubectl get pod -l app=sleep -n $NS -o jsonpath={.items..metadata.name}) -c sleep -n $NS -- curl http://httpbin.$NS:8000/ip -s -o /dev/null -w "%{http_code}\n" --header "Authorization: Bearer $TOKEN"
The HTTP header including a valid JWT with the groups claimvalue of ["group1", "group2"] returns HTTP code 200since it contains group1.
Configure the authorization of list-typed claims
Istio RBAC supports configuring the authorization of list-typed claims.The example JWT contains a JWT claim with a scope claim key anda list of strings, ["scope1", "scope2"] as the claim value.You may use the gen-jwtpython scriptto generate a JWT with other list-typed claims for testing purposes.Follow the instructions in the gen-jwt script to use the gen-jwt.py file.
- To assign the
httpbin-viewerrole to a request with a JWT including alist-typedscopeclaim with the value ofscope1,create a service role binding with namebind-httpbin-viewer:
$ cat <<EOF | kubectl apply -n $NS -f -apiVersion: "rbac.istio.io/v1alpha1"kind: ServiceRoleBindingmetadata:name: bind-httpbin-viewernamespace: rbac-groups-test-nsspec:subjects:- properties:request.auth.claims[scope]: "scope1"roleRef:kind: ServiceRolename: "httpbin-viewer"EOF
Wait for the newly defined RBAC policy to take effect.
- After the RBAC policy takes effect, verify that the connection tothe
httpbinservice succeeds:
$ kubectl exec $(kubectl get pod -l app=sleep -n $NS -o jsonpath={.items..metadata.name}) -c sleep -n $NS -- curl http://httpbin.$NS:8000/ip -s -o /dev/null -w "%{http_code}\n" --header "Authorization: Bearer $TOKEN"
The HTTP header including a valid JWT with the scope claimvalue of ["scope1", "scope2"] returns HTTP code 200since it contains scope1.
Cleanup
After completing this tutorial, run the following command to delete allresources created in the namespace.
$ kubectl delete namespace $NS
相关内容
Micro-Segmentation with Istio Authorization
Describe Istio's authorization feature and how to use it in various use cases.
Authorization for HTTP Services
Shows how to set up role-based access control for HTTP services.
TCP 服务的权限控制
展示如何为 TCP 服务设置基于角色的权限控制。
安全
描述 Istio 的授权与鉴权功能。
Multi-mesh deployments for isolation and boundary protection
Deploy environments that require isolation into separate meshes and enable inter-mesh communication by mesh federation.
App Identity and Access Adapter
Using Istio to secure multi-cloud Kubernetes applications with zero code changes.
