在使用Istio或Anthos的GKE集群上执行TLS政策

245 阅读3分钟

Enforce TLS Policy on GKE cluster with Istio or Anthos

照片:Jon MooreonUnsplash

谷歌云提供了一个简单的方法来执行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,在那里人们通过强调和回应这个故事继续对话。