[GCP] GKE FrontendConfig && ManagedCertificate

GKE 安全性

WEI LAI
11 min readJul 16, 2024

介紹

在現今的網路環境中,安全性是每個應用程式不可或缺的一部分。本文將介紹如何使用 Google Cloud 的 Kubernetes Engine (GKE) 中的 FrontendConfig 和 ManagedCertificate 來設置安全的 Kubernetes Ingress,確保您的應用程式通信安全加密。

什麼是 FrontendConfig 和 ManagedCertificate?

  • FrontendConfig 是一種 Kubernetes 資源,允許您在 Google Cloud 中自定義負載均衡器的前端配置。它可以用來設置 SSL 政策、HTTP 到 HTTPS 重定向等功能,從而提高應用程序的安全性和靈活性。
  • ManagedCertificate 是由 Google 管理的 SSL 憑證資源。這些憑證由 Google 自動提供、更新和管理,簡化了憑證的管理過程,使得應用程序能夠輕鬆實現 HTTPS 加密。

建立測試用 GKE

gcloud container clusters create "demo" \
--zone "asia-east1-a" \
--machine-type "e2-medium" \
--num-nodes "1" \
--node-locations "asia-east1-a"

建立完成後取得連線用 credential

gcloud container clusters get-credentials demo --zone asia-east1-a

部屬測試用服務

# 部署 Nginx 
cat <<EOF | kubectl apply -f -
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
...
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
...
EOF

創建 ManagedCertificate 資源

前提條件

  • 需要擁有域名,並且域名長度不超過 63 個字符。
  • 在 GKE 標準集群中,必須啟用 HttpLoadBalancing 附加組件。 (預設啟用)
  • 創建一個保留的靜態外部 IP 地址。
# 建立憑證
cat <<EOF | kubectl apply -f -
---
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: managed-cert
spec:
domains:
- demo.poiblacktea.com # 請依造需求更改domain
EOF

# 建立給 LB 使用的 IP
gcloud compute addresses create demo-ip --global

# 檢視我們的 IP,稍後須設定DNS record
gcloud compute addresses list |grep demo-ip

限制

  • Google 管理的憑證不支持通配符 (Wildcard) 域名,只支持最多 100 個非通配符域名。

設置 Google 管理的憑證

  • 創建 Ingress 對象,並在注解中關聯 ManagedCertificate 和保留的 IP 地址。
  • 在 DNS 代管商設定我們的域名以及IP對應
cat <<EOF | kubectl apply -f -
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: demo-ip
networking.gke.io/managed-certificates: managed-cert
spec:
defaultBackend:
service:
name: nginx-service
port:
number: 80
EOF
設定DNS A record

在部署後我們需要等待最長60分鐘的時間等候憑證生效。

使用指令檢視狀態

# 使用指令檢視狀態
Kubectl get mcrt
# 範例輸出如下,需等待狀態變成 Active
# NAME AGE STATUS
# managed-cert 5m16s Provisioning

我們可以從 GCP Dashboard 中搜尋 Certificate Manager 在 CLASSIC CERTIFICATES 中看到憑證。

驗證中
驗證完成
測試網頁

在真實世界中設定好了 TLS,當然會希望所有流量都是經過安全加密的連線進行使用,這時候就輪到我們 FrontendConfig 出馬了~

沒設定 HTTP Redirect HTTPS

FrontendConfig 設定

FrontendConfig 用於設定 SSL Policy 和 HTTP 到 HTTPS 的重定向。

官方解說 Redirect 示意圖

在 response 上支援

  • MOVED_PERMANENTLY_DEFAULT to return a 301 redirect response code (default if responseCodeName is unspecified).
  • FOUND to return a 302 redirect response code.
  • SEE_OTHER to return a 303 redirect response code.
  • TEMPORARY_REDIRECT to return a 307 redirect response code.
  • PERMANENT_REDIRECT to return a 308 redirect response code.

設定使用 TEMPORARY_REDIRECT 幫助我們進行重定向

cat <<EOF | kubectl apply -f -
---
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: my-frontend-config
spec:
redirectToHttps:
enabled: true
responseCodeName: TEMPORARY_REDIRECT
EOF

套用到 Ingress 上

cat <<EOF | kubectl apply -f -
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
networking.gke.io/v1beta1.FrontendConfig: my-frontend-config
kubernetes.io/ingress.global-static-ip-name: demo-ip
networking.gke.io/managed-certificates: managed-cert
spec:
defaultBackend:
service:
name: nginx-service
port:
number: 80
EOF

從 GCP Dashboard 上可以看到 Load Balancer 配置了 Redirect

設定 Redirect 後

使用 curl 指令驗證可以看到有完成我們期望的 Redirect

curl -L http://demo.poiblacktea.com -I

到此我們完成了HTTP Redirects HTTPS的工作,但為了更佳的資安使用環境我們可以更進一步透過 FrontendConfig 設定 Ingress 上的 SSL Policy,限制只允許 TLS 1.2 以上的連線。

從 Qualys SSL Labs 上檢測發現我們支援弱安全性的TLS連線。

定義 SSL 政策 (SSL Policy)

定義 SSL 政策時,需要指定最小 TLS 版本和一個配置檔案。配置檔案選擇了負載均衡器中啟用的 SSL 密碼套件組合。

預配置的配置檔案

  1. COMPATIBLE:允許最廣泛的客戶端,包括支持過時 SSL 密碼套件的客戶端。
  2. MODERN:支持次多的 SSL 密碼套件,允許客戶端協商 SSL。
  3. RESTRICTED:支持最少的 SSL 密碼套件,旨在滿足更嚴格的合規要求。

此外,我們也可以自行定義配置檔案。

配置檔與密碼套件對應

設定 SSL Policy

gcloud compute ssl-policies create my-ssl-policy \
--profile RESTRICTED \
--min-tls-version 1.2

更新 FrontendConfig 以套用 SSL 政策

cat <<EOF | kubectl apply -f -
---
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: my-frontend-config
spec:
redirectToHttps:
enabled: true
responseCodeName: TEMPORARY_REDIRECT
sslPolicy: my-ssl-policy
EOF
套用後 Load Balancer

最後複測可以發現評級上升且停止不安全連線方法

複測
複測

總結

使用 Google Cloud 的 FrontendConfig 和 ManagedCertificate,可以簡化 Kubernetes Ingress 的 SSL 配置和管理。FrontendConfig 允許您靈活地定義負載均衡器的前端配置,如 SSL 政策和 HTTP 到 HTTPS 的重定向。ManagedCertificate 自動提供、更新和管理 SSL 憑證,確保應用程式通信的安全加密。這些工具不僅提高了應用程序的安全性,還使管理變得更加方便和高效。通過正確配置這些資源,可以輕鬆實現安全的 HTTPS 訪問,為用戶提供更好的安全保障和使用體驗。

[1] https://cloud.google.com/kubernetes-engine/docs/how-to/ingress-configuration#configuring_ingress_features_through_frontendconfig_parameters

[2] Use SSL policies for SSL and TLS protocols | Load Balancing | Google Cloud

--

--

WEI LAI

Solution Architect | DevOps Engineer | Network Security Engineer