谷歌云提供了一个简单的方法来执行TLS策略,如允许的SSL和TLS协议的版本以及允许与这些版本一起使用的密码套件。它可以在HTTP(S)外部负载平衡器上进行配置。如果你的工作负载运行在GKE集群上,该集群以不使用谷歌负载平衡器的方式暴露服务,或者工作负载在内部暴露(例如使用HTTP(S)内部负载平衡器),那么你需要另一种方式来执行TLS策略。下面的教程展示了如何使用Anthos Service Mesh(ASM)服务来配置它。使用Istio OSS也可以实现该教程。然而,ASM允许将TLS策略应用于入口和pod-to-pod流量,而Istio只支持入口流量的TLS策略。
设置一个环境
本教程在GCP上运行,需要一个具有有效计费账户的项目。本教程中的命令意味着有一个环境变量PROJECT_ID,它存储了该工程的项目ID。
注意: 如果你运行本教程,你将因使用GCP资源而被计费。启用一些API可能会产生额外的费用。
1.启用Google APIs
使用以下命令来启用所需的API。
# gcloud services enable — project=$PROJECT_ID \
如果你使用Istio OSS,你只需要 compute.googleapis.com 和 container.googleapis.com API。
2.设置GKE集群
使用ASM的GKE集群至少需要e2-standard-4机器类型。本教程没有在由小机器组成的集群上进行测试。创建一个GKE集群。
# gcloud container clusters create microservice-demo \
**注意:**如果你想使用Istio OSS,则不需要用-workload-pool参数配置集群。
3.设置ASM
从ASM 1.9开始支持pod-to-pod TLS策略的执行。下面的命令安装最新版本的ASM 1.9。
# curl
需要抓取ASM的修订版以备后用。
ASM_REVISION=$(kubectl get pod -n istio-system -l app=istiod \
部署演示应用程序并配置TLS策略
本教程使用一个在线精品店应用程序,可以在github上找到。下面的步骤是将应用程序部署到专用命名空间,用适当的证书配置ASM入口网关,然后为入口和pod-to-pod流量应用TLS策略。
1.设置一个演示命名空间来运行演示应用程序
配置一个Kubernetes命名空间,在其中运行演示应用程序。
# kubectl create ns demo
对部署到演示命名空间的所有工作负载强制执行mTLS。
# cat <<EOF | kubectl apply -f -
2.下载并部署演示应用程序
在线精品店是一个运行在GKE上的微服务应用,用于不同的演示目的。本教程使用最新版本的微服务容器镜像。
# git clone
3.为演示程序选择一个主机名并设置DNS
为了测试TLS的工作,你将需要为演示应用程序准备一个有效的域名。有几种方法来配置它。你可以使用云DNS或其他DNS服务,如你的域名注册商提供的服务。你可以使用一个本地的/etc/hostname,只是为了做测试。无论哪种方式,实现ASM网关的IP地址。
# HOST_IP=$(kubectl get svc/istio-ingressgateway -n istio-system \
并将其与你选择的主机名相关联。在以下步骤中,将使用主机名demo.acme.clouddemo.acme.cloud。请用你选择的主机名替换它。
4.对入口流量执行TLS策略
为了对入口流量执行TLS策略,你必须配置ASM入口网关。要做到这一点,必须为演示应用程序的主机名配置入口网关(更多细节见安全网关)。
4.1 为acme.cloud生成CA证书。
# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \
4.2 生成demo.acme.cloud主机证书,由CA签名。
# openssl req -out demo.acme.cloud.csr \
4.3 创建TLS秘密。
# kubectl create -n istio-system secret tls ingress-credential \
4.4 更新虚拟服务。
编辑一个虚拟服务。
# EDITOR=vim; kubectl edit virtualservice/frontend-ingress -n demo
并将主机列表中的所有'*'替换为'demo.acme.cloud'。
4.5 更新Istio网关。
编辑前端的网关。
# EDITOR=vim; kubectl edit gateway/frontend-gateway -n demo
并将services:下的所有数据替换为以下内容。
- hosts:
## the following lines define TLS policy
**注意:**保持缩进,以保留清单的YAML格式。
网关清单的tls部分将TLS策略定义为TLS协议版本的范围和这些版本允许的一组密码套件。请注意,根据 TLS 1.3 协议规范,TLS 1.3 的密码套件不能更改。所以这套密码套件适用于协议版本≤TLS 1.2的情况。
5.为pod-to-pod通信执行TLS策略
到目前为止的所有步骤都可以在Istio OSS中运行。当启用mTLS时,可以用ASM执行pod-to-pod通信的TLS策略。与可以在每个主机基础上启用和配置的入口流量的TLS策略不同,pod-to-pod通信的TLS策略是在集群中启用的。为此,编辑ASM控制器。
# EDITOR=vim; kubectl edit deploy/istiod-$ASM_REVISION \
并在部署的单一容器规格中添加以下环境变量。
- name: TLS_INBOUND_CIPHER_PROFILE
ASM默认将TLS协议版本限制为1.2和1.3。因此,没有必要限制TLS协议版本的范围。
总结
我们可以限制TLS协议的版本和密码套件用于GKE内部的入口和Pod-to-Pod通信。这些值可以使用Istio OSS或ASM网关来配置入口,ASM控制器来配置pod-to-pod通信。
使用Istio或Anthos在GKE集群上执行TLS策略最初发表于Google Cloud - Communityon Medium,在那里人们通过强调和回应这个故事继续对话。