Freigeben über


Überprüfen von Containerimages in GitHub-Workflows mithilfe von Notation und vertrauenswürdiger Signatur

Dieser Artikel ist Teil einer Reihe zur Sicherstellung der Integrität und Authentizität von Containerimages und anderen Open Container Initiative (OCI)-Artefakten. Für einen vollständigen Überblick beginnen Sie mit der Übersicht, in der erklärt wird, warum das Signieren wichtig ist und die verschiedenen Szenarien skizziert werden.

Sie können dieses Handbuch in zwei Szenarien verwenden:

  • Verwenden signierter Images: Überprüfen Sie Containerimages, die von anderen Teams oder Organisationen bereits mit Notation und vertrauenswürdiger Signatur signiert wurden.
  • Überprüfen Ihrer eigenen Bilder: Wenn Sie Bilder selbst veröffentlichen, signieren Sie sie zuerst mit einem GitHub-Workflow oder der Notation-Befehlszeilenschnittstelle (CLI). Folgen Sie dann diesem Leitfaden, um die Signaturen zu überprüfen.

In diesem Artikel erfahren Sie, wie Sie:

  • Konfigurieren sie einen GitHub-Workflow.
  • Überprüfen Sie, ob Container-Abbilder mithilfe vertrauenswürdiger Signierung und GitHub Actions für Notation signiert wurden.

Voraussetzungen

  • Eine Containerregistrierung , die signierte Images enthält.
  • Ein GitHub-Repository zum Speichern Der Workflowdatei, der Vertrauensrichtlinie und des Vertrauensspeichers.

Authentifizieren von Azure auf GitHub

Gemäß der Verwendung von GitHub-Aktionen zum Herstellen einer Verbindung mit Azure müssen Sie sich zuerst mit Azure in Ihrem Workflow authentifizieren, indem Sie die Azure-Anmeldeaktion verwenden, bevor Sie Azure CLI- oder Azure PowerShell-Befehle ausführen. Die Azure-Anmeldeaktion unterstützt mehrere Authentifizierungsmethoden.

In diesem Leitfaden melden Sie sich mit OpenID Connect (OIDC) an, verwenden eine vom Benutzer zugewiesene verwaltete Identität, und führen Sie die Schritte unter Verwenden der Azure-Anmeldeaktion mit OpenID Connect aus.

  1. Erstellen Sie eine benutzerseitig zugewiesene verwaltete Identität. Überspringen Sie diesen Schritt, wenn Sie über eine vorhandene verwaltete Identität verfügen.

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

  1. Rufen Sie die Client-ID Ihrer verwalteten Identität ab:

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

  1. Weisen Sie der verwalteten Identität Rollen für den Zugriff auf die Azure-Containerregistrierung zu.

    Weisen Sie für Registrierungen, die nicht mit attributbasierter Zugriffssteuerung (ABAC) aktiviert sind, die AcrPull Rolle zu:

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

    Weisen Sie für ABAC-fähige Registrierungen die Container Registry Repository Reader Rolle zu:

    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. Konfigurieren Sie GitHub, um Ihrer Identität zu vertrauen. Folgen Sie der Konfiguration einer vom Benutzer zugewiesenen verwalteten Identität, um einem externen Identitätsanbieter zu vertrauen.

  2. Erstellen Sie GitHub-Geheimnisse, indem Sie geheime Schlüssel für ein Repository erstellen.

    Ordnen Sie die verwalteten Identitätswerte diesen geheimen Schlüsseln zu:

    GitHub-Geheimnis Verwalteter Identitätswert
    AZURE_CLIENT_ID Kunden-ID
    AZURE_SUBSCRIPTION_ID Abonnement-ID
    AZURE_TENANT_ID Verzeichnis-ID (Mandant)

Vorbereitungen für Vertrauensspeicher und Vertrauensrichtlinie

Die Überprüfung erfordert einen Notary Project-Vertrauensspeicher und eine Vertrauensstellungsrichtlinie, in Ihrem Repository eingecheckt.

Erstellen des Vertrauensspeichers

Der Vertrauensspeicher (.github/truststore/) enthält die Zertifikate der Zertifizierungsstelle und die TSA-Stammzertifikate (Time Stamp Authority), die für die Überprüfung erforderlich sind.

Laden Sie das Stammzertifikat der vertrauenswürdigen Signatur herunter , und speichern Sie es im ca Verzeichnis:

curl -o .github/truststore/x509/ca/mycerts/msft-identity-verification-root-cert-2020.crt \
    "https://www.microsoft.com/pkiops/certs/Microsoft%20Enterprise%20Identity%20Verification%20Root%20Certificate%20Authority%202020.crt"

Laden Sie das Stammzertifikat für vertrauenswürdige Signatur-TSA herunter, und speichern Sie es im tsa Verzeichnis:

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

Erstellen der Vertrauensrichtlinie

Die Vertrauensrichtlinie (.github/trustpolicy/trustpolicy.json) definiert, welche Identitäten und CAs vertrauenswürdig sind.

Hier ist ein Beispiel für trustpolicy.json. Ersetzen Sie Repository-URIs, Namen des Vertrauensspeichers und den Betreff des vertrauenswürdigen Signaturzertifikats durch Ihre Werte.

{
 "version": "1.0",
 "trustPolicies": [
    {
         "name": "mypolicy",
         "registryScopes": [ "myregistry.azurecr.io/myrepo1","myregistry.azurecr.io/myrepo2" ],
         "signatureVerification": {
             "level" : "strict"
         },
         "trustStores": [ "ca:mycerts", "tsa:mytsacerts" ],
         "trustedIdentities": [
           "x509.subject: C=US, ST=WA, L=Seattle, O=MyCompany.io, OU=Tools"
         ]
     }
 ]
}

Bestätigen der Verzeichnisstruktur

Ihr Repository sollte wie in diesem Beispiel aussehen:

.github/
├── trustpolicy/
│   └── trustpolicy.json
└── truststore/
    └── x509/
        ├── ca/
        │   └── mycerts/
        │       └── msft-identity-verification-root-cert-2020.crt
        └── tsa/
            └── mytsacerts/
                └── msft-identity-verification-tsa-root-cert-2020.crt

Erstellen des GitHub-Aktionsworkflows

Wenn die Authentifizierungs- und Vertrauenskonfiguration bereit ist, erstellen Sie den Workflow:

  1. Erstellen Sie ein .github/workflows Verzeichnis in Ihrem Repository, wenn es nicht vorhanden ist.

  2. Erstellen einer neuen Workflowdatei; beispiel: verify-with-trusted-signing.yml.

  3. Kopieren Sie die folgende Workflowvorlage in Ihre Datei.

    Erweitern, um die Workflowvorlage für die Überprüfung anzuzeigen.
    name: notation-verify-with-trusted-signing
    
    on:
      push:
    
    env:
      ACR_LOGIN_SERVER: <registry-name>.azurecr.io                      # example: myRegistry.azurecr.io
      ACR_REPO_NAME: <repository-name>                                  # example: myRepo
      IMAGE_TAG: <image-tag>                                            # example: v1
      #IMAGE_DIGEST: <image-digest>                                     # example: sha256:xxx
    jobs:
      notation-verify:
        runs-on: ubuntu-latest
        permissions:
          id-token: write
          contents: read
        steps:
          - name: Checkout
            uses: actions/checkout@v3
          # 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 }}
    
          # Set up the Notation CLI
          - name: setup notation
            uses: notaryproject/notation-action/setup@v1.2.2
    
          # Verify the OCI artifact, such as container images
          - name: verify OCI artifact
            uses: notaryproject/notation-action/verify@v1
            with:
              target_artifact_reference: ${{ env.ACR_LOGIN_SERVER }}/${{ env.ACR_REPO_NAME }}:${{ env.IMAGE_TAG }}
              # Alternatively, use the image digest
              # target_artifact_reference: ${{ env.ACR_LOGIN_SERVER }}/${{ env.ACR_REPO_NAME }}@${{ env.IMAGE_DIGEST }}
              trust_policy: .github/trustpolicy/trustpolicy.json
              trust_store: .github/truststore
    
  4. Aktualisieren Sie die Umgebungsvariablen mit Ihrem eigenen Registry, Repository und Image-Tag/Digest. Speichern und committen Sie die Datei.

Auslösen des GitHub-Aktionsworkflows

Ein Push löst den Beispielworkflow aus. Um den Auftrag zu starten, übernehmen Sie die Workflowdatei in Ihr Repository.

Sie können die Workflowprotokolle anzeigen, um zu bestätigen, dass der Auftrag erfolgreich abgeschlossen wurde. Überprüfen Sie beispielsweise, ob die Vertrauensrichtlinie importiert wird, Zertifikate aus dem Vertrauensspeicher geladen werden und die Signatur überprüft wird.