Testing Istio mutual TLS authentication

通过这个task,你将学会如何:

  • 核实Istio内彼此之间的TLS身份认证设置
  • 手动测试身份认证

Before you begin

这个task假设你有一个k8s集群:

  • 通过 the Istio installation task 安装带TLS身份认证的Istio。注意在“Installation steps”中的第5步选择 “enable Istio mutual TLS Authentication feature”

Verifying Istio’s mutual TLS authentication setup

以下命令假设服务部署在default命名空间上。适用参数 -n yournamespace 去指定其他命名空间。

Verifying 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启动。

Verifying service configuration

1.验证在ConfigMap中设置的AuthPolicy。

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

如果行 authPolicy: MUTUAL_TLS 没有被注释(没有 #),代表Istio相互TLS认证开启。

Testing the authentication setup

当开启相互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.确认密钥/证书在 /etc/certs/ 目录中。

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

注意那个 cert-chain.pem 是需要提交给另一方的Envoy证书。 key.pem 是搭配 cert-chain.pem的Envoy的私钥。 root-cert.pem 是确认另一方证书的根证书。目前我们只有一个CA,所以所有的Envoys都有相同的 root-cert.pem

4.确认 ‘curl’ 已经安装

curl

如果curl已安装,你将会看到类似内容

curl: try 'curl --help' or 'curl --manual' for more information

否则运行下面的命令重新开始

kubectl apply -f <(istioctl kube-inject --debug -f samples/bookinfo/kube/bookinfo.yaml)

注意:istio proxy镜像没有安装curl,而debug镜像安装了。在命令上使用 “–debug” 标识会重新部署使用debug镜像的服务。

5.向其他服务发送请求,如details

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
...
error fetching CN from cert:The requested data were not available.
...
< 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
...

服务名和端口定义在 here

注意Istio使用 Kubernetes service account 作为服务身份,这比服务名提供了更强的安全性(更多信息 here )。因此在Istio中的证书没有服务名,这个是curl需要确认服务身份的信息。因此,我们使用curl的 ‘-k’ 参数防止curl客户端没有在服务端提供的证书中发现和确认服务名 (i.e., productpage.ns.svc.cluster.local)而导致的异常中止。

请检查安全命名在 here 了解更多关于Istio中客户端如何确认服务端身份的信息。

我们在上面演示和确认的是服务端从客户端接受连接。尝试不使用 --key--cert ,并观察到你不被允许连接,并且得不到HTTP 200状态码。

你可能感兴趣的:(翻译)