Udostępnij za pośrednictwem


Podpisywanie i weryfikowanie obrazu kontenera za pomocą notacji w usłudze Azure Pipeline

Zadanie Notation w usłudze Azure DevOps to wbudowane zadanie do logowania i weryfikowania obrazów kontenerów oraz innych artefaktów open container Initiative (OCI) w usłudze Azure Pipeline. Zadanie Notation używa interfejsu wiersza polecenia notacji do wykonywania tych operacji, zapewniając, że artefakty są podpisane przez zaufaną jednostkę i nie zostały naruszone od czasu ich utworzenia.

W tym artykule opisano proces tworzenia potoku platformy Azure, który tworzy obraz kontenera, wypycha go do usługi ACR i dodaje podpisy przy użyciu notacji i wtyczki usługi Azure Key Vault zapewniającej warstwę zabezpieczeń i integralności artefaktów. Celem potoku jest:

  1. Skompiluj obraz kontenera i wypchnij go do usługi Azure Container Registry (ACR).
  2. Podpisz obraz za pomocą wtyczki Notation and Notation usługi Azure Key Vault. Podpis jest następnie automatycznie wypychany do usługi ACR.

Wymagania wstępne

  • Utwórz usługę Key Vault w usłudze Azure Key Vault i wygeneruj klucz podpisywania z podpisem własnym i certyfikat. Ten dokument służy do tworzenia klucza z podpisem własnym i certyfikatu na potrzeby testowania. Jeśli masz certyfikat wystawiony przez urząd certyfikacji, zapoznaj się z tym dokumentem , aby uzyskać szczegółowe informacje.
  • Utwórz rejestr w usłudze Azure Container Registry (ACR).
  • Upewnij się, że masz repozytorium usługi Azure DevOps lub repozytorium GitHub.

Tworzenie Połączenie usługi

Utwórz połączenie usługi w usłudze Azure Pipelines, które umożliwia potokowi dostęp do usług zewnętrznych, takich jak Azure Container Registry (ACR), możesz wykonać następujące kroki:

  • Podpisywanie obrazu w usłudze Azure Container Registry (ACR) przy użyciu poświadczeń usługi ACR.

  • Użyj zadania platformy Docker w usłudze Azure Pipelines, aby zalogować się do usługi ACR. Zadanie platformy Docker to wbudowane zadanie w usłudze Azure Pipelines, które umożliwia między innymi kompilowanie, wypychanie i ściąganie obrazów platformy Docker.

  • Ustanów połączenie usługi Rejestru platformy Docker w usłudze Azure Pipeline, aby udzielić zadań notacji dostępu do rejestru usługi ACR w następujący sposób:

    1. Zaloguj się do organizacji (https://dev.azure.com/{yourorganization}) i wybierz projekt.
    2. Wybierz przycisk Ustawienia w lewym dolnym rogu.
    3. Przejdź do pozycji Potoki, a następnie wybierz pozycję Połączenie z usługą.
    4. Wybierz pozycję Nowe połączenie z usługą i wybierz pozycję Rejestr platformy Docker.
    5. Następnie wybierz pozycję Azure Container Registry.
    6. Wybierz pozycję Jednostka usługi w typieuwierzytelniania i wprowadź szczegóły jednostki usługi, w tym subskrypcję platformy Azure i rejestr usługi ACR.
    7. Wprowadź przyjazną dla użytkownika nazwę Połączenie ion, która ma być używana podczas odwoływania się do tego połączenia z usługą.
  • Utwórz połączenie usługi Azure Resource Manager w usłudze Azure Pipelines, aby autoryzować dostęp do usługi Azure Key Vault:

    1. Wybierz pozycję Jednostka usługi (automatyczna)..
    2. Następnie wybierz pozycję Subskrypcja i znajdź swoją subskrypcję platformy Azure z listy rozwijanej.
    3. Wybierz dostępną grupę zasobów z listy rozwijanej.
    4. Wprowadź przyjazną dla użytkownika nazwę połączenia usługi, która ma być używana podczas odwoływania się do tego połączenia z usługą.
    5. Zapisz go, aby zakończyć tworzenie.
  • Udziel zasad dostępu jednostce usługi, wykonując następujące kroki:

    1. Otwórz utworzone połączenie usługi Azure Resource Manager i kliknij pozycję Zarządzaj jednostką usługi, aby wprowadzić portal jednostki usługi platformy Azure.
    2. Skopiuj element Application (client) ID. Zostanie ona użyta do udzielenia uprawnień dla jednostki usługi.
    3. Otwórz portal usługi Azure Key Vault i wprowadź stronę Zasady dostępu.
    4. Utwórz nowe zasady dostępu z uprawnieniami key signsecret get i certificate get .
    5. Udziel tym nowym zasadom dostępu do jednostki usługi przy użyciu Application (client) ID wklejania z poprzedniego kroku.
    6. Zapisz go, aby zakończyć tworzenie.

Dowiedz się więcej o połączeniu z usługą tutaj.

Tworzenie potoku i używanie zadania Notation

Utwórz potok platformy Azure dla repozytorium git, wykonując następujące kroki:

  1. Przejdź do projektu w organizacji AOD.
  2. Przejdź do pozycji Potoki z menu po lewej stronie, a następnie wybierz pozycję Nowy potok.
  3. Wybierz repozytorium git. Do celów demonstracyjnych używamy repozytorium Usługi Azure DevOps.
  4. Skonfiguruj potok przy użyciu potoku początkowego, jeśli dopiero zaczynasz korzystać z usługi Azure DevOps. Przejrzyj i utwórz potok, klikając pozycję Zapisz i uruchom.

Uwaga

W przykładzie przyjęto założenie, że gałąź domyślna to main. Jeśli tak nie jest, postępuj zgodnie z przewodnikiem , aby zaktualizować gałąź domyślną.

Istnieją dwa sposoby dodawania zadań notacji przez edytowanie potoku platformy Azure:

Użyj panelu Azure DevOps (ADO): panel ADO udostępnia interfejs użytkownika, w którym można dodawać zadania do potoku. Możesz wyszukać zadania notacji i dodać je do potoku przy użyciu tego interfejsu.

Skopiuj z przykładowego pliku usługi Azure Pipeline: jeśli masz przykładowy plik usługi Azure Pipeline, który zawiera już zadania notacji, możesz skopiować te zadania z przykładowego pliku i wkleić je do pliku potoku.

Opcja 1. Korzystanie z panelu edycji usługi Azure DevOps (ADO)

Przeszukaj Docker zadanie z panelu edycji potoku po prawej stronie. Użyj polecenia login z połączeniem usługi Docker Registry, aby uwierzytelnić się za pomocą usługi ACR.

  1. Wybierz połączenie usługi Rejestru platformy Docker utworzone w poprzednim kroku z listy rozwijanej Rejestr kontenerów.
  2. Wybierz login z listy rozwijanej Polecenie .
  3. Kliknij przycisk Dodaj , aby dodać zadanie platformy Docker za pomocą login polecenia do pliku potoku w lewo.

Podobnie ponownie przeszukaj Docker zadanie z panelu edycji potoku. Użyj polecenia buildAndPush , aby automatycznie skompilować kod źródłowy do obrazu i wypchnąć go do docelowego repozytorium usługi ACR. Spowoduje to wygenerowanie skrótu obrazu, który będzie używany do logowania w następnym kroku.

  1. Wprowadź nazwę repozytorium w repozytorium kontenerów.
  2. Wybierz pozycję buildAndPush z listy rozwijanej Polecenie .
  3. Określ ścieżkę pliku pliku dockerfile. Na przykład użyj ./Dockerfile polecenia , jeśli plik Dockerfile jest przechowywany w folderze głównym.
  4. Kliknij przycisk Dodaj , aby dodać zadanie platformy Docker za pomocą buildAndPush polecenia do pliku potoku w lewo.

Przeszukaj Notation zadanie z panelu edycji potoku po prawej stronie.

  1. Wybierz pozycję Zainstaluj z listy rozwijanej polecenie, aby uruchomić polecenie.
  2. Kliknij przycisk Dodaj , aby dodać notation install zadanie do potoku.
  3. Podobnie ponownie przeszukaj Notation zadanie z panelu edycji potoku i wybierz pozycję Podpisz.
  4. Odwołania do artefaktu można pominąć, ponieważ podpisujemy obraz przy użyciu jego najnowszego skrótu skompilowanego i wypchniętego do rejestru przez zadanie platformy Docker. Zamiast tego można ręcznie określić skrót przy użyciu polecenia <registry_host>/<repository>@<digest>.
  5. Wypełnij konfigurację wtyczki w formularzu. Użyjemy domyślnej wtyczki AKV i połączenia usługi utworzonego w poprzednim kroku. Skopiuj swój identyfikator klucza z usługi AKV do identyfikatora klucza.
  6. Zaznacz pole Certyfikat z podpisem własnym, ponieważ używamy certyfikatu z podpisem własnym dla wygody demonstracyjnej. Zamiast tego możesz wprowadzić ścieżkę pliku certyfikatu w ścieżce pliku pakietu certyfikatów, jeśli chcesz użyć wystawionego certyfikatu urzędu certyfikacji.
  7. Kliknij przycisk Dodaj , aby dodać element notation sign do pliku potoku po lewej stronie.

Opcja 2. Edytowanie przykładowego pliku usługi Azure Pipeline

  1. Jeśli znasz usługi Azure Pipelines i Notation, efektywne jest rozpoczęcie od pliku potoku szablonu.
  2. Skopiuj szablon potoku podany w dokumencie do własnego pliku potoku. Ten szablon jest przeznaczony do używania zadań notacji, które są używane do podpisywania i weryfikowania obrazów kontenerów.
  3. Po skopiowaniu szablonu wypełnij wymagane wartości zgodnie z poniższymi odwołaniami i komentarzami.
Zobacz szablon zadania podpisywania opcji 1 (kliknij tutaj).
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

Uwaga

Oprócz używania zadania platformy Docker można podpisać określony skrót obrazu, ręcznie określając odwołanie do artefaktu w następujący artifactRefs sposób.

Zobacz przykład (kliknij tutaj).
# 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

Wyzwalanie potoku

Wykonaj kroki, aby uruchomić potok w usłudze Azure DevOps i zweryfikować jego wykonanie.

  1. Po wypełnieniu danych wejściowych w potoku zapisz i uruchom go, aby wyzwolić potok.
  2. Przejdź do strony Zadanie uruchomionego potoku. W tym miejscu można zobaczyć wykonanie każdego kroku. Ten potok skompiluje i podpisze najnowszą kompilację lub określony skrót, a następnie wypchnie podpisany obraz wraz ze skojarzonym podpisem do rejestru.
  3. Po pomyślnym wykonaniu można zobaczyć obraz wypchnięty do usługi Azure Container Registry (ACR) z dołączonym podpisem formatu CBOR Object Signing and Encryption (COSE).

Weryfikowanie podpisanego obrazu

Podobnie, aby zweryfikować podpisany obraz, możesz użyć panelu edycji lub edytować plik potoku, aby dodać zadanie notacji verify do potoku. Potok zweryfikuje podpisany obraz z podanymi zasadami zaufania i magazynem zaufania.

Przygotowywanie zasad zaufania notacji i magazynu zaufania

Ogólnie rzecz biorąc, weryfikator różni się od elementu podpisującego. W celach demonstracyjnych używamy tego samego potoku i repozytorium ADO w tym przykładzie. Wykonaj poniższe kroki, aby utworzyć zasady zaufania notacji, magazyn zaufania i dodać verify zadanie w potoku:

  1. W bieżącym repozytorium ADO utwórz przykładowy folder .pipeline do przechowywania zasad .pipeline/trustpolicy/zaufania notacji . Utwórz przykładowy plik trustpolicy.jsonJSON zasad zaufania. Wypełnij szablon zasad zaufania własnymi wartościami i zapisz go w folderze.

Uwaga

Należy pamiętać, że magazyn zaufania notacji obsługuje obecnie trzy rodzaje tożsamości, w tym urząd certyfikacji, podpisywanieAuthority i certyfikaty główne urzędu sygnatury czasowej (TSA). W celach demonstracyjnych używamy urzędu x509/ca certyfikacji w zasadach zaufania i magazynie zaufania poniżej. Aby uzyskać szczegółowe informacje, zobacz magazyn zaufania.

Zobacz szablon zasad zaufania (kliknij tutaj).
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "<yourPolicyName>",
            "registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
            "signatureVerification": {
                "level" : "strict" 
            },
            "trustStores": [ "ca:<yourTrustStore>"],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
  1. W bieżącym repozytorium ADO utwórz nowy folder dla magazynu /.pipeline/truststore/x509/ca/$<yourTrustStore>/ zaufania notation w celu przechowywania certyfikatu. Jeśli wykonano kroki podpisywania w tym dokumencie, aby podpisać obraz, użyj poniższego polecenia, aby pobrać certyfikat z podpisem własnym z usługi Azure Key Vault (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. Przekaż certyfikat do folderu /.pipeline/truststore/x509/ca/$<yourTrustStore>/ magazynu zaufania utworzonego w ostatnim kroku.

Dodawanie zadania weryfikacji notacji

  1. Ponownie przeszukaj zadanie Notation z panelu edycji potoku i wybierz pozycję Weryfikuj.
  2. Wypełnij odwołania do artefaktu skrótem podpisanego obrazu.
  3. Wprowadź wartość .pipeline/trustpolicy/trustpolicy.json w ścieżce pliku zasad zaufania.
  4. Wprowadź wartość .pipeline/truststore/ w ścieżce folderu magazynu zaufania.
  5. Kliknij przycisk Dodaj, aby dodać weryfikację notacji do pliku potoku w lewo.

Zostanie notation verify zapisany w następujący sposób.

Zobacz przykład (kliknij tutaj).
# sign the artifact
- task: Notation@0
  inputs:
    command: 'verify'
    artifactRefs: '<registry_host>/<repository>@<digest>'
    trustPolicy: .pipeline/trustpolicy.json
    trustStore: .pipeline/truststore/

Wyzwalanie potoku (zaktualizowane)

Potok można wyzwolić ponownie, aby zweryfikować podpisany obraz. Po pomyślnym wykonaniu dzienniki można wyświetlić na stronie Zadanie uruchomionego potoku. Potok zweryfikuje podpisany obraz z podanymi zasadami zaufania i magazynem zaufania.

Podsumowanie

W tym artykule pokazano, jak podpisać i zweryfikować obraz kontenera za pomocą notacji w usłudze Azure Pipeline. Możesz użyć panelu Usługi Azure DevOps lub edytować plik potoku, aby dodać zadania notacji do potoku. Potok będzie kompilować, wypychać, podpisywać i weryfikować obraz przy użyciu podanych zasad zaufania i magazynu zaufania. Ten proces gwarantuje, że artefakty są podpisane przez zaufaną jednostkę i nie zostały naruszone od czasu ich utworzenia.