Udostępnij przez


Podpisywanie obrazów kontenerów przy użyciu notacji i podpisywania artefaktów

Ten artykuł jest częścią serii dotyczącej zapewniania integralności i autentyczności obrazów kontenerów oraz innych artefaktów Open Container Initiative (OCI). Aby uzyskać pełny obraz, zacznij od omówienia, co wyjaśnia, dlaczego podpisywanie ma znaczenie i przedstawia różne scenariusze.

Ten artykuł koncentruje się na podpisywaniu przy użyciu narzędzi Notary Project, Notation i Artifact Signing:

  • Dowiesz się tutaj: Jak używać interfejsu wiersza polecenia Notation do podpisywania artefaktów.
  • Gdzie pasuje: Podpisywanie artefaktów jest alternatywą dla usługi Azure Key Vault. Mimo że usługa Key Vault zapewnia organizacjom pełną kontrolę nad zarządzaniem cyklem życia certyfikatów, podpisywanie artefaktów zapewnia usprawnione środowisko podpisywania z bezobsługowym zarządzaniem cyklem życia certyfikatów i krótkotrwałymi certyfikatami.
  • Dlaczego ma to znaczenie: Podpisywanie artefaktów upraszcza doświadczenie deweloperów, zapewniając jednocześnie silne uwierzytelnienie tożsamości. Pomaga zespołom zmniejszyć złożoność operacyjną bez naruszania zabezpieczeń.

Wymagania wstępne

Aby można było podpisać i zweryfikować obrazy kontenerów przy użyciu notacji i podpisywania artefaktów, należy skonfigurować wymagane zasoby platformy Azure i zainstalować niezbędne narzędzia. W tej sekcji opisano proces przygotowania usługi Azure Container Registry, konfigurowania podpisywania artefaktów oraz ustawiania interfejsu wiersza polecenia platformy Azure jako środowiska programistycznego.

Przygotowywanie obrazów kontenerów w usłudze Azure Container Registry

  1. Utwórz lub użyj rejestru kontenerów do przechowywania obrazów kontenerów, artefaktów OCI i podpisów.
  2. Wgraj lub użyj obrazu kontenera w rejestrze kontenerów.

Konfigurowanie podpisywania artefaktów

Skonfiguruj konto podpisywania artefaktów i profil certyfikatu w ramach subskrypcji platformy Azure.

Profil certyfikatu musi zawierać kraj/region (C), stan lub prowincję (ST lub S) oraz organizację (O) w temacie certyfikatu. Specyfikacja projektu Notary wymaga tych pól.

Konfigurowanie Azure CLI

Zainstaluj interfejs wiersza polecenia platformy Azure lub użyj usługi Azure Cloud Shell.

Zainstaluj Notation CLI i wtyczkę do podpisywania artefaktów

Ten przewodnik uruchamia polecenia w systemach Linux AMD64 i Windows jako przykłady.

  1. Zainstaluj Notation CLI w wersji 1.3.2:

    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.3.2/notation_1.3.2_linux_amd64.tar.gz
    # Validate the checksum
    EXPECTED_SHA256SUM="e1a0f060308086bf8020b2d31defb7c5348f133ca0dba6a1a7820ef3cbb6dfe5"
    echo "$EXPECTED_SHA256SUM  notation.tar.gz" | sha256sum -c -
    # Continue if sha256sum matches
    tar xvzf notation.tar.gz
    cp ./notation /usr/local/bin
    

    W przypadku innych platform zobacz Przewodnik instalacji notacji.

  2. Zainstaluj wtyczkę do podpisywania artefaktów:

    notation plugin install --url "https://github.com/Azure/artifact-signing-notation-plugin/releases/download/v1.0.0/notation-azure-artifactsigning_1.0.0_linux_amd64.tar.gz" --sha256sum 2f45891a14aa9c88c9bee3d11a887c1adbe9d2d24e50de4bc4b4fa3fe595292f
    

    Znajdź najnowszy adres URL wtyczki i sumę kontrolną na stronie wydania.

  3. Sprawdź instalację wtyczki:

    notation plugin ls
    

    Przykładowy wynik:

    NAME                    DESCRIPTION                                             VERSION   CAPABILITIES                ERROR
    azure-artifactsigning   Sign OCI artifacts using the Artifact Signing Service   1.0.0     [SIGNATURE_GENERATOR.RAW]   <nil>
    

Skonfiguruj zmienne środowiskowe

Ustaw następujące zmienne środowiskowe do użycia w kolejnych poleceniach. Zastąp symbole zastępcze rzeczywistymi wartościami.

Wymagane wartości można znaleźć w witrynie Azure Portal:

  • Dla informacji o koncie podpisywania artefaktu przejdź do swojego konta, a następnie wybierz pozycję Przegląd.
  • Aby uzyskać informacje o profilu certyfikatu, przejdź do konta, a następnie wybierz pozycję Obiekty>Profile certyfikatów.
# Artifact Signing environment variables
AS_SUB_ID="<subscription-id>"
AS_ACCT_RG=<ts-account-resource-group>
AS_ACCT_NAME=<ts-account-name>
AS_ACCT_URL=<ts-account-url>
AS_CERT_PROFILE=<ts-cert-profile>
AS_CERT_SUBJECT=<ts-cert-subject>
AS_SIGNING_ROOT_CERT="https://www.microsoft.com/pkiops/certs/Microsoft%20Enterprise%20Identity%20Verification%20Root%20Certificate%20Authority%202020.crt"
AS_TSA_URL="http://timestamp.acs.microsoft.com/"
AS_TSA_ROOT_CERT="http://www.microsoft.com/pkiops/certs/microsoft%20identity%20verification%20root%20certificate%20authority%202020.crt"

# Azure Container Registry and image environment variables
ACR_SUB_ID="<acr-subscription-id>"
ACR_RG=<acr-resource-group>
ACR_NAME=<registry-name>
ACR_LOGIN_SERVER=$ACR_NAME.azurecr.io
REPOSITORY=<repository>
TAG=<tag>
IMAGE=$ACR_LOGIN_SERVER/${REPOSITORY}:$TAG

Zaloguj się do Azure

Użyj interfejsu wiersza polecenia platformy Azure, aby zalogować się przy użyciu tożsamości użytkownika:

az login
USER_ID=$(az ad signed-in-user show --query id -o tsv)

Uwaga / Notatka

W tym przewodniku przedstawiono logowanie się przy użyciu konta użytkownika. Aby uzyskać informacje o innych opcjach tożsamości, w tym tożsamości zarządzanej, zobacz Uwierzytelnianie na platformie Azure przy użyciu interfejsu wiersza polecenia platformy Azure.

Przypisywanie uprawnień do usługi Azure Container Registry i podpisywania artefaktów

Przypisz tożsamości niezbędne role do uzyskania dostępu do Container Registry.

  • W przypadku rejestrów z włączoną kontrolą dostępu opartą na atrybutach (ABAC) przypisz:
    • Container Registry Repository Reader
    • Container Registry Repository Writer
  • W przypadku rejestrów innych niż ABAC przypisz:
    • AcrPull
    • AcrPush
az role assignment create --role "Container Registry Repository Reader" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
az role assignment create --role "Container Registry Repository Writer" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"

Przypisz rolę Artifact Signing Certificate Profile Signer do swojej tożsamości, aby można było podpisać przy użyciu podpisywania artefaktu:

az role assignment create --assignee $USER_ID --role "Artifact Signing Certificate Profile Signer" --scope "/subscriptions/$AS_SUB_ID/resourceGroups/$AS_ACCT_RG/providers/Microsoft.CodeSigning/codeSigningAccounts/$AS_ACCT_NAME/certificateProfiles/$AS_CERT_PROFILE"

Podpisz obraz kontenera

# Authenticate to Azure Container Registry
az acr login --name $ACR_NAME

# Download the timestamping root certificate
curl -o msft-tsa-root-certificate-authority-2020.crt $AS_TSA_ROOT_CERT

# Sign the image
notation sign --signature-format cose --timestamp-url $AS_TSA_URL --timestamp-root-cert "msft-tsa-root-certificate-authority-2020.crt" --id $AS_CERT_PROFILE --plugin azure-artifactsigning --plugin-config accountName=$AS_ACCT_NAME --plugin-config baseUrl=$AS_ACCT_URL --plugin-config certProfile=$AS_CERT_PROFILE $IMAGE

Objaśniono flagi kluczy:

  • --signature-format cose: używa formatu podpisywania i szyfrowania obiektów CBOR (COSE) dla podpisów.
  • --timestamp-url: używa serwera znacznika czasu obsługiwanego przez podpisywanie artefaktów.
  • --plugin-config: przekazuje konfigurację do wtyczki do podpisywania artefaktów.

Wylistuj podpisane obrazy i podpisy

notation ls $IMAGE

Przykładowy wynik:

myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
└── application/vnd.cncf.notary.signature
    └── sha256:d3a4c9fbc17e27b19a0b28e7b6a33f2c0f541dbdf8d2e5e8d0d79a835e8a76f2a

Weryfikowanie obrazu kontenera

  1. Pobierz i dodaj certyfikaty główne:

    curl -o msft-root-certificate-authority-2020.crt $AS_SIGNING_ROOT_CERT
    SIGNING_TRUST_STORE="myRootCerts"
    notation cert add --type ca --store $SIGNING_TRUST_STORE msft-root-certificate-authority-2020.crt
    
    curl -o msft-tsa-root-certificate-authority-2020.crt $AS_TSA_ROOT_CERT
    TSA_TRUST_STORE="myTsaRootCerts"
    notation cert add -t tsa -s $TSA_TRUST_STORE msft-tsa-root-certificate-authority-2020.crt
    notation cert ls
    

  1. Utwórz plik JSON zasad zaufania:

    cat <<EOF > trustpolicy.json
    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "myPolicy",
                "registryScopes": [ "$ACR_LOGIN_SERVER/$REPOSITORY" ],
                "signatureVerification": {
                    "level" : "strict"
                },
                "trustStores": [ "ca:$SIGNING_TRUST_STORE", "tsa:$TSA_TRUST_STORE" ],
                "trustedIdentities": [
                    "x509.subject: $AS_CERT_SUBJECT"
                ]
            }
        ]
    }
    EOF
    

    Zaimportuj i sprawdź zasady:

    notation policy import trustpolicy.json
    notation policy show
    

  1. Sprawdź obraz:

    notation verify $IMAGE
    

    Przykładowy wynik:

    Successfully verified signature for myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
    

    Jeśli weryfikacja nie powiedzie się, upewnij się, że zasady zaufania i certyfikaty są poprawnie skonfigurowane.