Sdílet prostřednictvím


Podepisování imagí kontejnerů v pracovních postupech GitHubu pomocí notace a důvěryhodného podepisování

Tento článek je součástí série o zajištění integrity a pravosti imagí kontejnerů a dalších artefaktů OCI (Open Container Initiative). Pro úplný obrázek začněte přehledem, který vysvětluje, proč podepisování záleží a popisuje různé scénáře.

V tomto článku se dozvíte, jak vytvořit pracovní postup GitHub Actions pro:

  • Sestavte image a nasdílíte ji do služby Azure Container Registry.
  • Podepište image pomocí akcí GitHubu Notation a důvěryhodného podepisování.
  • Automaticky uloží vygenerovaný podpis ve službě Container Registry.

Požadavky

Poznámka:

V tuto chvíli je důvěryhodné podepisování k dispozici pouze organizacím založeným ve Spojených státech a Kanadě, které mají ověřitelnou historii tří let nebo více.

Ověřování z Azure na GitHub

V závislosti na použití GitHub Actions pro připojení k Azure je nutné provést ověření v Azure ve vašem pracovním postupu pomocí akce Azure Login před spuštěním Azure CLI nebo příkazů Azure PowerShellu. Akce Přihlášení k Azure podporuje více metod ověřování.

V této příručce se přihlásíte pomocí OpenID Connect (OIDC), použijete spravovanou identitu přiřazenou uživatelem a budete postupovat podle kroků v části Použití akce Přihlášení k Azure s OpenID Connect.

  1. Vytvořte spravovanou identitu přiřazenou uživatelem. Pokud máte existující spravovanou identitu, tento krok přeskočte.

    az login
    az identity create -g <identity-resource-group> -n <identity-name>
    

  1. Získejte ID klienta spravované identity:

    CLIENT_ID=$(az identity show -g <identity-resource-group> -n <identity-name> --query clientId -o tsv)
    

  1. Přiřaďte spravované identitě role pro přístup ke službě Azure Container Registry.

    U těchto registrů, které nevyužívají řízení přístupu na základě atributů (ABAC), přiřaďte role AcrPush a AcrPull:

    ACR_SCOPE=/subscriptions/<subscription-id>/resourceGroups/<acr-resource-group>
    az role assignment create --assignee $CLIENT_ID --scope $ACR_SCOPE --role "acrpush" --role "acrpull"
    

    Pro registry s podporou ABAC přiřaďte role Container Registry Repository Reader a Container Registry Repository Writer:

    ACR_SCOPE=/subscriptions/<subscription-id>/resourceGroups/<acr-resource-group>
    az role assignment create --assignee $CLIENT_ID --scope $ACR_SCOPE --role "Container Registry Repository Reader" --role "Container Registry Repository Writer"
    

  1. Trusted Signing Certificate Profile Signer Přiřaďte roli spravované identitě pro přístup k důvěryhodnému podepisování:

    TS_SCOPE=/subscriptions/<subscription-id>/resourceGroups/<ts-account-resource-group>/providers/Microsoft.CodeSigning/codeSigningAccounts/<ts-account>/certificateProfiles/<ts-cert-profile>
    az role assignment create --assignee $CLIENT_ID --scope $TS_SCOPE --role "Trusted Signing Certificate Profile Signer"
    

  1. Nakonfigurujte GitHub tak, aby důvěřoval vaší identitě. Postupujte podle konfigurace spravované identity přiřazené uživatelem, aby důvěřovala externímu poskytovateli identity.

  2. Vytvořte tajné kódy GitHubu podle pokynů k vytvoření tajných kódů pro úložiště.

    Namapujte hodnoty spravované identity k těmto tajemstvím:

    Tajný kód GitHubu Hodnota spravované identity
    AZURE_CLIENT_ID ID klienta
    AZURE_SUBSCRIPTION_ID Identifikátor předplatného
    AZURE_TENANT_ID ID adresáře (klienta)

Uložení kořenového certifikátu TSA

Časové razítko (RFC 3161) rozšiřuje důvěryhodnost podpisů nad rámec doby platnosti podpisového certifikátu. Důvěryhodné podepisování používá krátkodobé certifikáty, takže časové razítko je důležité. Adresa URL serveru pro autoritu časového razítka (TSA) je k dispozici na http://timestamp.acs.microsoft.com/, jak je doporučeno v Časové razítko kontrasignatury.

  1. Stáhněte si kořenový certifikát TSA:

    curl -o msft-tsa-root-certificate-authority-2020.crt "http://www.microsoft.com/pkiops/certs/microsoft%20identity%20verification%20root%20certificate%20authority%202020.crt"
    

  1. Uložte kořenový certifikát do úložiště; například .github/certs/msft-identity-verification-root-cert-authority-2020.crt. V pracovním postupu použijete cestu k souboru.

Vytvoření pracovního postupu GitHub Actions

  1. Pokud .github/workflows adresář v úložišti neexistuje, vytvořte ho.

  2. Vytvoření nového souboru pracovního postupu; například .github/workflows/sign-with-trusted-signing.yml.

  3. Zkopírujte do souboru následující šablonu podpisového pracovního postupu.

Rozbalením zobrazíte šablonu pracovního postupu podepisování.
# Build and push an image to Azure Container Registry, set up notation, and sign the image
name: notation-github-actions-sign-with-trusted-signing-template

on:
  push:

env:
  ACR_LOGIN_SERVER: <registry-login-server>             # example: myregistry.azurecr.io
  ACR_REPO_NAME: <repository-name>                      # example: myrepo
  IMAGE_TAG: <image-tag>                                # example: v1
  PLUGIN_NAME: azure-trustedsigning                     # name of Notation Trusted Signing plug-in; do not change
  PLUGIN_DOWNLOAD_URL: <plugin-download-url>            # example: "https://github.com/Azure/trustedsigning-notation-plugin/releases/download/v1.0.0-beta.1/notation-azure-trustedsigning_1.0.0-beta.1_linux_amd64.tar.gz"
  PLUGIN_CHECKSUM: <plugin-package-checksum>            # example: 538b497be0f0b4c6ced99eceb2be16f1c4b8e3d7c451357a52aeeca6751ccb44
  TSA_URL: "http://timestamp.acs.microsoft.com/"        # timestamping server URL
  TSA_ROOT_CERT: <root-cert-file-path>                  # example: .github/certs/msft-identity-verification-root-cert-authority-2020.crt
  TS_ACCOUNT_NAME: <trusted-signing-account-name>       # Trusted Signing account name
  TS_CERT_PROFILE: <trusted-signing-cert-profile-name>  # Trusted Signing certificate profile name 
  TS_ACCOUNT_URI: <trusted-signing-account-uri>         # Trusted Signing account URI; for example, "https://eus.codesigning.azure.net/"

jobs:
  notation-sign:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
     # packages: write
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: prepare
        id: prepare
        run: |
          echo "target_artifact_reference=${{ env.ACR_LOGIN_SERVER }}/${{ env.ACR_REPO_NAME }}:${{ env.IMAGE_TAG }}" >> "$GITHUB_ENV"
      
      # Log in to Azure with your service principal secret
      # - name: Azure login
      #  uses: Azure/login@v1
      #  with:
      #    creds: ${{ secrets.AZURE_CREDENTIALS }}
      # If you're using OIDC and federated credentials, make sure to replace the preceding step with the following:
      - name: Azure login
        uses: Azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      # Log in to your container registry
      - name: ACR login
        run: |
            az acr login --name ${{ env.ACR_LOGIN_SERVER }}
      # Build and push an image to the registry
      # Use `Dockerfile` as an example to build an image
      - name: Build and push
        id: push
        uses: docker/build-push-action@v4
        with:
          push: true
          tags: ${{ env.target_artifact_reference }}
          build-args: |
            IMAGE_TAG={{ env.IMAGE_TAG }}
      # Get the manifest digest of the OCI artifact
      - name: Retrieve digest
        run: |
          echo "target_artifact_reference=${{ env.ACR_LOGIN_SERVER }}/${{ env.ACR_REPO_NAME }}@${{ steps.push.outputs.digest }}" >> "$GITHUB_ENV" 
      # Set up the Notation CLI
      - name: setup notation
        uses: notaryproject/notation-action/setup@v1.2.2
      # Sign your container images and OCI artifacts by using a private key stored in Azure Key Vault
      - name: sign OCI artifacts with Trusted Signing
        uses: notaryproject/notation-action/sign@v1
        with:
          timestamp_url: ${{ env.TSA_URL}}
          timestamp_root_cert: ${{env.TSA_ROOT_CERT }}
          plugin_name: ${{ env.PLUGIN_NAME }}
          plugin_url: ${{ env.PLUGIN_DOWNLOAD_URL }}
          plugin_checksum: ${{ env.PLUGIN_CHECKSUM }}
          key_id: ${{ env.TS_CERT_PROFILE }}
          target_artifact_reference: ${{ env.target_artifact_reference }}
          signature_format: cose
          plugin_config: |-
            accountName=${{ env.TS_ACCOUNT_NAME }}
            baseUrl=${{ env.TS_ACCOUNT_URI }}
            certProfile=${{ env.TS_CERT_PROFILE }}
          force_referrers_tag: 'false'

Poznámky k proměnným prostředí:

  • PLUGIN_NAME: Vždy používejte azure-trustedsigning.
  • PLUGIN_DOWNLOAD_URL: Získejte adresu URL ze stránky vydání modulu Trusted Signing.
  • PLUGIN_CHECKSUM: Použijte soubor kontrolního součtu na stránce vydání; například notation-azure-trustedsigning_<version>_checksums.txt.
  • TS_ACCOUNT_URI: Použijte koncový bod pro váš ověřený účet podepisování, specifický pro daný region; například https://eus.codesigning.azure.net/.

Aktivace pracovního postupu GitHub Actions

Syntaxe on:push aktivuje ukázkový pracovní postup. Potvrzení změn spustí pracovní postup. Pod názvem úložiště GitHub vyberte Akce a zobrazte protokoly pracovního postupu.

Pracovní postup úspěšně sestaví image, odešle ji do služby Azure Container Registry a podepíše ji pomocí důvěryhodného podepisování. Můžete zobrazit protokoly pracovního postupu a potvrdit, že azure-trustedsigning modul plug-in byl nainstalován a image byla úspěšně podepsána.

Kromě toho můžete registr kontejneru otevřít na webu Azure Portal. Přejděte do úložišť, přejděte na svůj obraz, a poté vyberte odkazující. Ověřte, že jsou uvedeny artefakty (podpisy) typu application/vnd.cncf.notary.signature .