如果 GKE 叢集執行 1.29 版或更新版本,則不支援以 SHA-1 演算法簽署的傳輸層安全標準 (TLS) 憑證。為避免叢集受到影響,請先將Webhook 和擴充功能 API 伺服器後端的不相容憑證,替換為使用相容簽署演算法的憑證,再將叢集升級至 1.29 版。
移除這項功能對叢集的影響
如果叢集使用的憑證與 1.29 版不相容,GKE 會暫停自動升級。以相容簽署演算法替換憑證,或 1.28 版支援終止後,GKE 會恢復自動升級。
如果未在升級至 1.29 版前更換不相容的憑證,叢集可能會發生下列問題:
- 如果 GKE Webhook 後端使用以 SHA-1 演算法簽署的 TLS 憑證,就會因驗證失敗而停止運作。如果 Kubernetes 控制層與 Webhook 通訊時使用不相容的憑證,Webhook 呼叫就會失敗。視設定而定,特別是使用准入 Webhook 時,如果無法與 Webhook 聯絡,可能會導致叢集無法建立資源 (例如 Pod),造成嚴重中斷。
- 對擴充功能 API 伺服器提供的 API 進行的呼叫會失敗。
Kubernetes 為何要移除這項功能
GKE 採用開放原始碼 Kubernetes,並使用 kube-apiserver 元件,透過 TLS 與 Webhook 和擴充功能 API 伺服器後端通訊。kube-apiserver 元件是以 Go 程式設計語言編寫。
從 Go 1.18 版開始,Go 會拒絕以 SHA-1 演算法簽署的 TLS 憑證,但保留了偵錯切換開關 x509sha1=1
,可啟用舊版行為,簡化遷移程序。GKE 1.24 版是第一個使用 Go 1.18 版建構的版本。在 1.29 版之前,Kubernetes 的 GKE 建構版本已啟用這個偵錯切換開關。Go 1.24 版將移除這項切換功能。GKE 1.29 建構 Kubernetes 時會停用切換功能,為日後移除 Go 的 debug 切換功能做準備。GKE 將叢集升級至 1.29 版後,如果叢集控制層呼叫叢集中的 Webhook 或擴充功能 API 伺服器,而這些伺服器提供的 TLS 憑證是以 SHA-1 演算法簽署,呼叫就會失敗。
找出受影響的叢集
GKE 會監控叢集,並使用 Recommender 服務透過洞察和建議提供指引,找出使用以 SHA-1 演算法簽署的 TLS 憑證的 Webhook 或擴充功能 API 伺服器後端。或者,您也可以使用記錄,找出叢集中對受影響後端的呼叫。
如何取得洞察資料和建議
如要查看執行 1.24 以上版本的叢集洞察資料和建議,請按照操作說明進行。您可以使用 gcloud CLI 或 Recommender API 取得深入分析結果,並以子類型 DEPRECATION_K8S_SHA_1_CERTIFICATE
進行篩選。
如何取得記錄
如果叢集執行 1.24 以上版本,且已啟用 Cloud Logging,GKE 會提供 Cloud 稽核記錄記錄,協助您找出叢集對受影響後端的呼叫。您可以使用下列篩選器搜尋記錄:
logName =~ "projects/.*/logs/cloudaudit.googleapis.com%2Factivity"
resource.type = "k8s_cluster"
operation.producer = "k8s.io"
"insecure-sha1.invalid-cert.kubernetes.io"
稽核記錄會列出受影響後端的伺服器名稱。如要進一步瞭解如何解讀結果,請參閱下一節。
解讀洞察資料和最佳化建議提供的指引
建議包括受影響後端的主機名稱,以及是否為 Webhook 或擴充功能 API 伺服器。參照叢集中服務的主機名稱格式為 <service-name>.<namespace>.svc
。
如果受影響的後端憑證來自 Webhook 伺服器,主機名稱可以是叢集中的服務,也可以是網址。詳情請參閱「聯絡 Webhook」。
如果受影響的憑證來自擴充功能 API 伺服器,主機名稱就是叢集中的 Service。詳情請參閱「與擴充功能 apiserver 聯絡」。
找出受影響的後端後,請按照指示檢查服務的憑證或檢查網址後端的憑證 (視類型而定)。
如果叢集在過去 30 天內未呼叫使用受影響憑證的伺服器,系統就不會顯示任何建議。
建議範例
以下是建議的範例清單:
RECOMMENDATION_ID PRIMARY_IMPACT_CATEGORY RECOMMENDATION_STATE LAST_REFRESH_TIME PRIORITY RECOMMENDER_SUBTYPE DESCRIPTION
26bfcb32-6f2a-407c-874f-8cf55b3af912 RELIABILITY ACTIVE 2024-02-15T01:09:04.454456273Z P2 DEPRECATION_K8S_SHA_1_CERTIFICATE Update the webhook and/or extension API servers that use certificates signed with SHA-1 algorithm to use certificates with compatible signing algorithms prior to upgrading the cluster to version 1.29. [Learn more](https://cloud.google.com/kubernetes-engine/docs/deprecations/sha1-1-29#mitigate_the_risk_of_upgrading_to_129).
如要取得叢集和服務的詳細資料,請說明建議。在 default
命名空間中,名為 example-webhook
的 Service 輸出內容類似於下列內容:
associatedInsights:
- insight: projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/insightTypes/google.container.DiagnosisInsight/insights/d76887a8-9eed-41a0-9459-d49dee43455e
content:
overview:
featureDeprecationRecommendation:
- featureName: x.509_certificate_signature_algorithm
featureReplacementValue: algorithm [compatible with GKE v1.29](https://cloud.google.com/kubernetes-engine/docs/deprecations/sha1-1-29#compatible-signing-algorithms)
featureValue: SHA1
stopServingVersion: '1.29'
targetType: hostname
targetValue: example-webhook.default.svc
targetClusters:
- clusterId: 3be916a554724c79a2314c8baee3fd57cf1c39df1ad34c3daf291db701b6d541
clusterUri: //container.googleapis.com/projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/clusters/<CLUSTER_NAME>
description: Update the webhook and/or extension API servers that use certificates
signed with SHA-1 algorithm to use certificates with compatible signing algorithms
prior to upgrading the cluster to version 1.29. [Learn more](https://cloud.google.com/kubernetes-engine/docs/deprecations/sha1-1-29#mitigate_the_risk_of_upgrading_to_129).
etag: '"ad50aac8278951d5"'
lastRefreshTime: '2024-02-15T01:09:04.454456273Z'
name: projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/recommenders/google.container.DiagnosisRecommender/recommendations/26bfcb32-6f2a-407c-874f-8cf55b3af912
primaryImpact:
category: RELIABILITY
reliabilityProjection:
risks:
- SERVICE_DISRUPTION
priority: P2
recommenderSubtype: DEPRECATION_K8S_SHA_1_CERTIFICATE
stateInfo:
state: ACTIVE
targetResources:
- //container.googleapis.com/projects/<CLUSTER_PROJECT_NUMBER>/locations/<CLUSTER_LOCATION>/clusters/<CLUSTER_NAME>
檢查服務的憑證
Webhook 和擴充功能 API 伺服器都可以由服務提供支援。
找出要檢查的相關後端服務後,請按照下列操作說明檢查每個服務的憑證,確認哪些憑證使用 SHA-1 演算法,需要更新。
找出服務的選取器和目標埠:
kubectl describe service --namespace=NAMESPACE SERVICE_NAME
將
NAMESPACE
和SERVICE_NAME
替換為targetValue
中的值。輸出結果會與下列內容相似:
Name: example-service Namespace: default Labels: run=nginx Selector: run=nginx Type: ClusterIP IP: 172.21.xxx.xxx Port: 443 TargetPort: 444
這個輸出內容表示
example-service
具有選取器run=nginx
和目標連接埠444
。找出符合選取器的 Pod:
kubectl get pods --namespace=NAMESPACE --selector=run=nginx
輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE example-pod 1/1 Running 0 21m
這項輸出內容表示相符的 Pod 為
example-pod
。從
kubectl
localhost 設定通訊埠轉送至 Pod:kubectl port-forward --namespace=NAMESPACE pods/example-pod 8888:SERVICE_TARGET_PORT &
將
SERVICE_TARGET_PORT
取代為服務中的TargetPort
值。如未加入TargetPort
,請使用Port
值。使用
openssl
顯示服務使用的憑證:openssl s_client -connect localhost:8888 </dev/null | openssl x509 -noout -text
以下範例輸出內容顯示以 SHA-256 演算法簽署的有效憑證:
Certificate: Data: ... Signature Algorithm: sha256WithRSAEncryption ... Signature Algorithm: sha256WithRSAEncryption
以下範例輸出內容顯示以 SHA-1 演算法簽署的無效憑證:
Certificate: Data: ... Signature Algorithm: sha1WithRSAEncryption ... Signature Algorithm: sha1WithRSAEncryption
如果憑證的輸出內容相似,請更新憑證,使用相容的簽署演算法。舉例來說,如果您使用
certificate.k8s.io
API 管理叢集中的 TLS 憑證,可以按照操作說明建立憑證簽署要求。
清除通訊埠轉送
如要清除在背景執行的通訊埠轉送,請找出並終止該程序。
執行下列指令,列出執行中的程序:
jobs
查看輸出內容,取得要終止的程序 ID:
[1]+ Running kubectl port-forward pods/example-pod 8888:444 &
這個範例輸出內容表示程序 ID 為
1
。終止程序,並取代
PROCESS_ID
:kill %PROCESS_ID
輸出內容如下:
[1]+ Terminated kubectl port-forward pods/example 8888:444
此範例輸出內容顯示程序已終止。
檢查網址後端的憑證
如果 Webhook 使用 url
後端,請直接連線至網址中指定的主機名稱。舉例來說,如果網址是 https://example.com:123/foo/bar
,請使用下列 openssl
指令,顯示後端使用的憑證:
openssl s_client -connect example.com:123 </dev/null | openssl x509 -noout -text
以下範例輸出內容顯示以 SHA-256 演算法簽署的有效憑證:
Certificate:
Data:
...
Signature Algorithm: sha256WithRSAEncryption
...
Signature Algorithm: sha256WithRSAEncryption
以下範例輸出內容顯示以 SHA-1 演算法簽署的無效憑證:
Certificate:
Data:
...
Signature Algorithm: sha1WithRSAEncryption
...
Signature Algorithm: sha1WithRSAEncryption
如果憑證的輸出內容相似,請更新憑證,使用相容的簽署演算法。舉例來說,如果您使用 certificate.k8s.io
API 管理叢集中的 TLS 憑證,可以按照操作說明建立憑證簽署要求。
降低升級至 1.29 版的風險
找出受影響的叢集和後端服務後,請先將服務的憑證從以 SHA-1 演算法簽署,更新為採用相容簽署演算法,再將叢集升級至 1.29 版。
GKE 會自動偵測受影響的叢集,並不會自動升級至 1.29 版,直到開始使用相容的憑證或 1.28 版終止支援為止。1.28 版終止支援後,叢集會自動升級至 1.29 版。
相容的簽署演算法
GKE 1.29 版與 Go x509 套件中支援的演算法相容。包括下列演算法:
SHA256WithRSA
SHA384WithRSA
SHA512WithRSA
ECDSAWithSHA256
ECDSAWithSHA384
ECDSAWithSHA512
SHA256WithRSAPSS
SHA384WithRSAPSS
SHA512WithRSAPSS
PureEd25519
如要查看可用的演算法,請參閱 x509.go 來源檔案,並搜尋 UnknownSignatureAlgorithm SignatureAlgorithm = iota
。Go x509 套件支援的演算法會列在 const
區塊中,如要找出不受支援的不安全簽署演算法,請在檔案中搜尋 InsecureAlgorithmError
的用法。
資源
如要進一步瞭解這項異動,請參閱下列資源:
- Go 1.18 版本資訊
- Go 1.24 x509sha1 偵錯切換開關移除作業
- Go x509 支援的演算法