备考ICA----Istio实验15---开启 mTLS 自动双向认证实验

备考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 自动双向认证实验完成

相关推荐
爬山算法9 分钟前
Netty(21)Netty的SSL/TLS支持是如何实现的?
网络·网络协议·ssl
永亮同学13 分钟前
【探索实战】告别繁琐,一栈统一:Kurator 从0到1落地分布式云原生应用管理平台!
分布式·云原生
颹蕭蕭32 分钟前
CRC的数学原理
网络
十五年专注C++开发1 小时前
ZeroMQ: 一款高性能、异步、轻量级的消息传输库
网络·c++·分布式·zeroqm
晚风(●•σ )1 小时前
【华为 ICT & HCIA & eNSP 习题汇总】——题目集25
网络·计算机网络·交换机
乾元2 小时前
用 AI 做联动:当应用层出现问题,网络如何被“自动拉入决策回路”
运维·开发语言·网络·人工智能·ci/cd·自动化
不惑_2 小时前
Kurator 分布式云原生平台从入门到实战教程
分布式·云原生
金灰2 小时前
一带一路(金砖)--网络安全防护治理赛项
网络·计算机网络·安全·web安全·网络安全·网络攻击模型·安全威胁分析
Bruce_Liuxiaowei2 小时前
网站敏感文件_目录大全(分类记忆+风险标注)
运维·网络·网络协议·http·网络安全·https
一起养小猫2 小时前
【贡献经历】从零到贡献者:我的Kurator开源社区参与之旅
分布式·物联网·云原生·开源·华为云·istio·kurator