Міграція домену довіри
Це завдання показує, як мігрувати з одного домену довіри в інший без зміни політики авторизації.
У Istio 1.4 ми представили альфа-функцію для підтримки міграції домену довіри для політики авторизації. Це означає, що якщо Istio mesh потрібно змінити свій домен довіри, політику авторизації не потрібно змінювати вручну. В Istio, якщо робоче навантаження працює в просторі імен foo
зі службовим обліковим записом bar
, а домен довіри системи my-td
, ідентифікатор цього робочого навантаження — spiffe://my-td/ns/foo/sa/bar
. Стандартно домен довіри Istio mesh — cluster.local
, якщо ви не вказали його під час установки.
Перед початком
Перед початком цього завдання виконайте наступне:
Ознайомтеся з поняттями авторизації Istio.
Встановіть Istio з власним доменом довіри та увімкненою взаємною TLS.
$ istioctl install --set profile=demo --set meshConfig.trustDomain=old-td
Розгорніть демонстраційний застосунок httpbin у просторі імен
default
, а curl — у просторах іменdefault
таcurl-allow
:$ kubectl label namespace default istio-injection=enabled $ kubectl apply -f @samples/httpbin/httpbin.yaml@ $ kubectl apply -f @samples/curl/curl.yaml@ $ kubectl create namespace curl-allow $ kubectl label namespace curl-allow istio-injection=enabled $ kubectl apply -f @samples/curl/curl.yaml@ -n curl-allow
Застосуйте політику авторизації нижче, щоб заборонити всі запити до
httpbin
, крім запитів відcurl
у просторі іменcurl-allow
.$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: service-httpbin.default.svc.cluster.local namespace: default spec: rules: - from: - source: principals: - old-td/ns/curl-allow/sa/curl to: - operation: methods: - GET selector: matchLabels: app: httpbin --- EOF
Зверніть увагу, що може знадобитися кілька секунд для розповсюдження політики авторизації на sidecar.
Перевірте, що запити до
httpbin
з:curl
в просторі іменdefault
відхилені.$ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403
curl
в просторі іменcurl-allow
дозволені.$ kubectl exec "$(kubectl -n curl-allow get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -n curl-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 200
Міграція домену довіри без аліасів домену довіри
Встановіть Istio з новим доменом довіри.
$ istioctl install --set profile=demo --set meshConfig.trustDomain=new-td
Перезапустіть istiod, щоб застосувати зміни домену довіри.
$ kubectl rollout restart deployment -n istio-system istiod
Istio mesh тепер працює з новим доменом довіри,
new-td
.Перезавантажте застосунки
httpbin
іcurl
, щоб вони отримали зміни від нової панелі управління Istio.$ kubectl delete pod --all
$ kubectl delete pod --all -n curl-allow
Перевірте, що запити до
httpbin
з обох просторів іменcurl
уdefault
таcurl-allow
відхилені.$ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403
$ kubectl exec "$(kubectl -n curl-allow get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -n curl-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403
Це тому, що ми вказали політику авторизації, яка забороняє всі запити до
httpbin
, крім запитів з ідентифікатораold-td/ns/curl-allow/sa/curl
, що є старим ідентифікатором програмиcurl
у просторі іменcurl-allow
. Коли ми перейшли до нового домену довіри, тобтоnew-td
, ідентифікатор цієї програмиcurl
теперnew-td/ns/curl-allow/sa/curl
, що відрізняється відold-td/ns/curl-allow/sa/curl
. Тому запити з програмиcurl
у просторі іменcurl-allow
доhttpbin
, які раніше були дозволені, тепер відхиляються. До Istio 1.4 єдиний спосіб це виправити — змінити політику авторизації вручну. У Istio 1.4 ми представляємо простий спосіб, як показано нижче.
Міграція домену довіри з аліасами домену довіри
Встановіть Istio з новим доменом довіри та псевдонімами домену довіри.
$ cat <<EOF > ./td-installation.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: meshConfig: trustDomain: new-td trustDomainAliases: - old-td EOF $ istioctl install --set profile=demo -f td-installation.yaml -y
Не змінюючи політику авторизації, перевірте, що запити до
httpbin
з:curl
в просторі іменdefault
відхилені.$ kubectl exec "$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 403
curl
в просторі іменcurl-allow
дозволені.$ kubectl exec "$(kubectl -n curl-allow get pod -l app=curl -o jsonpath={.items..metadata.name})" -c curl -n curl-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n" 200
Найкращі практики
Починаючи з Istio 1.4, при написанні політики авторизації слід розглянути можливість використання значення cluster.local
як частини домену довіри в політиці. Наприклад, замість old-td/ns/curl-allow/sa/curl
, це має бути cluster.local/ns/curl-allow/sa/curl
. Зверніть увагу, що в цьому випадку cluster.local
не є доменом довіри Istio mesh (домен довіри залишається old-td
). Однак, у політиці авторизації cluster.local
є покажчиком, який вказує на поточний домен довіри, тобто old-td
(а пізніше new-td
), а також на його псевдоніми. Використовуючи cluster.local
у політиці авторизації, коли ви мігруєте до нового домену довіри, Istio виявить це та розгляне новий домен довіри як старий домен довіри без необхідності включення псевдонімів.
Очищення
$ kubectl delete authorizationpolicy service-httpbin.default.svc.cluster.local
$ kubectl delete deploy httpbin; kubectl delete service httpbin; kubectl delete serviceaccount httpbin
$ kubectl delete deploy curl; kubectl delete service curl; kubectl delete serviceaccount curl
$ istioctl uninstall --purge -y
$ kubectl delete namespace curl-allow istio-system
$ rm ./td-installation.yaml