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
ycurl
, 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 foo
Verifique que
curl
se comunica conhttpbin
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
El siguiente comando crea la política de autorización
deny-method-get
para el workloadhttpbin
en el namespacefoo
. La política establece laaction
enDENY
para 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"] EOF
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
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
Actualice la política de autorización
deny-method-get
para denegar las solicitudesGET
solo si el valorx-token
de la cabecera HTTP no esadmin
. El siguiente ejemplo de política establece el valor del camponotValues
en["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"] EOF
Verifique que las solicitudes
GET
con la cabecera HTTPx-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
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
El siguiente comando crea la política de autorización
allow-path-ip
para permitir las solicitudes en la ruta/ip
al workloadhttpbin
. Esta política de autorización establece el campoaction
enALLOW
. 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
Verifique que las solicitudes
GET
con la cabecera HTTPx-token: guest
en la ruta/ip
son 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}" 403
Verifique que las solicitudes
GET
con la cabecera HTTPx-token: admin
en la ruta/ip
son 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}" 200
Verifique que las solicitudes
GET
con la cabecera HTTPx-token: admin
en la ruta/get
son 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