トラストドメインの移行
このタスクでは、認可ポリシーを変更せずに、あるトラストドメインから別のトラストドメインに移行する方法を示します。
Istio 1.4では、認可ポリシーの信頼ドメインの移行をサポートするアルファ機能を導入します。これは、Istioメッシュがその信頼ドメインを変更する必要がある場合、認可ポリシーを手動で変更する必要がないことを意味します。Istioでは、ワークロードが名前空間foo
でサービスアカウントbar
を使用して実行されており、システムの信頼ドメインがmy-td
の場合、そのワークロードのIDはspiffe://my-td/ns/foo/sa/bar
になります。インストール時に指定しない限り、Istioメッシュの信頼ドメインはデフォルトでcluster.local
です。
始める前に
このタスクを開始する前に、次の手順を実行してください。
Istioの認可の概念をお読みください。
カスタム信頼ドメインと双方向TLSを有効にしてIstioをインストールします。
$ 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
以下の認可ポリシーを適用して、
curl-allow
名前空間のcurl
からのリクエストを除く、httpbin
へのすべてのリクエストを拒否します。$ 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
認可ポリシーがサイドカーに伝播されるまで、数十秒かかる場合があります。
httpbin
へのリクエストが以下から拒否されることを確認します。default
名前空間のcurl
$ 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-allow
名前空間のcurl
は許可されます。$ 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メッシュは、新しい信頼ドメイン
new-td
で実行されるようになりました。新しいIstioコントロールプレーンからの変更を反映するために、
httpbin
およびcurl
アプリケーションを再デプロイします。$ kubectl delete pod --all
$ kubectl delete pod --all -n curl-allow
default
名前空間とcurl-allow
名前空間の両方のcurl
からのhttpbin
へのリクエストが拒否されることを確認します。$ 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
ID、つまりcurl-allow
名前空間のcurl
アプリケーションの古いIDからのリクエストは除きます。上記の新しい信頼ドメイン、つまりnew-td
に移行したとき、このcurl
アプリケーションのIDはnew-td/ns/curl-allow/sa/curl
になり、これはold-td/ns/curl-allow/sa/curl
と同じではありません。したがって、curl-allow
名前空間のcurl
アプリケーションから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
へのリクエストが以下から拒否されることを確認します。default
名前空間のcurl
$ 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-allow
名前空間のcurl
は許可されます。$ 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メッシュの信頼ドメイン(信頼ドメインはまだ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