Denegación Explícita

Esta tarea muestra cómo configurar la política de autorización de Istio de acción DENY para denegar explícitamente el tráfico en una malla de Istio. Esto es diferente de la acción ALLOW porque la acción DENY tiene mayor prioridad y no será eludida por ninguna acción ALLOW.

Antes de empezar

Antes de comenzar esta tarea, haga lo siguiente:

  • Lea los conceptos de autorización de Istio.

  • Siga la guía de instalación de Istio para instalar Istio.

  • Despliegue workloads:

    Esta tarea utiliza dos workloads, httpbin y curl, desplegados en un namespace, foo. Ambos workloads se ejecutan con un proxy Envoy delante de cada uno. Despliegue el namespace de ejemplo y los workloads con el siguiente comando:

    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
  • Verifique que curl se comunica con httpbin con el siguiente comando:

    $ 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 "%{\n}"
    200

Denegar explícitamente una solicitud

  1. El siguiente comando crea la política de autorización deny-method-get para el workload httpbin en el namespace foo. La política establece la action en DENY para denegar las solicitudes que satisfacen las condiciones establecidas en la sección rules. Este tipo de política se conoce mejor como política de denegación. En este caso, la política deniega las solicitudes si su método es 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. Verifique que las solicitudes GET son denegadas:

    $ 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 "%{\n}"
    403
  3. Verifique que las solicitudes POST son permitidas:

    $ 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 "%{\n}"
    200
  4. Actualice la política de autorización deny-method-get para denegar las solicitudes GET solo si el valor x-token de la cabecera HTTP no es admin. El siguiente ejemplo de política establece el valor del campo notValues en ["admin"] para denegar las solicitudes con un valor de cabecera que no sea 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. Verifique que las solicitudes GET con la cabecera HTTP x-token: admin son permitidas:

    $ 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 "%{\n}"
    200
  6. Verifique que las solicitudes GET con la cabecera HTTP x-token: guest son denegadas:

    $ 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 "%{\n}"
    403
  7. El siguiente comando crea la política de autorización allow-path-ip para permitir las solicitudes en la ruta /ip al workload httpbin. Esta política de autorización establece el campo action en ALLOW. Este tipo de política se conoce mejor como política de permiso.

    $ 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. Verifique que las solicitudes GET con la cabecera HTTP x-token: guest en la ruta /ip son denegadas por la política deny-method-get. Las políticas de denegación tienen precedencia sobre las políticas de permiso:

    $ 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 "%{\n}"
    403
  9. Verifique que las solicitudes GET con la cabecera HTTP x-token: admin en la ruta /ip son permitidas por la política 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 "%{\n}"
    200
  10. Verifique que las solicitudes GET con la cabecera HTTP x-token: admin en la ruta /get son denegadas porque no coinciden con la política 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 "%{\n}"
    403

Limpieza

Elimine el namespace foo de su configuración:

$ kubectl delete namespace foo
¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!