Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podpisywanie obrazów kontenerów to proces zapewniający ich autentyczność i integralność. Można to osiągnąć przez dodanie podpisu cyfrowego do obrazu kontenera, który można zweryfikować podczas wdrażania. Podpis pomaga sprawdzić, czy obraz pochodzi z zaufanego wydawcy i nie został zmodyfikowany. 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) służy do przechowywania certyfikatów z kluczami podpisywania, których można używać za pomocą wtyczki Notation AKV (azure-kv) do podpisywania i weryfikowania obrazów kontenerów i innych artefaktów. Usługa Azure Container Registry (ACR) umożliwia dołączanie podpisów do obrazów kontenerów i innych artefaktów, a także wyświetlanie tych podpisów.
W tym samouczku:
- Zainstaluj interfejs CLI Notation i wtyczkę AKV
- Tworzenie certyfikatu z podpisem własnym w usłudze AKV
- Kompilowanie i wypychanie obrazu kontenera za pomocą usługi ACR Tasks
- Podpisywanie obrazu kontenera za pomocą Notation CLI i wtyczki AKV
- Zweryfikuj obraz kontenera względem podpisu za pomocą Notation CLI
- 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 do zarządzania certyfikatami
- Instalowanie i konfigurowanie najnowszego interfejsu wiersza polecenia platformy Azure lub uruchamianie poleceń w usłudze Azure Cloud Shell
Zainstaluj Notation CLI i wtyczkę AKV
Zainstaluj notację w wersji 1.3.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.3.0/notation_1.3.0_linux_amd64.tar.gz tar xvzf notation.tar.gz # Copy the Notation binary to the desired bin directory in your $PATH, for example cp ./notation /usr/local/bin
Zainstaluj wtyczkę
azure-kv
Notacji Azure Key Vault w wersji 1.2.1 w środowisku systemu Linux amd64.Uwaga / Notatka
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.1/notation-azure-kv_1.2.1_linux_amd64.tar.gz --sha256sum 67c5ccaaf28dd44d2b6572684d84e344a02c2258af1d65ead3910b3156d3eaf5
Wyświetl listę dostępnych wtyczek i upewnij się, że wtyczka
azure-kv
z wersją1.2.1
znajduje się na liście.notation plugin ls
Skonfiguruj zmienne środowiskowe
Uwaga / Notatka
Aby ułatwić wykonywanie poleceń w samouczku, podaj wartości zasobów platformy Azure, aby dopasować je do istniejących zasobów usługi ACR i usługi AKV.
Skonfiguruj nazwy zasobów usługi AKV.
AKV_SUB_ID=myAkvSubscriptionId AKV_RG=myAkvResourceGroup # Name of the existing AKV used to store the signing keys AKV_NAME=myakv # Name of the certificate created in AKV CERT_NAME=wabbit-networks-io CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US" CERT_PATH=./${CERT_NAME}.pem
Konfigurowanie nazw zasobów 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 IMAGE=$REGISTRY/${REPO}:$TAG # Source code directory containing Dockerfile to build IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main
Zaloguj się za pomocą Azure CLI
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.
Zabezpieczanie uprawnień dostępu do usług ACR i 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 przyznawany zalogowanemu użytkownikowi platformy Azure.
Autoryzowanie dostępu do usługi ACR
W przypadku rejestrów z włączoną kontrolą dostępu opartą na atrybutach (ABAC) Microsoft, wymagane są role Container Registry Repository Reader
i Container Registry Repository Writer
do kompilowania i podpisywania obrazów kontenerów w usłudze ACR.
W przypadku rejestrów, które nie są włączone dla usługi ABAC, wymagane są role AcrPull
i AcrPush
.
Aby uzyskać więcej informacji na temat usługi Microsoft Entra ABAC, zobacz Microsoft Entra-based repository permissions (Uprawnienia repozytorium oparte na usłudze Microsoft Entra).
Ustawianie subskrypcji zawierającej zasób usługi ACR
az account set --subscription $ACR_SUB_ID
Przypisz role. Prawidłowa rola do użycia w przypisaniu roli zależy od tego, czy rejestr jest włączony w trybie ABAC, czy nie.
USER_ID=$(az ad signed-in-user show --query id -o tsv) ROLE1="Container Registry Repository Reader" # For ABAC-enabled registries. Otherwise, use "AcrPull" for non-ABAC-enabled registries. ROLE2="Container Registry Repository Writer" # For ABAC-enabled registries. Otherwise, use "AcrPush" for non-ABAC-enabled registries. az role assignment create --role "$ROLE1" --role "$ROLE2" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
Autoryzowanie dostępu do usługi AKV
W tej sekcji zapoznamy się z dwiema opcjami autoryzowania dostępu do usługi AKV.
Użyj kontroli dostępu opartej na rolach platformy Azure (zalecane)
Do podpisywania przy użyciu certyfikatów z podpisem własnym są wymagane następujące role:
-
Key Vault Certificates Officer
do tworzenia i odczytywania certyfikatów -
Key Vault Certificates User
do odczytywania istniejących certyfikatów -
Key Vault Crypto User
na potrzeby operacji podpisywania
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.
Ustawianie subskrypcji zawierającej zasób usługi AKV
az account set --subscription $AKV_SUB_ID
Przypisywanie ról
USER_ID=$(az ad signed-in-user show --query id -o tsv) az role assignment create --role "Key Vault Certificates Officer" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
Przypisywanie zasad dostępu w AKV (starsza wersja)
Dla tożsamości wymagane są następujące uprawnienia:
-
Create
uprawnienia do tworzenia certyfikatu -
Get
uprawnienia do odczytywania istniejących certyfikatów -
Sign
uprawnienia do operacji podpisywania
Aby dowiedzieć się więcej na temat przypisywania zasad do głównego podmiotu, zobacz Przypisywanie zasad dostępu.
Ustaw subskrypcję zawierającą zasób usługi AKV:
az account set --subscription $AKV_SUB_ID
Ustaw zasady dostępu w usłudze AKV:
USER_ID=$(az ad signed-in-user show --query id -o tsv) az keyvault set-policy -n $AKV_NAME --certificate-permissions create get --key-permissions sign --object-id $USER_ID
Ważne
W tym przykładzie przedstawiono minimalne uprawnienia wymagane do utworzenia certyfikatu i podpisania obrazu kontenera. W zależności od wymagań może być konieczne przyznanie dodatkowych uprawnień.
Tworzenie certyfikatu z podpisem własnym w usłudze AKV (interfejs wiersza polecenia platformy Azure)
W poniższych krokach pokazano, jak utworzyć certyfikat z podpisem własnym na potrzeby testowania.
Utwórz plik zasad certyfikatu.
Po wykonaniu pliku polityki certyfikatów w sposób przedstawiony poniżej, tworzony jest prawidłowy certyfikat zgodny z wymaganiami certyfikatu projektu Notary Project w usłudze AKV. Wartość parametru
ekus
dotyczy podpisywania kodu, ale nie jest wymagana do notacji w celu podpisania artefaktów. Temat jest używany później jako tożsamość zaufania, której ufa użytkownik podczas weryfikacji.cat <<EOF > ./my_policy.json { "issuerParameters": { "certificateTransparency": null, "name": "Self" }, "keyProperties": { "exportable": false, "keySize": 2048, "keyType": "RSA", "reuseKey": true }, "secretProperties": { "contentType": "application/x-pem-file" }, "x509CertificateProperties": { "ekus": [ "1.3.6.1.5.5.7.3.3" ], "keyUsage": [ "digitalSignature" ], "subject": "$CERT_SUBJECT", "validityInMonths": 12 } } EOF
Utwórz certyfikat.
az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
Podpisywanie obrazu kontenera za pomocą Notation CLI i wtyczki AKV
Uwierzytelnij się w usłudze ACR przy użyciu twojej tożsamości platformy Azure.
az acr login --name $ACR_NAME
Ważne
Jeśli masz zainstalowanego Dockera na swoim systemie i użyłeś az acr login
lub docker login
do uwierzytelnienia w swoim ACR, Twoje poświadczenia są już przechowywane i dostępne do użycia przez system. 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 używaj wartości skrótu, aby zidentyfikować obraz 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ż zbudowany i jest przechowywany w rejestrze, znacznik służy jako identyfikator tego obrazu dla wygody.
IMAGE=$REGISTRY/${REPO}:$TAG
Pobierz identyfikator klucza podpisywania. Certyfikat w usłudze AKV może mieć wiele wersji. Następujące polecenie pobiera identyfikator klucza najnowszej wersji.
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 podpisywania. Aby podpisać certyfikatem samodzielnie podpisanym, należy ustawić wartość konfiguracji wtyczki
self_signed=true
.notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
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 zadania obliczeniowego
- Poświadczenia tożsamości zarządzanej
- Poświadczenia Azure CLI
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
do 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 self_signed=true --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świadczenie środowiskowe environment
Poświadczenia tożsamości obciążenia roboczego workloadid
Poświadczenie zarządzanej tożsamości managedid
Poświadczenia CLI platformy Azure azurecli
Wyświetl wykres podpisanych obrazów i powiązanych podpisów.
notation ls $IMAGE
Zweryfikuj obraz kontenera za pomocą programu Notation CLI
Aby zweryfikować obraz kontenera, dodaj certyfikat root, który podpisuje certyfikat podrzędny, do magazynu zaufania, a następnie utwórz zasady zaufania na potrzeby weryfikacji. W przypadku certyfikatu z podpisem własnym używanego w tym samouczku certyfikat główny jest certyfikatem z podpisem własnym.
Pobierz certyfikat publiczny.
az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
Dodaj pobrany certyfikat publiczny do nazwanego magazynu zaufania na potrzeby weryfikacji podpisu.
STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
Wymień certyfikat do potwierdzenia.
notation cert ls
Skonfiguruj zasady zaufania przed weryfikacją.
Zasady zaufania umożliwiają użytkownikom określanie dostrojonych zasad weryfikacji. W poniższym przykładzie skonfigurowano zasadę zaufania o nazwie
wabbit-networks-images
, która ma zastosowanie do wszystkich artefaktów w$REGISTRY/$REPO
i używa nazwanego magazynu zaufania$STORE_NAME
typu$STORE_TYPE
. Przyjęto również założenie, że użytkownik ufa określonej tożsamości poprzez temat X.509$CERT_SUBJECT
. Aby uzyskać więcej informacji, zobacz Specyfikacja magazynu zaufania i zasad 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
Użyj polecenia
notation policy
, aby zaimportować konfigurację zasad zaufania z utworzonego wcześniej pliku JSON.notation policy import ./trustpolicy.json notation policy show
Użyj polecenia
notation verify
, aby sprawdzić, czy obraz kontenera nie został zmieniony od czasu kompilacji.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.
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 o krótkim okresie ważności. Aby uzyskać szczegółowe instrukcje dotyczące podpisywania i weryfikowania przy użyciu znacznika czasu, zapoznaj się z przewodnikiem Notary Project dotyczącym znakowania czasowego.
Dalsze kroki
Notation zapewnia rozwiązania CI/CD za pomocą Azure Pipelines i GitHub Actions.
- Aby podpisać i zweryfikować obrazy kontenerów w potokach ADO, zobacz Podpisywanie i weryfikowanie obrazu kontenera za pomocą notacji w usłudze Azure Pipeline
- Aby podpisać obrazy kontenerów przy użyciu funkcji GitHub Actions, zobacz Sign a container image with Notation using GitHub Actions (Podpisywanie obrazu kontenera za pomocą funkcji Notation przy użyciu funkcji GitHub Actions)
- Aby zweryfikować obrazy kontenerów przy użyciu funkcji GitHub Actions, zobacz Weryfikowanie obrazu kontenera za pomocą notacji przy użyciu funkcji GitHub Actions
Aby upewnić się, że w usłudze Azure Kubernetes Service (AKS) są wdrażane tylko zaufane obrazy kontenerów:
- Skorzystaj z funkcji integralności obrazów usługi Azure Policy (wersja zapoznawcza), zgodnie z przewodnikiem Używanie integralności obrazów do weryfikowania podpisanych obrazów przed wdrożeniem ich w klastrach usługi Azure Kubernetes Service
- Użyj rozwiązania Ratify i usługi Azure Policy, postępując zgodnie z przewodnikiem Zabezpieczanie obciążeń usługi AKS: Weryfikowanie podpisów obrazów kontenera przy użyciu rozwiązania Ratify i usługi Azure Policy