Пряма заборона
Це завдання показує, як налаштувати політику авторизації 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