备考ICA----Istio实验15---开启mTLS自动双向认证实验
在某些生成环境下,我们希望微服务和微服务之间使用加密通讯方式来确保不被中间人代理.
默认情况下Istio 使用 PERMISSIVE模式配置目标工作负载,PERMISSIVE模式时,服务可以使用明文通讯.为了只允许双向 TLS 流量,需要将配置更改为 STRICT 模式。
1. 环境准备
bash
kubectl create ns kim
kubectl create ns trump
kubectl create ns baiden
为3个命名空间创建服务
其中trump和baiden2个命名空间是有Istio sidecar注入的
bash
kubectl apply -f <(istioctl kube-inject -f istio/samples/httpbin/httpbin.yaml) -n trump
kubectl apply -f <(istioctl kube-inject -f istio/samples/httpbin/httpbin.yaml) -n baiden
kubectl apply -f <(istioctl kube-inject -f istio/samples/sleep/sleep.yaml) -n trump
kubectl apply -f <(istioctl kube-inject -f istio/samples/sleep/sleep.yaml) -n baiden
kim命名空间中的pod是没有Istio注入的
bash
kubectl apply -f istio/samples/httpbin/httpbin.yaml -n kim
kubectl apply -f istio/samples/sleep/sleep.yaml -n kim
确认容器的sidecar注入情况
bash
kubectl get pods -A -l app=httpbin
kubectl get pods -A -l app=sleep
访问测试
bash
for from in trump baiden kim;do \
for to in trump baiden kim;do \
kubectl exec deploy/sleep -n ${from} \
-- curl http://httpbin.${to}:8000/ip -s -o /dev/null \
-w "${from}.sleep to ${to}.httpbin: %{http_code}\n";\
done;\
done
可以看到由于现在没对访问实时mtls所有所有访问都是成功的.
2. 所有命名空间mtls
对全局做mtls限制.
mtls/strict.yaml
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: "istio-system"
spec:
mtls:
mode: STRICT
生效配置
bash
kubectl apply -f mtls/strict.yaml
访问测试
bash
for from in trump baiden kim;do \
for to in trump baiden kim;do \
kubectl exec deploy/sleep -n ${from} \
-- curl http://httpbin.${to}:8000/ip -s -o /dev/null \
-w "${from}.sleep to ${to}.httpbin: %{http_code}\n";\
done;\
done
可以看到做了mtls后,对trump和baiden两个由Istio管控的可以互相访问,并可以访问没有被管理的kim空间.
但没有被Istio管理的kim空间是无法访问由Istio管理的trump和baiden中的httpbin服务.
清理全局全局认证策略,为下一个实验做准备
bash
kubectl delete pa -n istio-system default
3. 命名空间级别mtls
仅对trump命名看空间进行mtls验证
trump.yaml
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: trump
spec:
mtls:
mode: STRICT
部署生效
bash
kubectl apply -f trump.yaml
测试访问
bash
for from in trump baiden kim;do \
for to in trump baiden kim;do \
kubectl exec deploy/sleep -n ${from} \
-- curl http://httpbin.${to}:8000/ip -s -o /dev/null \
-w "${from}.sleep to ${to}.httpbin: %{http_code}\n";\
done;\
done
测试下来由于trump对mtls进行了限制,因为trump和baiden都是由Istio进行管理,trump的sleep和baiden的httpbin访问trump的httpbin都是正常.
kim是非Istio管理,当kim.sleep访问trump的httpbin时因为没有mtls被拒绝
恢复配置
bash
kubectl delete pa -n trump default
4. Label Selector级别mtls限制
仅对baiden的httpbin进行mtls限制
mtls/labelselector.yaml
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: httpbin
namespace: "baiden"
spec:
selector:
matchLabels:
app: httpbin
mtls:
mode: STRICT
应用配置
bash
kubectl apply -f mtls/labelselector.yaml
kubectl get pa -n baiden
访问测试
bash
for from in trump baiden kim;do \
for to in trump baiden kim;do \
kubectl exec deploy/sleep -n ${from} \
-- curl http://httpbin.${to}:8000/ip -s -o /dev/null \
-w "${from}.sleep to ${to}.httpbin: %{http_code}\n";\
done;\
done
此时:
trump因为是受Istio管理,访问baiden的httpbin时带有证书,访问被允许
baiden因为是受Istio管理,访问baiden的httpbin时带有证书,访问被允许
kim因为不受Istio管理,访问baiden的httpbin时未带有证书,访问被拒绝
清除配置
bash
kubectl delete pa -n baiden httpbin
5. 端口级别mtls
使用portLevelMtls参数来实现端口级别的mtls限制.即除了8080端口,都使用mtls
mtls/prot.yaml
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: httpbin
namespace: "baiden"
spec:
selector:
matchLabels:
app: httpbin
mtls:
mode: STRICT
portLevelMtls:
8080:
mode: DISABLE
部署生效
bash
kubectl apply -f mtls/prot.yaml
访问测试
bash
for from in trump baiden kim;do \
for to in trump baiden kim;do \
kubectl exec deploy/sleep -n ${from} \
-- curl http://httpbin.${to}:8000/ip -s -o /dev/null \
-w "${from}.sleep to ${to}.httpbin: %{http_code}\n";\
done;\
done
此时由于排除的是8080端口,我们访问的是80端口,所以80端口是受mtls管理的:
trump因为是受Istio管理,访问baiden的httpbin时带有证书,访问被允许
baiden因为是受Istio管理,访问baiden的httpbin时带有证书,访问被允许
kim因为不受Istio管理,访问baiden的httpbin时未带有证书,访问被拒绝
6. 策略优先级
开启namespace级别的mtls
bash
kubectl apply -f mtls/trump.yaml
当端口级别的mtls和命名空间级别的发生了冲突时,以更细的规则为准
mtls/trumplabels.yaml
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: trumphttpbin
namespace: trump
spec:
selector:
matchLabels:
app: httpbin
mtls:
mode: DISABLE
生效配置
bash
kubectl apply -f mtls/labelselector.yaml
访问测试
bash
for from in trump baiden kim;do \
for to in trump baiden kim;do \
kubectl exec deploy/sleep -n ${from} \
-- curl http://httpbin.${to}:8000/ip -s -o /dev/null \
-w "${from}.sleep to ${to}.httpbin: %{http_code}\n";\
done;\
done
因为trump服务级别的httpbin DISABLE生效,所以kim访问trump的httpbin被允许
至此备考ICA----Istio实验15---开启 mTLS 自动双向认证实验完成