Udostępnij za pośrednictwem


Podpisywanie obrazów kontenerów za pomocą notacji i usługi Azure Key Vault przy użyciu certyfikatu wystawionego przez urząd certyfikacji

Podpisywanie i weryfikowanie obrazów kontenerów przy użyciu certyfikatu wystawionego przez zaufany urząd certyfikacji (CA) jest cenną praktyką zabezpieczeń. Ta miara zabezpieczeń ułatwia odpowiedzialne identyfikowanie, autoryzowanie i weryfikowanie tożsamości zarówno wydawcy obrazu kontenera, jak i samego obrazu kontenera. Zaufane urzędy certyfikacji(CA), takie jak GlobalSign, DigiCert, i inne odgrywają kluczową rolę w weryfikacji tożsamości użytkownika lub organizacji, utrzymania bezpieczeństwa certyfikatów cyfrowych i natychmiastowego cofnięcia certyfikatu na wszelkie ryzyko lub niewłaściwe użycie.

Poniżej przedstawiono kilka podstawowych składników, które ułatwiają podpisywanie i weryfikowanie obrazów kontenerów przy użyciu certyfikatu wystawionego przez zaufany urząd certyfikacji:

  • Notacja to narzędzie zabezpieczeń łańcucha dostaw typu open source opracowane przez społeczność notary Project i wspierane przez firmę Microsoft, które obsługuje podpisywanie i weryfikowanie obrazów kontenerów i innych artefaktów.
  • Usługa Azure Key Vault (AKV) oparta na chmurze służąca do zarządzania kluczami kryptograficznymi, wpisami tajnymi i certyfikatami ułatwia bezpieczne przechowywanie certyfikatu i zarządzanie nim przy użyciu klucza podpisywania.
  • Wtyczka AKV Notation azure-kv, rozszerzenie Notation używa kluczy przechowywanych w usłudze Azure Key Vault do podpisywania i weryfikowania podpisów cyfrowych obrazów kontenerów i artefaktów.
  • Usługa Azure Container Registry (ACR) umożliwia dołączanie tych podpisów do podpisanego obrazu i ułatwia przechowywanie tych obrazów kontenerów i zarządzanie nimi.

Po zweryfikowaniu obrazu podpis jest używany do weryfikowania integralności obrazu i tożsamości użytkownika podpis. Pomaga to zagwarantować, że obrazy kontenerów nie zostaną naruszone i pochodzą z zaufanego źródła.

W tym artykule:

  • Instalowanie interfejsu wiersza polecenia notacji i wtyczki AKV
  • Tworzenie lub importowanie certyfikatu wystawionego przez urząd certyfikacji w usłudze AKV
  • Kompilowanie i wypychanie obrazu kontenera za pomocą zadania usługi ACR
  • Podpisywanie obrazu kontenera przy użyciu interfejsu wiersza polecenia notacji i wtyczki AKV
  • Weryfikowanie podpisu obrazu kontenera za pomocą interfejsu wiersza polecenia notacji
  • Znaczniki czasu

Wymagania wstępne

Uwaga

Zalecamy utworzenie nowej usługi Azure Key Vault do przechowywania tylko certyfikatów.

Instalowanie interfejsu wiersza polecenia notacji i wtyczki AKV

  1. Zainstaluj notację w wersji 1.2.0 w środowisku systemu Linux amd64. Postępuj zgodnie z przewodnikiem instalacji notacji, aby pobrać pakiet dla innych środowisk.

    # Download, extract and install
    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.2.0/notation_1.2.0_linux_amd64.tar.gz
    tar xvzf notation.tar.gz
    
    # Copy the notation cli to the desired bin directory in your PATH, for example
    cp ./notation /usr/local/bin
    
  2. Zainstaluj wtyczkę azure-kv Notation Azure Key Vault w wersji 1.2.0 w środowisku systemu Linux amd64.

    Uwaga

    Adres URL i sumę kontrolną SHA256 dla wtyczki Notation Azure Key Vault można znaleźć na stronie wydania wtyczki.

    notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.2.0/notation-azure-kv_1.2.0_linux_amd64.tar.gz --sha256sum 06bb5198af31ce11b08c4557ae4c2cbfb09878dfa6b637b7407ebc2d57b87b34
    
  3. Wyświetl listę dostępnych wtyczek i upewnij się, że wtyczka azure-kv z wersją 1.2.0 znajduje się na liście.

    notation plugin ls
    

Skonfiguruj zmienne środowiskowe

Uwaga

W tym przewodniku są używane zmienne środowiskowe dla wygody podczas konfigurowania usług AKV i ACR. Zaktualizuj wartości tych zmiennych środowiskowych dla określonych zasobów.

  1. Konfigurowanie zmiennych środowiskowych dla usługi AKV i certyfikatów

    AKV_SUB_ID=myAkvSubscriptionId
    AKV_RG=myAkvResourceGroup
    AKV_NAME=myakv 
    
    # Name of the certificate created or imported in AKV 
    CERT_NAME=wabbit-networks-io 
    
    # X.509 certificate subject
    CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US"
    
  2. Konfigurowanie zmiennych środowiskowych dla usługi ACR i obrazów.

    ACR_SUB_ID=myAcrSubscriptionId
    ACR_RG=myAcrResourceGroup
    # Name of the existing registry example: myregistry.azurecr.io 
    ACR_NAME=myregistry 
    # Existing full domain of the ACR 
    REGISTRY=$ACR_NAME.azurecr.io 
    # Container name inside ACR where image will be stored 
    REPO=net-monitor 
    TAG=v1 
    # Source code directory containing Dockerfile to build 
    IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main  
    

Logowanie się za pomocą interfejsu wiersza polecenia platformy Azure

az login

Aby dowiedzieć się więcej na temat interfejsu wiersza polecenia platformy Azure i sposobu logowania się przy użyciu niego, zobacz Logowanie się przy użyciu interfejsu wiersza polecenia platformy Azure.

Tworzenie lub importowanie certyfikatu wystawionego przez urząd certyfikacji w usłudze AKV

Wymagania dotyczące certyfikatu

Podczas tworzenia certyfikatów do podpisywania i weryfikacji certyfikaty muszą spełniać wymagania dotyczące certyfikatu projektu notary.

Poniżej przedstawiono wymagania dotyczące certyfikatów głównych i pośrednich:

  • basicConstraints Rozszerzenie musi być obecne i oznaczone jako krytyczne. Należy CA ustawić truepole .
  • keyUsage Rozszerzenie musi być obecne i oznaczone .critical Pozycje bitowe muszą keyCertSign być ustawione.

Poniżej przedstawiono wymagania dotyczące certyfikatów wystawionych przez urząd certyfikacji:

  • Właściwości certyfikatu X.509:
    • Temat musi zawierać nazwę pospolitą (), kraj (CNC), województwo (ST) i organizację (O). W tym samouczku $CERT_SUBJECT jako temat jest używany.
    • Flaga użycia klucza X.509 musi być DigitalSignature tylko.
    • Rozszerzone użycie kluczy (EKU) musi być puste lub 1.3.6.1.5.5.7.3.3 (w przypadku codesigningu).
  • Właściwości klucza:
    • Właściwość musi być ustawiona exportable na false.
    • Wybierz obsługiwany typ klucza i rozmiar ze specyfikacji Notary Project.

Ważne

Aby zapewnić pomyślną integrację z integralnością obrazu, typ zawartości certyfikatu powinien być ustawiony na PEM.

Uwaga

W tym przewodniku jest używana wersja 1.0.1 wtyczki AKV. Wcześniejsze wersje wtyczki miały ograniczenie, które wymagało określonego zamówienia certyfikatu w łańcuchu certyfikatów. W wersji 1.0.1 wtyczki nie ma tego ograniczenia, dlatego zaleca się używanie wersji 1.0.1 lub nowszej.

Tworzenie certyfikatu wystawionego przez urząd certyfikacji

Utwórz żądanie podpisania certyfikatu (CSR), postępując zgodnie z instrukcjami w temacie Tworzenie żądania podpisania certyfikatu.

Ważne

Podczas scalania csr upewnij się, że scalisz cały łańcuch, który został przywrócony z dostawcy urzędu certyfikacji.

Importowanie certyfikatu w usłudze AKV

Aby zaimportować certyfikat:

  1. Pobierz plik certyfikatu od dostawcy urzędu certyfikacji z całym łańcuchem certyfikatów.
  2. Zaimportuj certyfikat do usługi Azure Key Vault, postępując zgodnie z instrukcjami w temacie Importowanie certyfikatu.

Uwaga

Jeśli certyfikat nie zawiera łańcucha certyfikatów po utworzeniu lub zaimportowaniu, możesz uzyskać certyfikaty pośrednie i główne od dostawcy urzędu certyfikacji. Możesz poprosić dostawcę o podanie pliku PEM zawierającego certyfikaty pośrednie (jeśli istnieją) i certyfikat główny. Ten plik można następnie użyć w kroku 5 podpisywania obrazów kontenera.

Podpisywanie obrazu kontenera przy użyciu interfejsu wiersza polecenia notacji i wtyczki AKV

Podczas pracy z usługami ACR i AKV niezbędne jest przyznanie odpowiednich uprawnień w celu zapewnienia bezpiecznego i kontrolowanego dostępu. Możesz autoryzować dostęp dla różnych jednostek, takich jak jednostki użytkownika, jednostki usługi lub tożsamości zarządzane, w zależności od określonych scenariuszy. W tym samouczku dostęp jest autoryzowany do zalogowanego użytkownika platformy Azure.

Dostęp do tworzenia w usłudze ACR

Role AcrPull i AcrPush są wymagane do tworzenia i podpisywania obrazów kontenerów w usłudze ACR.

  1. Ustawianie subskrypcji zawierającej zasób usługi ACR

    az account set --subscription $ACR_SUB_ID
    
  2. Przypisywanie ról

    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "AcrPull" --role "AcrPush" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
    

Kompilowanie i wypychanie obrazów kontenerów do usługi ACR

  1. Uwierzytelnianie w usłudze ACR przy użyciu indywidualnej tożsamości platformy Azure.

    az acr login --name $ACR_NAME
    

Ważne

Jeśli platforma Docker jest zainstalowana w systemie i używana az acr login do uwierzytelniania w usłudze ACR, docker login poświadczenia są już przechowywane i dostępne do notacji. W takim przypadku nie trzeba uruchamiać notation login ponownie, aby uwierzytelnić się w usłudze ACR. Aby dowiedzieć się więcej na temat opcji uwierzytelniania dla notacji, zobacz Uwierzytelnianie przy użyciu rejestrów zgodnych z protokołem OCI.

  1. Skompiluj i wypchnij nowy obraz za pomocą usługi ACR Tasks. Zawsze służy digest do identyfikowania obrazu do podpisywania, ponieważ tagi są modyfikowalne i można je zastąpić.

    DIGEST=$(az acr build -r $ACR_NAME -t $REGISTRY/${REPO}:$TAG $IMAGE_SOURCE --no-logs --query "outputImages[0].digest" -o tsv)
    IMAGE=$REGISTRY/${REPO}@$DIGEST
    

W tym samouczku, jeśli obraz został już skompilowany i jest przechowywany w rejestrze, tag służy jako identyfikator dla tego obrazu dla wygody.

IMAGE=$REGISTRY/${REPO}@$TAG

Tworzenie dostępu do usługi AKV

  1. Ustawianie subskrypcji zawierającej zasób usługi AKV

    az account set --subscription $AKV_SUB_ID
    
  2. Przypisywanie ról

    Jeśli certyfikat zawiera cały łańcuch certyfikatów, podmiot zabezpieczeń musi mieć przypisane następujące role:

    • Key Vault Secrets User do czytania wpisów tajnych
    • Key Vault Certificates Userdo odczytywania certyfikatów
    • Key Vault Crypto User na potrzeby operacji podpisywania
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Secrets User" --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

    Jeśli certyfikat nie zawiera łańcucha, podmiot zabezpieczeń musi być przypisany z następującymi rolami:

    • Key Vault Certificates Userdo odczytywania certyfikatów
    • Key Vault Crypto User na potrzeby operacji podpisywania
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

Aby dowiedzieć się więcej o dostępie do usługi Key Vault za pomocą kontroli dostępu opartej na rolach platformy Azure, zobacz Używanie kontroli dostępu na podstawie ról platformy Azure na potrzeby zarządzania dostępem.

Korzystanie z zasad dostępu (starsza wersja)

Aby ustawić subskrypcję zawierającą zasoby usługi AKV, uruchom następujące polecenie:

az account set --subscription $AKV_SUB_ID

Jeśli certyfikat zawiera cały łańcuch certyfikatów, podmiot zabezpieczeń musi mieć uprawnienie Signklucza, uprawnienia wpisu Gettajnego i uprawnienia Getcertyfikatu. Aby udzielić tych uprawnień podmiotowi zabezpieczeń:

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --secret-permissions get --certificate-permissions get --object-id $USER_ID

Jeśli certyfikat nie zawiera łańcucha, podmiot zabezpieczeń musi mieć uprawnienie klucza Signi uprawnienia Getcertyfikatu . Aby udzielić tych uprawnień podmiotowi zabezpieczeń:

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --certificate-permissions get --object-id $USER_ID

Aby dowiedzieć się więcej na temat przypisywania zasad do podmiotu zabezpieczeń, zobacz Przypisywanie zasad dostępu.

Podpisywanie obrazów kontenerów przy użyciu certyfikatu w usłudze AKV

  1. Pobierz identyfikator klucza dla certyfikatu. Certyfikat w usłudze AKV może mieć wiele wersji. Następujące polecenie pobiera identyfikator klucza dla najnowszej wersji certyfikatu $CERT_NAME .

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv) 
    
  2. Podpisz obraz kontenera przy użyciu formatu podpisu COSE przy użyciu identyfikatora klucza.

    Jeśli certyfikat zawiera cały łańcuch certyfikatów, uruchom następujące polecenie:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv 
    

    Jeśli certyfikat nie zawiera łańcucha, użyj parametru --plugin-config ca_certs=<ca_bundle_file> , aby przekazać certyfikaty urzędu certyfikacji w pliku PEM do wtyczki AKV, uruchom następujące polecenie:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file> 
    

    Aby uwierzytelnić się za pomocą usługi AKV, domyślnie następujące typy poświadczeń, jeśli są włączone, zostaną wypróbowane w następującej kolejności:

    Jeśli chcesz określić typ poświadczeń, użyj dodatkowej konfiguracji wtyczki o nazwie credential_type. Możesz na przykład jawnie ustawić wartość credential_type na azurecli potrzeby korzystania z poświadczeń interfejsu wiersza polecenia platformy Azure, jak pokazano poniżej:

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config credential_type=azurecli $IMAGE
    

    Poniższa tabela zawiera wartości credential_type różnych typów poświadczeń.

    Typ poświadczeń Wartość dla credential_type
    Poświadczenia środowiska environment
    Poświadczenia tożsamości obciążenia workloadid
    Poświadczenia tożsamości zarządzanej managedid
    Poświadczenia interfejsu wiersza polecenia platformy Azure azurecli
  3. Wyświetl graf podpisanych obrazów i skojarzonych podpisów.

    notation ls $IMAGE
    

    W poniższym przykładzie danych wyjściowych sygnatura typu application/vnd.cncf.notary.signature zidentyfikowanego przez skrót sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e jest skojarzona z elementem $IMAGE.

    myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f
    └── application/vnd.cncf.notary.signature
        └── sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
    

Weryfikowanie obrazu kontenera za pomocą interfejsu wiersza polecenia notacji

  1. Dodaj certyfikat główny do nazwanego magazynu zaufania na potrzeby weryfikacji podpisu. Jeśli nie masz certyfikatu głównego, możesz uzyskać go z urzędu certyfikacji. Poniższy przykład dodaje certyfikat $ROOT_CERT główny do $STORE_NAME magazynu zaufania.

    STORE_TYPE="ca" 
    STORE_NAME="wabbit-networks.io" 
    notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT  
    
  2. Wyświetl listę certyfikatu głównego, aby potwierdzić pomyślne dodanie certyfikatu $ROOT_CERT .

    notation cert ls 
    
  3. Skonfiguruj zasady zaufania przed weryfikacją.

    Zasady zaufania umożliwiają użytkownikom określanie dostrojonych zasad weryfikacji. Użyj następującego polecenia, aby skonfigurować zasady zaufania.

    cat <<EOF > ./trustpolicy.json
    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "wabbit-networks-images",
                "registryScopes": [ "$REGISTRY/$REPO" ],
                "signatureVerification": {
                    "level" : "strict" 
                },
                "trustStores": [ "$STORE_TYPE:$STORE_NAME" ],
                "trustedIdentities": [
                    "x509.subject: $CERT_SUBJECT"
                ]
            }
        ]
    }
    EOF
    

    Powyższy trustpolicy.json plik definiuje jedną zasadę zaufania o nazwie wabbit-networks-images. Te zasady zaufania dotyczą wszystkich artefaktów przechowywanych w $REGISTRY/$REPO repozytoriach. Nazwany magazyn $STORE_NAME zaufania typu $STORE_TYPE zawiera certyfikaty główne. Przyjęto również założenie, że użytkownik ufa określonej tożsamości z tematem $CERT_SUBJECTX.509 . Aby uzyskać więcej informacji, zobacz Specyfikacje zasad zaufania i magazynu zaufania.

  4. Użyj polecenia notation policy , aby zaimportować konfigurację zasad zaufania z programu trustpolicy.json.

    notation policy import ./trustpolicy.json
    
  5. Pokaż konfigurację zasad zaufania, aby potwierdzić pomyślne zaimportowanie.

    notation policy show
    
  6. Użyj notation verify polecenia , aby zweryfikować integralność obrazu:

    notation verify $IMAGE
    

    Po pomyślnej weryfikacji obrazu przy użyciu zasad zaufania skrót sha256 zweryfikowanego obrazu jest zwracany w pomyślnym komunikacie wyjściowym. Przykład danych wyjściowych:

    Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f

Znaczniki czasu

Od wersji Notation w wersji 1.2.0 notacja obsługuje zgodne znaczniki czasu RFC 3161 . To ulepszenie rozszerza zaufanie podpisów utworzonych w okresie ważności certyfikatu, ufając urzędowi sygnatury czasowej (TSA), umożliwiając pomyślną weryfikację podpisu nawet po wygaśnięciu certyfikatów. Jako użytkownik podpisujący obraz należy upewnić się, że podpisujesz obrazy kontenerów przy użyciu sygnatur czasowych generowanych przez zaufany TSA. Jako weryfikator obrazu, aby zweryfikować znaczniki czasu, należy upewnić się, że ufasz zarówno podpisywaniu obrazu, jak i skojarzonemu TSA, a także ustanowić zaufanie za pośrednictwem magazynów zaufania i zasad zaufania. Znacznik czasu zmniejsza koszty, eliminując konieczność okresowego ponownego podpisywania obrazów z powodu wygaśnięcia certyfikatu, co jest szczególnie krytyczne w przypadku używania certyfikatów krótkotrwałych. Aby uzyskać szczegółowe instrukcje dotyczące podpisywania i weryfikowania przy użyciu znacznika czasu, zapoznaj się z przewodnikiem notary Project timestamping (Notary Project timestamping guide).

Często zadawane pytania

  • Co należy zrobić, jeśli certyfikat wygasł?

    Jeśli certyfikat wygasł, musisz uzyskać nowy od zaufanego dostawcy urzędu certyfikacji wraz z nowym kluczem prywatnym. Wygasły certyfikat nie może być używany do podpisywania obrazów kontenerów. W przypadku obrazów podpisanych przed wygaśnięciem certyfikatu mogą one być nadal weryfikowane pomyślnie, jeśli zostały podpisane przy użyciu znacznika czasu. Bez znacznika czasu weryfikacja podpisu zakończy się niepowodzeniem i konieczne będzie ponowne podpisanie tych obrazów przy użyciu nowego certyfikatu w celu pomyślnej weryfikacji.

  • Co zrobić, jeśli certyfikat zostanie odwołany?

    Jeśli certyfikat zostanie odwołany, unieważni podpis. Może się to zdarzyć z kilku powodów, takich jak naruszenie klucza prywatnego lub zmiana przynależności właściciela certyfikatu. Aby rozwiązać ten problem, należy najpierw upewnić się, że kod źródłowy i środowisko kompilacji są aktualne i bezpieczne. Następnie skompiluj obrazy kontenerów z kodu źródłowego, uzyskaj nowy certyfikat od zaufanego dostawcy urzędu certyfikacji wraz z nowym kluczem prywatnym i podpisz nowe obrazy kontenerów przy użyciu nowego certyfikatu, postępując zgodnie z tym przewodnikiem.

Następne kroki

Notacja udostępnia również rozwiązania ciągłej integracji/ciągłego wdrażania w przepływie pracy usługi Azure Pipeline i GitHub Actions:

Aby zweryfikować podpisane wdrożenie obrazu w usłudze AKS lub Kubernetes: