显式拒绝
本任务向您展示如何设置 Istio 授权策略,该策略的 DENY
操作将在 Istio 网格中显式拒绝流量。这与 ALLOW
操作不同,因为 DENY
操作具有更高的优先级,并且不会被任何 ALLOW
操作绕过。
开始之前
在开始此任务之前,请执行以下操作
阅读Istio 授权概念。
按照Istio 安装指南安装 Istio。
部署工作负载
此任务使用两个工作负载,
httpbin
和curl
,部署在一个命名空间foo
中。这两个工作负载都在每个前面运行一个 Envoy 代理。使用以下命令部署示例命名空间和工作负载$ kubectl create ns foo $ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@) -n foo $ kubectl apply -f <(istioctl kube-inject -f @samples/curl/curl.yaml@) -n foo
使用以下命令验证
curl
是否与httpbin
通讯$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl http://httpbin.foo:8000/ip -sS -o /dev/null -w "%{http_code}\n" 200
显式拒绝请求
以下命令为
foo
命名空间中的httpbin
工作负载创建deny-method-get
授权策略。该策略将action
设置为DENY
,以拒绝满足rules
部分中设置的条件的请求。这种类型的策略更常被称为拒绝策略。在本例中,该策略拒绝请求,如果其方法为GET
。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: deny-method-get namespace: foo spec: selector: matchLabels: app: httpbin action: DENY rules: - to: - operation: methods: ["GET"] EOF
验证
GET
请求是否被拒绝$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -sS -o /dev/null -w "%{http_code}\n" 403
验证
POST
请求是否被允许$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/post" -X POST -sS -o /dev/null -w "%{http_code}\n" 200
更新
deny-method-get
授权策略,以仅在 HTTP 标头的x-token
值不是admin
时拒绝GET
请求。以下示例策略将notValues
字段的值设置为["admin"]
,以拒绝标头值为非admin
的请求$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: deny-method-get namespace: foo spec: selector: matchLabels: app: httpbin action: DENY rules: - to: - operation: methods: ["GET"] when: - key: request.headers[x-token] notValues: ["admin"] EOF
验证带有 HTTP 标头
x-token: admin
的GET
请求是否被允许$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -H "x-token: admin" -sS -o /dev/null -w "%{http_code}\n" 200
验证带有 HTTP 标头
x-token: guest
的GET
请求是否被拒绝$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -H "x-token: guest" -sS -o /dev/null -w "%{http_code}\n" 403
以下命令创建
allow-path-ip
授权策略,以允许对httpbin
工作负载的/ip
路径的请求。此授权策略将action
字段设置为ALLOW
。这种类型的策略更常被称为允许策略。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: allow-path-ip namespace: foo spec: selector: matchLabels: app: httpbin action: ALLOW rules: - to: - operation: paths: ["/ip"] EOF
验证带有 HTTP 标头
x-token: guest
和路径/ip
的GET
请求是否被deny-method-get
策略拒绝。拒绝策略优先于允许策略$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/ip" -X GET -H "x-token: guest" -s -o /dev/null -w "%{http_code}\n" 403
验证带有 HTTP 标头
x-token: admin
和路径/ip
的GET
请求是否被allow-path-ip
策略允许$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/ip" -X GET -H "x-token: admin" -s -o /dev/null -w "%{http_code}\n" 200
验证带有 HTTP 标头
x-token: admin
和路径/get
的GET
请求是否被拒绝,因为它们与allow-path-ip
策略不匹配$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/get" -X GET -H "x-token: admin" -s -o /dev/null -w "%{http_code}\n" 403
清理
从您的配置中删除命名空间 foo
$ kubectl delete namespace foo