Authorization for HTTP Services
The activities in this task assume that you:
Read the authorization concept.
Follow the to install Istio.
Deploy the Bookinfo sample application.
After deploying the Bookinfo application, go to the Bookinfo product page at . Onthe product page, you can see the following sections:
- Book Details on the lower left side, which includes: book type, number ofpages, publisher, etc.
- Book Reviews on the lower right of the page.When you refresh the page, the app shows different versions of reviews in the product page.The app presents the reviews in a round robin style: red stars, black stars, or no stars.
Enabling Istio authorization
Run the following command to enable Istio authorization for the default
namespace:
Point your browser at the Bookinfo productpage
(). Now you should see
"RBAC: access denied"
. This is because Istio authorization is “deny by default”, which means that you need toexplicitly define access control policy to grant access to any service.
There may be some delays due to caching and other propagation overhead.
Using Istio authorization, you can easily setup namespace-level access control by specifying all (or a collection of) servicesin a namespace are accessible by services from another namespace.
In our Bookinfo sample, the productpage
, reviews
, details
, ratings
services are deployed in the default
namespace.The Istio components like istio-ingressgateway
service are deployed in the istio-system
namespace. We can define a policy thatany service in the default
namespace that has the app
label set to one of the values ofproductpage
, details
, reviews
, or ratings
is accessible by services in the same namespace (i.e., default
) and services in the istio-system
namespace.
Run the following command to create a namespace-level access control policy:
$ kubectl apply -f @samples/bookinfo/platform/kube/rbac/namespace-policy.yaml@
Once applied, the policy has the following effects:
- Creates a
ServiceRole
service-viewer
which allows read access to any service in thedefault
namespace that hastheapp
labelset to one of the valuesproductpage
,details
,reviews
, orratings
. Note that there is aconstraint specifying thatthe services must have one of the listedapp
labels.
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: service-viewer
namespace: default
spec:
rules:
- services: ["*"]
methods: ["GET"]
constraints:
- key: "destination.labels[app]"
values: ["productpage", "details", "reviews", "ratings"]
- Creates a
ServiceRoleBinding
that assigns theservice-viewer
role to all services in theistio-system
anddefault
namespaces.
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: bind-service-viewer
namespace: default
spec:
subjects:
- properties:
source.namespace: "istio-system"
- properties:
roleRef:
kind: ServiceRole
name: "service-viewer"
You can expect to see output similar to the following:
servicerole "service-viewer" created
servicerolebinding "bind-service-viewer" created
Now if you point your browser at Bookinfo’s productpage
(). You should see the “Bookinfo Sample” page,with the “Book Details” section in the lower left part and the “Book Reviews” section in the lower right part.
There may be some delays due to caching and other propagation overhead.
$ kubectl delete -f @samples/bookinfo/platform/kube/rbac/namespace-policy.yaml@
Enforcing Service-level access control
This task shows you how to set up service-level access control using Istio authorization. Before you start, please make sure that:
- You have .
- You have removed namespace-level authorization policy.Point your browser at the Bookinfo
productpage
(). You should see
"RBAC: access denied"
.We will incrementally add access permission to the services in the Bookinfo sample.
In this step, we will create a policy that allows external requests to access the productpage
service via Ingress.
Run the following command:
Once applied, the policy has the following effects:
- Creates a
ServiceRole
productpage-viewer
which allows read access to theproductpage
service.
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: productpage-viewer
namespace: default
spec:
rules:
- services: ["productpage.default.svc.cluster.local"]
methods: ["GET"]
- Creates a
ServiceRoleBinding
bind-productpage-viewer
which assigns theproductpage-viewer
role to allusers and services.
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: bind-productpage-viewer
namespace: default
spec:
subjects:
- user: "*"
roleRef:
kind: ServiceRole
name: "productpage-viewer"
Point your browser at the Bookinfo productpage
(). Now you should see the “Bookinfo Sample”page. But there are errors
Error fetching product details
and Error fetching product reviews
on the page. These errorsare expected because we have not granted the productpage
service access to the details
and reviews
services. We will fix the errorsin the following steps.
There may be some delays due to caching and other propagation overhead.
We will create a policy to allow the productpage
service to access the details
and reviews
services. Note that in thesetup step, we created the bookinfo-productpage
service account for the productpage
service. Thisbookinfo-productpage
service account is the authenticated identify for the productpage
service.
Run the following command:
$ kubectl apply -f @samples/bookinfo/platform/kube/rbac/details-reviews-policy.yaml@
Once applied, the policy has the following effects:
- Creates a
ServiceRole
details-reviews-viewer
which allows access to thedetails
andreviews
services.
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: details-reviews-viewer
namespace: default
spec:
rules:
- services: ["details.default.svc.cluster.local", "reviews.default.svc.cluster.local"]
- Creates a
ServiceRoleBinding
bind-details-reviews
which assigns thedetails-reviews-viewer
role to the service account (representing theproductpage
service).
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: bind-details-reviews
namespace: default
spec:
subjects:
- user: "cluster.local/ns/default/sa/bookinfo-productpage"
roleRef:
kind: ServiceRole
name: "details-reviews-viewer"
Point your browser at the Bookinfo productpage
(http://$GATEWAY_URL/productpage
). Now you should see the “Bookinfo Sample”page with “Book Details” on the lower left part, and “Book Reviews” on the lower right part. However, in the “Book Reviews” section,there is an error Ratings service currently unavailable
. This is because “reviews” service does not have permission to access“ratings” service. To fix this issue, you need to grant the reviews
service access to the ratings
service.We will show how to do that in the next step.
There may be some delays due to caching and other propagation overhead.
We will create a policy to allow the reviews
service to access the ratings
service. Note that in the, we created a bookinfo-reviews
service account for the reviews
service. Thisservice account is the authenticated identify for the reviews
service.
Run the following command to create a policy that allows the reviews
service to access the ratings
service.
- Creates a
ServiceRole
ratings-viewer
which allows access to theratings
service.
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: ratings-viewer
namespace: default
spec:
rules:
- services: ["ratings.default.svc.cluster.local"]
methods: ["GET"]
- Creates a
ServiceRoleBinding
bind-ratings
which assignsratings-viewer
role to thecluster.local/ns/default/sa/bookinfo-reviews
service account, which represents thereviews
service.
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: bind-ratings
namespace: default
spec:
subjects:
- user: "cluster.local/ns/default/sa/bookinfo-reviews"
roleRef:
kind: ServiceRole
name: "ratings-viewer"
Point your browser at the Bookinfo productpage
(). Now you should seethe “black” and “red” ratings in the “Book Reviews” section.
There may be some delays due to caching and other propagation overhead.
- Remove Istio authorization policy configuration:
$ kubectl delete -f @samples/bookinfo/platform/kube/rbac/ratings-policy.yaml@
$ kubectl delete -f @samples/bookinfo/platform/kube/rbac/details-reviews-policy.yaml@
$ kubectl delete -f @samples/bookinfo/platform/kube/rbac/productpage-policy.yaml@
Alternatively, you can delete all ServiceRole
and ServiceRoleBinding
resources by running the following commands:
$ kubectl delete servicerole --all
$ kubectl delete servicerolebinding --all
$ kubectl delete -f @samples/bookinfo/platform/kube/rbac/rbac-config-ON.yaml@
相关内容
展示如何为 TCP 服务设置基于角色的权限控制。
描述 Istio 的授权与鉴权功能。
Describe Istio's authorization feature and how to use it in various use cases.
Authorization for groups and list claims
Tutorial on how to configure the groups-base authorization and configure the authorization of list-typed claims in Istio.
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.