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 un mesh 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,
httpbinycurl, 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:$ 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 fooVerifique que
curlse comunica conhttpbincon 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
El siguiente comando crea la política de autorización
deny-method-getpara el workloadhttpbinen el namespacefoo. La política establece laactionenDENYpara denegar las solicitudes que satisfacen las condiciones establecidas en la secciónrules. 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 esGET.$ 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"] EOFVerifique que las solicitudes
GETson 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}" 403Verifique que las solicitudes
POSTson 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}" 200Actualice la política de autorización
deny-method-getpara denegar las solicitudesGETsolo si el valorx-tokende la cabecera HTTP no esadmin. El siguiente ejemplo de política establece el valor del camponotValuesen["admin"]para denegar las solicitudes con un valor de cabecera que no seaadmin:$ 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"] EOFVerifique que las solicitudes
GETcon la cabecera HTTPx-token: adminson 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}" 200Verifique que las solicitudes GET con la cabecera HTTP
x-token: guestson 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}" 403El siguiente comando crea la política de autorización
allow-path-ippara permitir las solicitudes en la ruta/ipal workloadhttpbin. Esta política de autorización establece el campoactionenALLOW. 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"] EOFVerifique que las solicitudes
GETcon la cabecera HTTPx-token: guesten la ruta/ipson denegadas por la políticadeny-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}" 403Verifique que las solicitudes
GETcon la cabecera HTTPx-token: adminen la ruta/ipson permitidas por la políticaallow-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}" 200Verifique que las solicitudes
GETcon la cabecera HTTPx-token: adminen la ruta/getson denegadas porque no coinciden con la políticaallow-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