使用自我簽署憑證來透過 Notation 和 Azure Key Vault 簽署容器映像

簽署容器映像是確保其真實性和完整性的程序。 這可藉由將數位簽章新增至容器映像,以在部署期間進行驗證。 簽章有助於驗證映像是否來自受信任的發行者,且尚未修改。 標記法是由 Notary 專案開發的開放原始碼供應鏈工具,可支援簽署和驗證容器映像和其他成品。 Azure Key Vault (AKV) 可用來使用簽署金鑰儲存憑證,[標記法] 可利用該簽署金鑰與標記法 AKV 外掛程式 (azure-kv) 來對容器映像和其他成品進行簽署和驗證。 Azure Container Registry (ACR) 可讓您將簽章附加至容器映像和其他成品,以及檢視這些簽章。

在本教學課程中:

  • 安裝標記法 CLI 和 AKV 外掛程式
  • 在 AKV 中建立自我簽署的憑證
  • 使用 ACR 工作建置和推送容器映像
  • 使用標記法 CLI 和 AKV 外掛程式簽署容器映像
  • 使用標記法 CLI 根據簽章驗證容器映像

必要條件

安裝標記法 CLI 和 AKV 外掛程式

  1. 在 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
    
  2. 在 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
    
  3. 列出可用的外掛程式,並確認版本 1.1.0azure-kv 外掛程式包含在清單中。

    notation plugin ls
    

設定環境變數

注意

若要在教學課程中輕鬆執行命令,請提供 Azure 資源的值,以符合現有的 ACR 和 AKV 資源。

  1. 設定 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
    
  2. 設定 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)

下列步驟說明如何建立自我簽署憑證以供測試之用。

  1. 建立憑證原則檔案。

    一旦憑證原則檔案執行如下,其會建立與 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
    
  2. 建立憑證。

    az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
    

使用標記法 CLI 和 AKV 外掛程式簽署容器映像

  1. 使用您的個別 Azure 身分識別來向您的 ACR 進行驗證。

    az acr login --name $ACR_NAME
    

重要

如果您的系統上已安裝 Docker,並使用 az acr logindocker login 向您的 ACR 進行驗證,則您的認證已儲存並可供 Notation 使用。 在此情況下,您不需要再次執行 notation login,即可向 ACR 進行驗證。 若要深入了解 Notation 的驗證選項,請參閱使用符合 OCI 規範的登錄進行驗證

  1. 使用 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
    
  2. 取得簽署金鑰的金鑰識別碼。 AKV 中的憑證可以有多個版本,下列命令會取得最新版本的金鑰識別碼。

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
    
  3. 利用簽署金鑰識別碼透過 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_typeazurecli 以使用 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
  4. 檢視已簽署映像和相關聯簽章的圖表。

    notation ls $IMAGE
    

使用標記法 CLI 驗證容器映像

若要驗證容器映像,請將簽署分葉憑證的根憑證新增至信任存放區,並建立驗證的信任原則。 針對本教學課程中使用的自我簽署憑證,根憑證是自我簽署憑證本身。

  1. 下載公開憑證。

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. 將下載的公用憑證新增至具名信任存放區以進行簽章驗證。

    STORE_TYPE="ca"
    STORE_NAME="wabbit-networks.io"
    notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
    
  3. 列出要確認的憑證。

    notation cert ls
    
  4. 在驗證之前設定信任原則。

    信任原則可讓使用者指定微調的驗證原則。 下列範例會設定名為 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
    
  5. 使用 notation policy,從我們先前建立的 JSON 檔案匯入信任原則組態。

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. 使用 notation verify 來驗證容器映像自建置時間以來尚未變更。

    notation verify $IMAGE
    

    使用信任原則成功驗證映像時,會在成功的輸出訊息中傳回驗證映像的 sha256 摘要。

下一步

請參閱使用映像完整性來驗證已簽署的映像後,再將其部署至 Azure Kubernetes Service (AKS) 叢集 (預覽版)Azure 上的 Ratify,以在 AKS 上部署已簽署映像之前,開始先進行驗證和稽核。