隨著容器鏡像的廣泛使用,如何確保這些鏡像的安全性和完整性成為了一個重要的問題。為了解決這個問題,Kubernetes引入了一種名為簽名鏡像(Signed Images)的特性,它可以驗證容器鏡像是否已經(jīng)被正確地簽名。那么,如何在Kubernetes中驗證已簽名的容器鏡像呢?
一、準備
需要安裝以下工具:
- cosign
- curl(通常由你的操作系統(tǒng)提供)
- jq
二、驗證二進制簽名
Kubernetes 發(fā)布過程使用 cosign 的無密鑰簽名對所有二進制工件(壓縮包、 SPDX 文件、 獨立的二進制文件)簽名。要驗證一個特定的二進制文件, 獲取組件時要包含其簽名和證書:
URL=https://dl.k8s.io/release/v1.29.0/bin/linux/amd64 BINARY=kubectl FILES=( ????"$BINARY" ????"$BINARY.sig" ????"$BINARY.cert" ) for?FILE?in?"${FILES[@]}";?do ????curl?-sSfL?--retry?3?--retry-delay?3?"$URL/$FILE"?-o?"$FILE" done
然后使用 cosign verify-blob 驗證二進制文件:
cosign verify-blob "$BINARY" \ ??--signature?"$BINARY".sig?\ ??--certificate?"$BINARY".cert?\ ??--certificate-identity?krel-staging@k8s-releng-prod.iam.gserviceaccount.com?\ ??--certificate-oidc-issuer?https://accounts.google.com
注意:
- Cosign 2.0 需要指定 –certificate-identity 和 –certificate-oidc-issuer 選項;
- Cosign 的早期版本還需要設置 COSIGN_EXPERIMENTAL=1。
三、驗證鏡像簽名
從這個列表中選擇一個鏡像,并使用 cosign verify 命令來驗證它的簽名:
cosign verify registry.k8s.io/kube-apiserver-amd64:v1.29.0 \ --certificate-identity krel-trust@k8s-releng-prod.iam.gserviceaccount.com \ --certificate-oidc-issuer https://accounts.google.com \ | jq .
1、驗證所有控制平面組件鏡像
驗證最新穩(wěn)定版(v1.29.0)所有已簽名的控制平面組件鏡像, 請運行以下命令:
curl -Ls "https://sbom.k8s.io/$(curl -Ls https://dl.k8s.io/release/stable.txt)/release" \ ??|?grep?"SPDXID:?SPDXRef-Package-registry.k8s.io"?\ ??|?grep?-v?sha256?|?cut?-d-?-f3-?|?sed?'s/-/\//'?|?sed?'s/-v1/:v1/'?\ ??|?sort?>?images.txt input=images.txt while?IFS=?read?-r?image do ??cosign?verify?"$image"?\ ????--certificate-identity?krel-trust@k8s-releng-prod.iam.gserviceaccount.com?\ ????--certificate-oidc-issuer?https://accounts.google.com?\ ????|?jq?. done?<?"$input"
當完成某個鏡像的驗證時,可以在 Pod 清單通過摘要值來指定該鏡像,例如:
registry-url/image-name@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
四、驗證鏡像簽名
有一些非控制平面鏡像 (例如 conformance 鏡像), 也可以在部署時使用 sigstore policy-controller 控制器驗證其簽名。
五、驗證軟件物料清單
可以使用 sigstore 證書和簽名或相應的 SHA 文件來驗證 Kubernetes 軟件物料清單(SBOM):
# 檢索最新可用的 Kubernetes 發(fā)行版本 VERSION=$(curl?-Ls?https://dl.k8s.io/release/stable.txt) #?驗證?SHA512?sum curl?-Ls?"https://sbom.k8s.io/$VERSION/release"?-o?"$VERSION.spdx" echo?"$(curl?-Ls?"https://sbom.k8s.io/$VERSION/release.sha512")?$VERSION.spdx"?|?sha512sum?--check #?驗證?SHA256?sum echo?"$(curl?-Ls?"https://sbom.k8s.io/$VERSION/release.sha256")?$VERSION.spdx"?|?sha256sum?--check #?檢索?sigstore?簽名和證書 curl?-Ls?"https://sbom.k8s.io/$VERSION/release.sig"?-o?"$VERSION.spdx.sig" curl?-Ls?"https://sbom.k8s.io/$VERSION/release.cert"?-o?"$VERSION.spdx.cert" #?驗證?sigstore?簽名 cosign?verify-blob?\ ????--certificate?"$VERSION.spdx.cert"?\ ????--signature?"$VERSION.spdx.sig"?\ ????--certificate-identity?krel-staging@k8s-releng-prod.iam.gserviceaccount.com?\ ????--certificate-oidc-issuer?https://accounts.google.com?\ ????"$VERSION.spdx"