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

将上述内容保存为 deny-all.yaml,并使用 kubectl apply -f deny-all.yaml 创建该策略 。
如果我们尝试访问 GATEWAY_URL,我们将得到以下响应 。
RBAC: access denied同样,如果我们试图在集群内运行一个 Pod,并从 default 命名空间内向 Web 前端或 customers 服务提出请求,我们会得到同样的错误 。
让我们试试吧 。
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty If you don't see a command prompt, try pressing enter. [ root@curl:/ ]$ curl customers RBAC: access denied [ root@curl:/ ]$ curl web-frontend RBAC: access denied [ root@curl:/ ]$在这两种情况下,我们都得到了拒绝访问的错误 。
我们要做的第一件事是使用 ALLOW 动作,允许从入口网关向 web-frontend 应用程序发送请求 。在规则中,我们指定了入口网关运行的源命名空间(istio-system)和入口网关的服务账户名称 。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata:name: allow-ingress-frontendnamespace: default spec:selector:matchLabels:app: web-frontendaction: ALLOWrules:- from:- source:namespaces: ["istio-system"]- source:principals: ["cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"]将上述内容保存为 allow-ingress-frontend.yaml,并使用 kubectl apply -f allow-ingress-frontend.yaml 创建策略 。
如果我们尝试从我们的主机向GATEWAY_URL 发出请求,这次我们会得到一个不同的错误 。
$ curl http://$GATEWAY_URL "Request failed with status code 403"

请注意,策略需要几秒钟才能分发到所有代理,所以你可能仍然会看到 RBAC:access denied 的消息,时间为几秒钟 。
这个错误来自 customers 服务——记得我们允许调用 Web 前端 。然而,web-frontend仍然不能调用 customers 服务 。
如果我们回到我们在集群内运行的 curl Pod,尝试请求 http://web-frontend,我们会得到一个 RBAC 错误 。DENY 策略是有效的,我们只允许从入口网关进行调用 。
当我们部署 Web 前端时,我们也为 Pod 创建了一个服务账户(否则,命名空间中的所有 Pod 都被分配了默认的服务账户) 。现在我们可以使用该服务账户来指定 customers 服务调用的来源 。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata:name: allow-web-frontend-customersnamespace: default spec:selector:matchLabels:app: customersversion: v1action: ALLOWrules:- from:- source:namespaces: ["default"]source:principals: ["cluster.local/ns/default/sa/web-frontend"]将上述 YAML 保存为 allow-web-frontend-customers.yaml,并使用 kubectl apply -f allow-web-frontend-customers.yaml 创建策略 。
一旦策略被创建,我们将看到 Web 前端再次工作——它将获得 customers 服务的回应 。
我们使用了多个授权策略,明确地允许从入口到前端以及从前端到 customers 服务的调用 。使用 deny-all 策略是一个很好的开始,因为我们可以控制、管理,然后明确地允许我们希望在服务之间发生的通信 。
4.2 清理删除 Deployment、Service、VirtualService 和 Gateway:
kubectl delete sa customers-v1 web-frontend kubectl delete deploy web-frontend customers-v1 kubectl delete svc customers web-frontend kubectl delete vs customers web-frontend kubectl delete gateway gateway kubectl delete authorizationpolicy allow-ingress-frontend allow-web-frontend-customers deny-all kubectl delete pod curl

经验总结扩展阅读