明示的な拒否

このタスクでは、Istioメッシュ内のトラフィックを明示的に拒否するために、`DENY`アクションのIstio認可ポリシーを設定する方法を示します。これは`ALLOW`アクションとは異なり、`DENY`アクションは優先度が高く、`ALLOW`アクションによってバイパスされません。

始める前に

このタスクを始める前に、次の手順を実行してください。

  • Istio認可の概念をお読みください。

  • Istioインストールガイドに従ってIstioをインストールしてください。

  • ワークロードのデプロイ

    このタスクでは、fooという1つの名前空間にデプロイされたhttpbincurlという2つのワークロードを使用します。両方のワークロードは、それぞれEnvoyプロキシの前に配置されます。次のコマンドを使用して、サンプルの名前空間とワークロードをデプロイしてください。

    ZipZip
    $ 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
    
  • 次のコマンドを使用して、curlhttpbinと通信していることを確認してください。

    $ 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
    

リクエストを明示的に拒否する

  1. 次のコマンドは、foo名前空間内のhttpbinワークロードに対して、deny-method-get承認ポリシーを作成します。このポリシーは、actionDENYに設定し、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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
  6. 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
    
  7. 次のコマンドは、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
    
  8. 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
    
  9. 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
    
  10. 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
この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございます!