[GCP] GKE FrontendConfig && ManagedCertificate
介紹
在現今的網路環境中,安全性是每個應用程式不可或缺的一部分。本文將介紹如何使用 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
在部署後我們需要等待最長60分鐘的時間等候憑證生效。
使用指令檢視狀態
# 使用指令檢視狀態
Kubectl get mcrt
# 範例輸出如下,需等待狀態變成 Active
# NAME AGE STATUS
# managed-cert 5m16s Provisioning
我們可以從 GCP Dashboard 中搜尋 Certificate Manager 在 CLASSIC CERTIFICATES 中看到憑證。
在真實世界中設定好了 TLS,當然會希望所有流量都是經過安全加密的連線進行使用,這時候就輪到我們 FrontendConfig 出馬了~
FrontendConfig 設定
FrontendConfig 用於設定 SSL Policy 和 HTTP 到 HTTPS 的重定向。
在 response 上支援
MOVED_PERMANENTLY_DEFAULT
to return a 301 redirect response code (default ifresponseCodeName
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
使用 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 密碼套件組合。
預配置的配置檔案:
- COMPATIBLE:允許最廣泛的客戶端,包括支持過時 SSL 密碼套件的客戶端。
- MODERN:支持次多的 SSL 密碼套件,允許客戶端協商 SSL。
- 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
最後複測可以發現評級上升且停止不安全連線方法
總結
使用 Google Cloud 的 FrontendConfig 和 ManagedCertificate,可以簡化 Kubernetes Ingress 的 SSL 配置和管理。FrontendConfig 允許您靈活地定義負載均衡器的前端配置,如 SSL 政策和 HTTP 到 HTTPS 的重定向。ManagedCertificate 自動提供、更新和管理 SSL 憑證,確保應用程式通信的安全加密。這些工具不僅提高了應用程序的安全性,還使管理變得更加方便和高效。通過正確配置這些資源,可以輕鬆實現安全的 HTTPS 訪問,為用戶提供更好的安全保障和使用體驗。
[2] Use SSL policies for SSL and TLS protocols | Load Balancing | Google Cloud