顯式拒絕
此任務將說明如何設定 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
的GET
請求在路徑/ip
上是否被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
的GET
請求在路徑/ip
上是否被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