Menandatangani gambar kontainer di alur kerja GitHub dengan menggunakan Notasi dan Penandatanganan Artefak

Artikel ini adalah bagian dari rangkaian tentang memastikan integritas dan keaslian gambar kontainer dan artefak Open Container Initiative (OCI) lainnya. Untuk gambaran lengkap, mulailah dengan gambaran umum, yang menjelaskan mengapa penandatanganan penting dan menguraikan berbagai skenario.

Dalam artikel ini, Anda mempelajari cara membuat alur kerja GitHub Actions untuk:

  • Buat gambar dan dorong ke Azure Container Registry.
  • Tanda tangani gambar dengan menggunakan tindakan Notasi GitHub dan Penandatanganan Artefak.
  • Simpan tanda tangan yang dihasilkan secara otomatis di Container Registry.

Prasyarat

Mengautentikasi dari Azure ke GitHub

Menurut Gunakan Tindakan GitHub untuk menyambungkan ke Azure, Anda harus mengautentikasi dengan Azure di alur kerja Anda dengan menggunakan tindakan Azure Login sebelum Anda menjalankan perintah Azure CLI atau Azure PowerShell. Tindakan Azure Login mendukung beberapa metode autentikasi.

Dalam panduan ini, Anda masuk dengan OpenID Connect (OIDC), menggunakan identitas terkelola yang ditetapkan pengguna, dan ikuti langkah-langkah dalam Menggunakan tindakan Masuk Azure dengan OpenID Connect.

  1. Buat identitas terkelola yang ditetapkan pengguna. Lewati langkah ini jika Anda memiliki identitas terkelola yang sudah ada.

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

  1. Dapatkan ID klien identitas terkelola Anda:

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

  1. Tetapkan peran ke identitas terkelola untuk mengakses Azure Container Registry.

    Untuk registri yang tidak diaktifkan dengan kontrol akses berbasis atribut (ABAC), tetapkan peran AcrPush dan AcrPull.

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

    Untuk registri berkemampuan ABAC, tetapkan peran sebagai berikut: Container Registry Repository Reader dan 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. Tetapkan peran Artifact Signing Certificate Profile Signer kepada identitas terkelola untuk mengakses Penandatanganan Artefak.

    AS_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 $AS_SCOPE --role "Artifact Signing Certificate Profile Signer"
    

  1. Konfigurasikan GitHub untuk mempercayai identitas Anda. Ikuti konfigurasi identitas terkelola yang ditugaskan oleh pengguna untuk mempercayai penyedia identitas eksternal.

  2. Buat rahasia GitHub dengan mengikuti Membuat rahasia untuk repositori.

    Petakan nilai identitas terkelola ke rahasia tersebut:

    Rahasia GitHub Nilai identitas terkelola
    AZURE_CLIENT_ID ID Pelanggan
    AZURE_SUBSCRIPTION_ID Identifikasi Langganan
    AZURE_TENANT_ID ID Direktori (Penyewa)

Menyimpan sertifikat akar TSA

Penandaan waktu (RFC 3161) memperluas kepercayaan pada tanda tangan melebihi periode validitas sertifikat penandatanganan. Penandatanganan Artefak menggunakan sertifikat berumur pendek, sehingga tanda waktu sangat penting. URL server untuk otoritas stempel waktu (TSA) tersedia di http://timestamp.acs.microsoft.com/, seperti yang direkomendasikan dalam Tanda balik stempel waktu.

  1. Unduh sertifikat akar 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. Simpan sertifikat akar di repositori Anda; misalnya, .github/certs/msft-identity-verification-root-cert-authority-2020.crt. Anda akan menggunakan jalur file dalam alur kerja.

Membuat alur kerja Tindakan GitHub

  1. Buat .github/workflows direktori di repositori Anda, jika tidak ada.

  2. Membuat file alur kerja baru; misalnya, .github/workflows/sign-with-artifact-signing.yml.

  3. Salin templat alur kerja penandatanganan berikut ke dalam file Anda.

Perluas untuk menampilkan templat alur kerja penandatanganan.
# Build and push an image to Azure Container Registry, set up notation, and sign the image
name: notation-github-actions-sign-with-artifact-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-artifactsigning                     # name of Notation Artifact Signing plug-in; do not change
  PLUGIN_DOWNLOAD_URL: <plugin-download-url>            # example: "https://github.com/Azure/artifact-signing-notation-plugin/releases/download/v1.0.0/notation-azure-artifactsigning_1.0.0_linux_amd64.tar.gz"
  PLUGIN_CHECKSUM: <plugin-package-checksum>            # example: 2f45891a14aa9c88c9bee3d11a887c1adbe9d2d24e50de4bc4b4fa3fe595292f
  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
  AS_ACCOUNT_NAME: <artifact-signing-account-name>       # Artifact Signing account name
  AS_CERT_PROFILE: <artifact-signing-cert-profile-name>  # Artifact Signing certificate profile name 
  AS_ACCOUNT_URI: <artifact-signing-account-uri>         # Artifact 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 Artifact 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.AS_CERT_PROFILE }}
          target_artifact_reference: ${{ env.target_artifact_reference }}
          signature_format: cose
          plugin_config: |-
            accountName=${{ env.AS_ACCOUNT_NAME }}
            baseUrl=${{ env.AS_ACCOUNT_URI }}
            certProfile=${{ env.AS_CERT_PROFILE }}
          force_referrers_tag: 'false'

Catatan tentang variabel lingkungan:

  • PLUGIN_NAME: Selalu gunakan azure-artifactsigning.
  • PLUGIN_DOWNLOAD_URL: Dapatkan URL dari halaman rilis plugin Penandatanganan Artefak.
  • PLUGIN_CHECKSUM: Gunakan file checksum pada halaman rilis; misalnya, notation-azure-artifactsigning_<version>_checksums.txt.
  • AS_ACCOUNT_URI: Gunakan endpoint untuk akun Artifact Signing Anda, yang khusus untuk wilayahnya; contohnya, https://eus.codesigning.azure.net/.

Memulai alur kerja GitHub Actions

Sintaks on:push memicu alur kerja sampel. Menerapkan perubahan memulai alur kerja. Di bawah nama repositori GitHub Anda, pilih Tindakan untuk melihat log alur kerja.

Setelah berhasil, alur kerja membangun citra, membuahkannya ke Azure Container Registry, dan menandatanganinya dengan menggunakan Penandatanganan Artefak. Anda dapat melihat log alur kerja untuk mengonfirmasi bahwa azure-artifactsigning plug-in telah diinstal dan gambar berhasil ditandatangani.

Selain itu, Anda dapat membuka registri kontainer di portal Microsoft Azure. Buka Repositori, buka gambar Anda, lalu pilih Perujuk. Konfirmasikan bahwa artefak (tanda tangan) jenis application/vnd.cncf.notary.signature tercantum.