共用方式為


在 Azure Pipeline 中使用表示法簽署並驗證容器映像

Azure DevOps 中的表示法工作是內建工作,用來簽署和驗證 Azure Pipeline 內的容器映像和其他開放式容器計劃 (OCI) 成品。 表示法工作會利用表示法 CLI 來執行這些作業,確保成品是由受信任的實體簽署,而且自建立后尚未遭到竄改。

本文將逐步引導您建立可建置容器映像、將其推送至 ACR 的 Azure 管線,並使用表示法和 Azure 金鑰保存庫 外掛程式新增簽章,以提供成品的安全性和完整性層。 管線的目標是:

  1. 建置容器映像,並將其推送至 Azure Container Registry (ACR)。
  2. 使用表示法和表示法 Azure 金鑰保存庫 外掛程式簽署映像。 簽章接著會自動推送至 ACR。

必要條件

  • 在 Azure 金鑰保存庫 中建立 金鑰保存庫,並產生自我簽署的簽署密鑰和憑證。 您可以使用本 來建立自我簽署密鑰和憑證,以供測試之用。 如果您有 CA 簽發的憑證,請參閱這份 檔以取得詳細數據
  • 在 Azure Container Registry 中建立登錄(ACR)。
  • 請確定您有 Azure DevOps 存放庫或 GitHub 存放庫。

建立服務 連線

在 Azure Pipelines 中建立服務連線,可讓您的管線存取外部服務,例如 Azure Container Registry (ACR),您可以遵循下列步驟:

  • 使用 ACR 認證在 Azure Container Registry (ACR) 中簽署映像。

  • 使用 Azure Pipelines 中的 Docker 工作來登入 ACR。 Docker 工作是 Azure Pipelines 中的內建工作,可讓您建置、推送和提取 Docker 映像等等。

  • 在 Azure Pipeline 中建立 Docker 登錄服務連線 ,以授與 ACR 登錄的表示法工作存取權,如下所示:

    1. 登入您的組織 (https://dev.azure.com/{yourorganization}) 並選取您的專案。
    2. 選取左下角的 [設定] 按鈕。
    3. 移至 [管線],然後選取 [服務連線]。
    4. 選擇 [ 新增服務連線 ],然後選取 [Docker 登錄]。
    5. 接下來,選擇 [Azure Container Registry]。
    6. [驗證類型] 中選擇 [服務主體],然後輸入服務主體詳細數據,包括您的 Azure 訂用帳戶和 ACR 登錄。
    7. 輸入在參考此服務連線時要使用的用戶易記 連線 ion 名稱
  • 在 Azure Pipelines 中建立 Azure Resource Manager 服務連線,以授權存取 Azure 金鑰保存庫:

    1. 選擇 [服務主體] [自動]。
    2. 接下來,選擇 [ 訂用帳戶 ],然後從下拉式清單中尋找您的 Azure 訂用帳戶。
    3. 從下拉式清單中選擇可用的資源群組。
    4. 輸入在參考此服務連線時要使用的使用者易記 服務連線名稱
    5. 儲存它以完成建立。
  • 請遵循下列步驟,將存取原則授與服務主體:

    1. 開啟已建立的 Azure Resource Manager 服務連線,然後按兩下 [ 管理服務主體 ] 以輸入 Azure 服務主體入口網站。
    2. Application (client) ID複製 。 它會用來授與服務主體的許可權。
    3. 開啟 Azure 金鑰保存庫 入口網站,然後輸入存取原則頁面。
    4. 使用 key signsecret getcertificate get 許可權建立新的存取原則。
    5. 使用 Application (client) ID 上一個步驟的貼上,將此新的存取原則授與服務主體。
    6. 儲存它以完成建立。

在這裡深入瞭解服務連線

建立管線並使用表示法工作

依照下列步驟建立 Git 存放庫的 Azure 管線:

  1. 流覽至 AOD 組織中的專案。
  2. 從左側功能表中移至 [管線 ],然後選取 [ 新增管線]。
  3. 選擇您的 Git 存放庫。 我們使用 Azure DevOps 存放庫來方便示範。
  4. 如果您是 Azure DevOps 的新手,請使用入門管線設定管線。 按兩下 [ 儲存並執行] 來檢閱並建立管線。

注意

這個範例假設預設分支為 main。 如果不是,請遵循 指南 來更新預設分支。

編輯您的 Azure 管線,有兩種方式可以新增表示法工作:

使用 Azure DevOps (ADO) 面板:ADO 面板會提供使用者介面,您可以在其中將工作新增至管線。 您可以搜尋表示法工作,並使用這個介面將它們新增至管線。

從範例 Azure Pipeline 檔案複製:如果您有已經包含表示法工作的範例 Azure Pipeline 檔案,您可以從範例檔案複製這些工作,並將其貼到管線檔案中。

選項 1:使用 Azure DevOps (ADO) 編輯面板

Docker從右側的管線編輯面板搜尋工作。 使用其 login 命令搭配 Docker 登錄服務連線來向 ACR 進行驗證。

  1. 從 [容器登錄] 下拉式清單中,選擇在上一個步驟中建立的 Docker 登錄服務連線。
  2. login從 [命令] 下拉式清單中選擇。
  3. 按兩下 [新增 ] 將具有 login 命令的 Docker 工作新增至左側管線檔案。

同樣地,再次從管線編輯面板搜尋工作 Docker 。 使用其 buildAndPush 命令將原始程式碼自動建置至映像,並將它推送至目標 ACR 存放庫。 它會產生映像摘要,以用於在下一個步驟中簽署。

  1. 將存放庫名稱輸入至 容器存放庫
  2. [命令] 下拉式清單中選擇 buildAndPush
  3. 指定 Dockerfile 的檔案路徑。 例如,如果您的 Dockerfile 儲存在根資料夾中, 請使用 ./Dockerfile
  4. 按兩下 [新增 ] 將具有 buildAndPush 命令的 Docker 工作新增至左側管線檔案。

Notation從右側的管線編輯面板搜尋工作。

  1. 從下拉式清單命令中選擇 [安裝] 以執行
  2. 按兩下 [新增 ] 將工作 notation install 新增至管線。
  3. 同樣地,再次從管線編輯面板搜尋工作 Notation ,然後選擇 [ 簽署]。
  4. 您可以略過成品參考,因為我們使用 Docker 工作建置並推送至登錄的最新摘要來簽署映像。 相反地,您可以使用 手動指定摘要 <registry_host>/<repository>@<digest>
  5. 填寫表單中的外掛程式元件組態。 我們將使用在上一個步驟中建立的預設 AKV 外掛程式和服務連線。 將金鑰標識碼從 AKV 複製到金鑰識別碼
  6. 核取 [ 自我簽署憑證 ] 方塊,因為我們使用自我簽署憑證來方便示範。 相反地,如果您想要使用 CA 簽發的憑證,您可以在憑證套件組合檔案路徑中 輸入憑證路徑
  7. 按兩下 [新增 ] 將 新增 notation sign 至管線檔案。

選項 2:編輯範例 Azure Pipeline 檔案

  1. 如果您熟悉 Azure Pipelines 和表示法,則從範本管線檔案開始是有效率的。
  2. 將檔中提供的管線範本複製到您自己的管線檔案。 此範本的設計目的是使用表示法工作,用來簽署和驗證容器映像。
  3. 複製範本之後,請根據下面提供的參考和批註填寫必要的值。
請參閱選項 1 的簽署工作範本(按兩下這裡)。
trigger:
 - main
pool: 
  vmImage: 'ubuntu-latest'

steps:
# log in to registry
- task: Docker@2
  inputs:
    containerRegistry: <your_docker_registry_service_connection>
    command: 'login'
# build and push artifact to registry
- task: Docker@2
  inputs:
    repository: <your_repository_name>
    command: 'buildAndPush'
    Dockerfile: './Dockerfile'
# install notation
- task: Notation@0
  inputs:
    command: 'install'
    version: '1.1.0'
# automatically detect the artifact pushed by Docker task and sign the artifact.
- task: Notation@0
  inputs:
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <your_akv_service_connection>
    keyid: <your_key_id>
    selfSigned: true

注意

除了使用 Docker 工作之外,您還可以手動指定 中的 artifactRefs 成品參考,以簽署指定的映像摘要,如下所示。

請參閱範例 (按兩下這裡)。
# sign the artifact
- task: Notation@0
  inputs:
    artifactRefs: '<registry_host>/<repository>@<digest>'
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <akv_service_connection>
    keyid: <key_id>
    selfSigned: true

觸發管道

請依照步驟在 Azure DevOps 中執行管線,並確認其執行。

  1. 填寫管線中的輸入之後,請儲存並執行以觸發管線。
  2. 移至 執行中管線的 [作業 ] 頁面。 在這裡,您可以看到每個步驟的執行。 此管線會建置並簽署最新的組建或指定的摘要,然後將已簽署的映像連同其相關聯的簽章推送至登錄。
  3. 成功執行時,您可以看到已連結 CBOR 對象簽署和加密 (COSE) 格式簽章的映像推送至您的 Azure Container Registry (ACR)。

確認已簽署的映像

同樣地,若要驗證已簽署的影像,您可以使用編輯面板或編輯管線檔案,將表示法工作 verify 新增至管線。 管線將會使用您所提供的信任原則和信任存放區來驗證已簽署的映像。

準備表示法信任原則和信任存放區

一般而言,驗證器與簽署者不同。 為了示範目的,我們會在此範例中使用相同的管線和 ADO 存放庫。 請遵循下列步驟來建立表示法 信任原則信任存放區,並在管線中新增 verify 工作:

  1. 在目前的 ADO 存放庫中,建立範例資料夾 .pipeline 來儲存表示法信任原則 .pipeline/trustpolicy/。 建立範例信任原則 JSON 檔案 trustpolicy.json。 使用您自己的值填寫信任原則範本,並將它儲存在資料夾中。

注意

請注意,表示信任存放區目前支援三種身分識別,包括證書頒發機構單位 (CA)、簽署授權單位和時間戳授權單位 (TSA) 跟證書。 為了示範目的,我們會在下面的信任原則和信任存放區中使用證書頒發機構單位 (CA x509/ca )。 如需詳細資訊,請參閱 信任存放區

請參閱信任原則範本 (按兩下這裡)。
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "<yourPolicyName>",
            "registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
            "signatureVerification": {
                "level" : "strict" 
            },
            "trustStores": [ "ca:<yourTrustStore>"],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
  1. 在目前的 ADO 存放庫中,建立表示法信任存放區 /.pipeline/truststore/x509/ca/$<yourTrustStore>/ 的新資料夾來儲存憑證。 如果您遵循本檔中的簽署步驟來簽署映像,請使用下列命令從 Azure 金鑰保存庫 下載自我簽署憑證(AKV):
KEY_NAME=<key_name_you_picked_when_creating_the_key>
AKV_NAME=<akv_name_where_certificate_is_stored>
CERT_ID=$(az keyvault certificate show -n $KEY_NAME --vault-name $AKV_NAME --query 'id' -o tsv)
CERT_PATH=./${KEY_NAME}.pem
az keyvault certificate download --file $CERT_PATH --id $CERT_ID --encoding PEM
  1. 將憑證上傳至我們在最後一個步驟中建立的信任存放區資料夾 /.pipeline/truststore/x509/ca/$<yourTrustStore>/

新增表示法驗證工作

  1. 再次從管線編輯面板搜尋表示法工作,然後選擇 [ 驗證]。
  2. 使用已簽署映像的摘要填入 成品參考
  3. 在信任原則檔案路徑輸入值.pipeline/trustpolicy/trustpolicy.json
  4. 在 [信任存放區資料夾路徑] 中輸入值.pipeline/truststore/
  5. 按兩下 [新增] 將表示法驗證新增至管線檔案左側。

您的 notation verify 儲存方式如下。

請參閱範例 (按兩下這裡)。
# sign the artifact
- task: Notation@0
  inputs:
    command: 'verify'
    artifactRefs: '<registry_host>/<repository>@<digest>'
    trustPolicy: .pipeline/trustpolicy.json
    trustStore: .pipeline/truststore/

觸發管線 (已更新)

您可以再次觸發管線來驗證已簽署的映像。 成功執行時,您可以從執行管線的 [作業] 頁面看到記錄。 管線將會使用您所提供的信任原則和信任存放區來驗證已簽署的映像。

結論

本文說明如何在 Azure Pipeline 中使用表示法來簽署和驗證容器映像。 您可以使用 Azure DevOps 面板或編輯管線檔案,將表示法工作新增至管線。 管線將會使用您所提供的信任原則和信任存放區來建置、推送、簽署和驗證映像。 此程式可確保成品是由信任的實體簽署,而且自建立后尚未遭到竄改。