Sdílet prostřednictvím


Ověření 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.

Tuto příručku můžete použít ve dvou scénářích:

  • Využívání podepsaných imagí: Pomocí Notation a Důvěryhodného podepisování ověřte image kontejnerů, které už podepsaly jiné týmy nebo organizace.
  • Ověření vlastních imagí: Pokud publikujete obrázky sami, nejdřív je podepište pomocí pracovního postupu GitHubu nebo rozhraní příkazového řádku notace (CLI). Pak podle tohoto průvodce ověřte podpisy.

V tomto článku se naučíte:

  • Nakonfigurujte pracovní postup GitHubu.
  • Ověřte, že obrazy kontejnerů byly podepsány pomocí důvěryhodného podepisování a GitHub Actions pro Notaci.

Požadavky

  • Registr kontejnerů, který obsahuje podepsané obrazy.
  • Úložiště GitHubu pro ukládání souboru pracovního postupu, zásad důvěryhodnosti a úložiště důvěryhodnosti.

Ověřování z Azure na GitHub

Podle použití GitHub Actions pro připojení k Azure musíte před spuštěním příkazů Azure CLI nebo Azure PowerShellu nejprve provést ověření v Azure ve vašem pracovním postupu pomocí akce Přihlášení k Azure. 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 registrů, které nejsou povolené pomocí řízení přístupu na základě atributů (ABAC), přiřaďte AcrPull roli:

    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 Container Registry Repository Reader roli:

    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. 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)

Příprava úložiště důvěryhodných certifikátů a politiky důvěryhodnosti

Ověření vyžaduje, aby úložiště důvěry notářského projektu a zásady důvěry byly uloženy v úložišti.

Vytvořte úložiště důvěryhodnosti

Úložiště důvěryhodných certifikátů (.github/truststore/) obsahuje certifikáty certifikační autority (CA) a kořenové certifikáty TSA (Time Stamp Authority), které jsou potřeba k ověření.

Stáhněte důvěryhodný kořenový certifikát a uložte ho do ca adresáře:

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"

Stáhněte kořenový certifikát TSA důvěryhodného podepisování a uložte ho tsa do adresáře:

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"

Vytvoření zásady důvěryhodnosti

Zásady důvěryhodnosti (.github/trustpolicy/trustpolicy.json) definují, které identity a certifikační autority jsou důvěryhodné.

Tady je příklad trustpolicy.json. Nahraďte identifikátory URI úložiště, názvy úložišť důvěryhodných certifikátů a předmět profilu důvěryhodného podpisového certifikátu hodnotami.

{
 "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"
         ]
     }
 ]
}

Potvrďte adresářovou strukturu.

Úložiště by mělo vypadat jako v tomto příkladu:

.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

Vytvoření pracovního postupu GitHub Actions

Až bude konfigurace ověřování a důvěryhodnosti připravená, vytvořte pracovní postup:

  1. Vytvořte v úložišti adresář .github/workflows, pokud ještě neexistuje.

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

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

    Rozbalením zobrazíte šablonu pracovního postupu ověření.
    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. Aktualizujte proměnné prostředí vlastním registrem, úložištěm a značkou/otiskem obrazu. Uložte a potvrďte soubor.

Aktivace pracovního postupu GitHub Actions

Push notifikace aktivuje vzorový pracovní postup. Pokud chcete úlohu spustit, potvrďte soubor pracovního postupu do úložiště.

Můžete zobrazit protokoly pracovního postupu a potvrdit, že úloha byla úspěšně dokončena. Zkontrolujte například import zásad důvěryhodnosti, načtou se certifikáty z úložiště důvěryhodnosti a ověří se podpis.