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
- Tworzenie lub używanie usługi Azure Container Registry do przechowywania obrazów i podpisów kontenerów
- Tworzenie lub używanie usługi Azure Key Vault.
- Instalowanie i konfigurowanie najnowszego interfejsu wiersza polecenia platformy Azure lub uruchamianie poleceń w usłudze Azure Cloud Shell
Uwaga
Zalecamy utworzenie nowej usługi Azure Key Vault do przechowywania tylko certyfikatów.
Instalowanie interfejsu wiersza polecenia notacji i wtyczki AKV
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
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
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.
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"
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żyCA
ustawićtrue
pole .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 (
CN
C
), 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).
- Temat musi zawierać nazwę pospolitą (), kraj (
- Właściwości klucza:
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:
- Pobierz plik certyfikatu od dostawcy urzędu certyfikacji z całym łańcuchem certyfikatów.
- 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.
Ustawianie subskrypcji zawierającej zasób usługi ACR
az account set --subscription $ACR_SUB_ID
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
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.
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
Korzystanie z kontroli dostępu opartej na rolach platformy Azure (zalecane)
Ustawianie subskrypcji zawierającej zasób usługi AKV
az account set --subscription $AKV_SUB_ID
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 tajnychKey Vault Certificates User
do odczytywania certyfikatówKey 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 User
do odczytywania certyfikatówKey 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 Sign
klucza, uprawnienia wpisu Get
tajnego i uprawnienia Get
certyfikatu. 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 Sign
i uprawnienia Get
certyfikatu . 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
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)
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:
- Poświadczenia środowiska
- Poświadczenia tożsamości obciążenia
- Poświadczenia tożsamości zarządzanej
- Poświadczenia interfejsu wiersza polecenia platformy Azure
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
naazurecli
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
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ótsha256: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
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
Wyświetl listę certyfikatu głównego, aby potwierdzić pomyślne dodanie certyfikatu
$ROOT_CERT
.notation cert ls
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 nazwiewabbit-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_SUBJECT
X.509 . Aby uzyskać więcej informacji, zobacz Specyfikacje zasad zaufania i magazynu zaufania.Użyj polecenia
notation policy
, aby zaimportować konfigurację zasad zaufania z programutrustpolicy.json
.notation policy import ./trustpolicy.json
Pokaż konfigurację zasad zaufania, aby potwierdzić pomyślne zaimportowanie.
notation policy show
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:
- Podpisywanie i weryfikowanie obrazu kontenera za pomocą notacji w usłudze Azure Pipeline
- Podpisywanie i weryfikowanie obrazu kontenera za pomocą notacji w przepływie pracy funkcji GitHub Actions
Aby zweryfikować podpisane wdrożenie obrazu w usłudze AKS lub Kubernetes: