使用自我簽署憑證來透過 Notation 和 Azure Key Vault 簽署容器映像
簽署容器映像是確保其真實性和完整性的程序。 這可藉由將數位簽章新增至容器映像,以在部署期間進行驗證。 簽章有助於驗證映像是否來自受信任的發行者,且尚未修改。 標記法是由 Notary 專案開發的開放原始碼供應鏈工具,可支援簽署和驗證容器映像和其他成品。 Azure Key Vault (AKV) 可用來使用簽署金鑰儲存憑證,[標記法] 可利用該簽署金鑰與標記法 AKV 外掛程式 (azure-kv) 來對容器映像和其他成品進行簽署和驗證。 Azure Container Registry (ACR) 可讓您將簽章附加至容器映像和其他成品,以及檢視這些簽章。
在本教學課程中:
- 安裝標記法 CLI 和 AKV 外掛程式
- 在 AKV 中建立自我簽署的憑證
- 使用 ACR 工作建置和推送容器映像
- 使用標記法 CLI 和 AKV 外掛程式簽署容器映像
- 使用標記法 CLI 根據簽章驗證容器映像
必要條件
- 建立或使用 Azure Container Registry 來儲存容器映像和簽章
- 建立或使用 Azure Key Vault 來管理憑證
- 安裝及設定最新的 Azure CLI,或在 Azure Cloud Shell 中執行命令
安裝標記法 CLI 和 AKV 外掛程式
在 Linux amd64 環境中安裝標記法 v1.1.0。 遵循 Notation 安裝指南以下載其他環境的套件。
# Download, extract and install curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.1.0/notation_1.1.0_linux_amd64.tar.gz tar xvzf notation.tar.gz # Copy the Notation binary to the desired bin directory in your $PATH, for example cp ./notation /usr/local/bin
在 Linux amd64 環境中安裝表示法 Azure 金鑰保存庫 外掛程式
azure-kv
v1.1.0。注意
Notation Azure Key Vault 外掛程式的 URL 和 SHA256 總和檢查碼可以在此外掛程式的發行頁面上找到。
notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.1.0/notation-azure-kv_1.1.0_linux_amd64.tar.gz --sha256sum 2fc959bf850275246b044203609202329d015005574fabbf3e6393345e49b884
列出可用的外掛程式,並確認版本
1.1.0
的azure-kv
外掛程式包含在清單中。notation plugin ls
設定環境變數
注意
若要在教學課程中輕鬆執行命令,請提供 Azure 資源的值,以符合現有的 ACR 和 AKV 資源。
設定 AKV 資源名稱。
# Name of the existing AKV used to store the signing keys AKV_NAME=myakv # Name of the certificate created in AKV CERT_NAME=wabbit-networks-io CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US" CERT_PATH=./${CERT_NAME}.pem
設定 ACR 和映像資源名稱。
# Name of the existing registry example: myregistry.azurecr.io ACR_NAME=myregistry # Existing full domain of the ACR REGISTRY=$ACR_NAME.azurecr.io # Container name inside ACR where image will be stored REPO=net-monitor TAG=v1 IMAGE=$REGISTRY/${REPO}:$TAG # Source code directory containing Dockerfile to build IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main
使用 Azure CLI 登入
az login
若要深入了解 Azure CLI 以及如何將其用來登入,請參閱使用 Azure CLI 登入。
在 AKV 中指派存取原則 (Azure CLI)
需要具有正確存取原則權限的使用者主體,才能建立自我簽署憑證和簽署成品。 此主體可以是使用者主體、服務主體或受控識別。 此主體至少需要下列權限:
- 憑證的
Create
權限 - 憑證的
Get
權限 - 金鑰的
Sign
權限
在本教學課程中,存取原則會指派給登入的 Azure 使用者。 若要深入了解如何將原則指派給主體,請參閱指派存取原則。
設定包含 AKV 資源的訂用帳戶
az account set --subscription <your_subscription_id>
在 AKV 中設定存取原則
USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --certificate-permissions create get --key-permissions sign --object-id $USER_ID
重要
此範例說明建立憑證和簽署容器映像所需的最低權限。 視您的需求而定,您可能需要授與其他權限。
在 AKV 中建立自我簽署憑證 (Azure CLI)
下列步驟說明如何建立自我簽署憑證以供測試之用。
建立憑證原則檔案。
一旦憑證原則檔案執行如下,其會建立與 AKV 中 Notary 專案憑證需求相容的有效簽署憑證。
ekus
的值適用於程式碼簽署,但標記法不需要簽署成品。 主體稍後會做為使用者在驗證期間信任的信任身分識別。cat <<EOF > ./my_policy.json { "issuerParameters": { "certificateTransparency": null, "name": "Self" }, "keyProperties": { "exportable": false, "keySize": 2048, "keyType": "RSA", "reuseKey": true }, "secretProperties": { "contentType": "application/x-pem-file" }, "x509CertificateProperties": { "ekus": [ "1.3.6.1.5.5.7.3.3" ], "keyUsage": [ "digitalSignature" ], "subject": "$CERT_SUBJECT", "validityInMonths": 12 } } EOF
建立憑證。
az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
使用標記法 CLI 和 AKV 外掛程式簽署容器映像
使用您的個別 Azure 身分識別來向您的 ACR 進行驗證。
az acr login --name $ACR_NAME
重要
如果您的系統上已安裝 Docker,並使用 az acr login
或 docker login
向您的 ACR 進行驗證,則您的認證已儲存並可供 Notation 使用。 在此情況下,您不需要再次執行 notation login
,即可向 ACR 進行驗證。 若要深入了解 Notation 的驗證選項,請參閱使用符合 OCI 規範的登錄進行驗證。
使用 ACR 工作建置和推送新的映像。 一律使用摘要值來識別用於簽署的映像,因為標記是可變且可以覆寫的。
DIGEST=$(az acr build -r $ACR_NAME -t $REGISTRY/${REPO}:$TAG $IMAGE_SOURCE --no-logs --query "outputImages[0].digest" -o tsv) IMAGE=$REGISTRY/${REPO}@$DIGEST
在本教學課程中,如果映像已建置並儲存在登錄中,則為方便起見,標籤會做為該映像的識別碼。
IMAGE=$REGISTRY/${REPO}:$TAG
取得簽署金鑰的金鑰識別碼。 AKV 中的憑證可以有多個版本,下列命令會取得最新版本的金鑰識別碼。
KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
利用簽署金鑰識別碼透過 COSE 簽章格式來簽署容器映像。 若要使用自我簽署憑證進行簽署,您必須設定外掛程式元件組態值
self_signed=true
。notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
若要使用 AKV 進行驗證,如果啟用,預設會嘗試下列認證類型:
如果您想要指定認證類型,請使用稱為
credential_type
的其他外掛程式元件組態。 例如,您可以明確地將 設定credential_type
為azurecli
以使用 Azure CLI 認證,如下所示:notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true --plugin-config credential_type=azurecli $IMAGE
如需各種認證類型的 值
credential_type
,請參閱下表。認證類型 的值 credential_type
環境認證 environment
工作負載身分識別認證 workloadid
受控識別認證 managedid
Azure CLI 認證 azurecli
檢視已簽署映像和相關聯簽章的圖表。
notation ls $IMAGE
使用標記法 CLI 驗證容器映像
若要驗證容器映像,請將簽署分葉憑證的根憑證新增至信任存放區,並建立驗證的信任原則。 針對本教學課程中使用的自我簽署憑證,根憑證是自我簽署憑證本身。
下載公開憑證。
az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
將下載的公用憑證新增至具名信任存放區以進行簽章驗證。
STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
列出要確認的憑證。
notation cert ls
在驗證之前設定信任原則。
信任原則可讓使用者指定微調的驗證原則。 下列範例會設定名為
wabbit-networks-images
的信任原則,此原則會套用至$REGISTRY/$REPO
中的所有成品,並使用$STORE_TYPE
類型的具名信任存放區$STORE_NAME
。 其也假設使用者信任具有 X.509 主體$CERT_SUBJECT
的特定身分識別。 如需詳細資料,請參閱信任存放區和信任原則規格。cat <<EOF > ./trustpolicy.json { "version": "1.0", "trustPolicies": [ { "name": "wabbit-networks-images", "registryScopes": [ "$REGISTRY/$REPO" ], "signatureVerification": { "level" : "strict" }, "trustStores": [ "$STORE_TYPE:$STORE_NAME" ], "trustedIdentities": [ "x509.subject: $CERT_SUBJECT" ] } ] } EOF
使用
notation policy
,從我們先前建立的 JSON 檔案匯入信任原則組態。notation policy import ./trustpolicy.json notation policy show
使用
notation verify
來驗證容器映像自建置時間以來尚未變更。notation verify $IMAGE
使用信任原則成功驗證映像時,會在成功的輸出訊息中傳回驗證映像的 sha256 摘要。
下一步
請參閱使用映像完整性來驗證已簽署的映像後,再將其部署至 Azure Kubernetes Service (AKS) 叢集 (預覽版) 和 Azure 上的 Ratify,以在 AKS 上部署已簽署映像之前,開始先進行驗證和稽核。