验证Istio双向TLS认证

通过本任务,将学习如何:

  • 验证Istio双向TLS认证配置
  • 手动测试认证

开始之前

本任务假设已有一个Kubernetes集群:

验证Istio双向TLS认证配置

以下命令假设服务部署在默认命名空间。使用参数-n yournamespace来指定其他命名空间。

验证Istio CA

验证集群级别的CA已在运行:

kubectl get deploy -l istio=istio-ca -n istio-system
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
istio-ca   1         1         1            1           1m

如果"AVAILABLE"列为1表示Istio CA在运行。

验证服务安装

  1. 验证ConfigMap中的AuthPolicy设置

    kubectl get configmap istio -o yaml -n istio-system | grep authPolicy | head -1
    

    如果authPolicy: MUTUAL_TLS一行没有被注释(即没有#),则表示Istio的双向TLS认证是打开的。

测试认证安装

当使用双向TLS认证运行Istio时,可以在服务的envoy中使用curl来给其他服务发送请求。举个例子,启动示例应用BookInfo后,可以ssh到productpage服务的envoy容器中,并通过curl发送请求到其他服务。

有以下几个步骤:

  1. 获取productpage pod名称

    kubectl get pods -l app=productpage
    
    NAME                              READY     STATUS    RESTARTS   AGE
    productpage-v1-4184313719-5mxjc   2/2       Running   0          23h
    

    确认pod是"Running"状态。

  2. ssh到envoy容器

    kubectl exec -it productpage-v1-4184313719-5mxjc -c istio-proxy /bin/bash
    
  3. 确认key/cert/etc/certs/目录中

    ls /etc/certs/
    
    cert-chain.pem   key.pem   root-cert.pem
    

    注意,cert-chain.pem是envoy的证书,需要在另一方使用。key.pem是envoy的与cert-chain.pem配对的私钥。root-cert.pem是根证书,用来验证其他方的证书。目前只有一个CA,因此所有envoy都有相同的root-cert.pem。

  4. 发送请求到另一个服务,比如detail:

    curl https://details:9080/details/0 -v --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem -k
    
     ...
     < HTTP/1.1 200 OK
     < content-type: text/html; charset=utf-8
     < content-length: 1867
     < server: envoy
     < date: Thu, 11 May 2017 18:59:42 GMT
     < x-envoy-upstream-service-time: 2
     ...
    

服务名称和端口定义参见这里

注意,Istio使用Kubernetes service account 作为服务身份,这比使用服务名称(参考这里得到更多信息)更安全。

因此Istio使用的证书中没有服务名称,而curl需要使用该信息来验证服务身份。结果就是,我们需要使用curl的'-k'选项来阻止curl客户端在服务(比如 productpage)认证中验证服务身份。

请检查安全命名 这里,获取更多关于Istio中客户端如何验证服务器身份的信息。

进阶阅读

  • 要学习Istio服务间双向mTLS认证机制之后的设计原理,请看这个博客

results matching ""

    No results matching ""