信任域迁移
在 Istio 1.4 中,我们引入了一个 alpha 特性以支持授权策略 trust domain migration。 这意味着如果一个 Istio 网格需要改变它的 trust domain,其授权策略是不需要手动更新的。 在 Istio 中,如果一个 workload 运行在命名空间 中,服务账户为 bar
,系统的信任域为 my-td
,那么该工作负载的身份就是 spiffe://my-td/ns/foo/sa/bar
。 默认情况下,Istio 网格的信任域是 cluster.local
,除非您在安装时另外指定了。
在您开始任务之前,请完成以下内容:
阅读 授权 指南。
安装 Istio,自定义信任域,并启用双向 TLS。
将 示例部署于
default
命名空间中,将 sleep 示例部署于default
和sleep-allow
命名空间中:$ kubectl label namespace default istio-injection=enabled
$ kubectl apply -f @samples/httpbin/httpbin.yaml@
$ kubectl apply -f @samples/sleep/sleep.yaml@
$ kubectl create namespace sleep-allow
$ kubectl label namespace sleep-allow istio-injection=enabled
$ kubectl apply -f @samples/sleep/sleep.yaml@ -n sleep-allow
应用如下授权策略以拒绝所有到
httpbin
的请求,除了来自sleep-allow
命名空间的sleep
服务。$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: service-httpbin.default.svc.cluster.local
namespace: default
spec:
rules:
- from:
principals:
- old-td/ns/sleep-allow/sa/sleep
to:
- operation:
methods:
- GET
selector:
app: httpbin
---
EOF
请注意授权策略传播到 sidecars 大约需要几十秒。
验证从以下请求源发送至
httpbin
的请求:- 来自
default
命名空间的sleep
服务的请求被拒绝。
$ kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
403
- 来自
sleep-allow
命名空间的sleep
服务的请求通过了。
$ kubectl exec "$(kubectl -n sleep-allow get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -n sleep-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
200
- 来自
使用一个新的信任域安装 Istio。
重新部署 istiod 以使信任域更改。
$ kubectl rollout restart deployment -n istio-system istiod
重新部署
httpbin
和sleep
应用以从新的 Istio 控制平面获取更新。$ kubectl delete pod --all
$ kubectl delete pod --all -n sleep-allow
使用一个新的信任域和信任域别名安装 Istio。
$ cat <<EOF > ./td-installation.yaml
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
spec:
meshConfig:
trustDomain: new-td
trustDomainAliases:
- old-td
EOF
$ istioctl install --set profile=demo -f td-installation.yaml -y
不调整授权策略,验证到
httpbin
的请求:- 来自
default
命名空间的sleep
的请求被拒绝。
$ kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
403
- 来自
sleep-allow
命名空间的sleep
通过了。
$ kubectl exec "$(kubectl -n sleep-allow get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -n sleep-allow -- curl http://httpbin.default:8000/ip -sS -o /dev/null -w "%{http_code}\n"
200
- 来自
$ kubectl delete authorizationpolicy service-httpbin.default.svc.cluster.local
$ kubectl delete deploy httpbin; kubectl delete service httpbin; kubectl delete serviceaccount httpbin
$ kubectl delete deploy sleep; kubectl delete service sleep; kubectl delete serviceaccount sleep
$ istioctl x uninstall --purge