明示的な拒否
このタスクでは、Istioメッシュ内のトラフィックを明示的に拒否するために、`DENY`アクションのIstio認可ポリシーを設定する方法を示します。これは`ALLOW`アクションとは異なり、`DENY`アクションは優先度が高く、`ALLOW`アクションによってバイパスされません。
始める前に
このタスクを始める前に、次の手順を実行してください。
Istio認可の概念をお読みください。
Istioインストールガイドに従ってIstioをインストールしてください。
ワークロードのデプロイ
このタスクでは、
foo
という1つの名前空間にデプロイされたhttpbin
とcurl
という2つのワークロードを使用します。両方のワークロードは、それぞれ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
HTTPヘッダーの
x-token
値がadmin
でない場合にのみGET
リクエストを拒否するように、deny-method-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
次のコマンドは、
httpbin
ワークロードの/ip
パスへのリクエストを許可するallow-path-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
deny-method-get
ポリシーによって、パス/ip
で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/ip" -X GET -H "x-token: guest" -s -o /dev/null -w "%{http_code}\n" 403
allow-path-ip
ポリシーによって、パス/ip
で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/ip" -X GET -H "x-token: admin" -s -o /dev/null -w "%{http_code}\n" 200
allow-path-ip
ポリシーと一致しないため、パス/get
で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" -s -o /dev/null -w "%{http_code}\n" 403
クリーンアップ
設定からfoo
名前空間を削除してください。
$ kubectl delete namespace foo