Пряма заборона
Це завдання показує, як налаштувати політику авторизації Istio з дією DENY
, щоб явно заборонити трафік в мережі Istio. Це відрізняється від дії ALLOW
, оскільки дія DENY
має вищий пріоритет і її не можна оминути будь-якими діями ALLOW
.
Перед початком
Перед початком цього завдання зробіть наступне:
Ознайомтеся з концепціями авторизації Istio.
Слідуйте посібнику з установки Istio, щоб встановити Istio.
Розгорніть навантаження:
Це завдання використовує два навантаження,
httpbin
таcurl
, розгорнуті в одному просторі імен,foo
. Обидва навантаження працюють з проксі 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
Явне відхилення запиту
Наступна команда створює політику авторизації
deny-method-get
для навантаженняhttpbin
в просторі іменfoo
. Політика встановлює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
Оновіть політику авторизації
deny-method-get
, щоб відхиляти запитиGET
тільки в тому випадку, якщо значення заголовка HTTPx-token
неadmin
. Наступний приклад політики встановлює значення поля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
Перевірте, що запити
GET
з заголовком HTTPx-token: admin
дозволені:$ 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
Перевірте, що запити
GET
з заголовком HTTPx-token: guest
відхиляються:$ 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
Наступна команда створює політику авторизації
allow-path-ip
, щоб дозволити запити на шлях/ip
до навантаженняhttpbin
. Ця політика авторизації встановлює поле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
Перевірте, що запити
GET
з заголовком HTTPx-token: guest
на шлях/ip
відхиляються політикоюdeny-method-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
Перевірте, що запити
GET
з заголовком HTTPx-token: admin
на шлях/ip
є дозволеними політикою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 "%{http_code}\n" 200
Перевірте, що запити
GET
з заголовком HTTPx-token: admin
на шлях/get
є відхиленими, оскільки вони не відповідають політиці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 "%{http_code}\n" 403
Очищення
Видаліть простір імен foo
з вашої конфігурації:
$ kubectl delete namespace foo