Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek je součástí série o zajištění integrity a pravosti imagí kontejnerů a dalších artefaktů OCI (Open Container Initiative). Pro úplný obrázek začněte přehledem, který vysvětluje, proč podepisování záleží a popisuje různé scénáře.
Podepisování imagí kontejnerů je proces, který pomáhá zajistit jejich pravost a integritu. Digitální podpis přidaný do image kontejneru se ověří během nasazování. Podpis pomáhá ověřit, že image pochází z důvěryhodného vydavatele a že není upravená.
Tento článek popisuje následující nástroje, které jsou součástí procesu podepisování:
Notace je opensourcový nástroj pro zabezpečení dodavatelského řetězce vyvinutý komunitou Notárního projektu a podporovaným Microsoftem. Podporuje podepisování a ověřování imagí kontejnerů a dalších artefaktů.
Pokud chcete podepsat image kontejneru pomocí notace v kanálech kontinuální integrace a průběžného doručování (CI/CD), postupujte podle pokynů pro Azure Pipelines nebo GitHub Actions.
Azure Key Vault je služba pro ukládání certifikátů s podpisovými klíči. Označení může tyto klíče používat prostřednictvím modulu plug-in služby Key Vault (
notation-azure-kv) k podepisování a ověřování obrazů kontejnerů a dalších artefaktů.Azure Container Registry je privátní registr, který můžete použít k připojení podpisů k imagím kontejnerů a dalším artefaktům spolu se zobrazením těchto podpisů.
V tomto článku se naučíte:
- Nainstalujte rozhraní příkazového řádku (CLI) Notation a modul plugin Key Vault.
- Vytvořte samopodepsaný certifikát ve službě Key Vault.
- Sestavte a odešlete image kontejneru pomocí úloh služby Container Registry.
- Podepište image kontejneru pomocí rozhraní příkazového řádku notace a modulu plug-in Key Vault.
- Pomocí Notation CLI ověřte image kontejneru proti digitálnímu podpisu.
- Používejte časové razítkování.
Požadavky
- Vytvořte nebo použijte registr kontejneru k ukládání imagí a podpisů kontejneru.
- Vytvořte nebo použijte trezor klíčů ke správě certifikátů.
- Nainstalujte a nakonfigurujte nejnovější verzi Azure CLI nebo spusťte příkazy v Azure Cloud Shellu.
Instalace Notation CLI a doplňku Key Vault
Nainstalujte notaci v1.3.2 v prostředí s Linuxem AMD64. Pokud chcete stáhnout balíček pro jiná prostředí, postupujte podle průvodce instalací notace.
# Download, extract, and install curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.3.2/notation_1.3.2_linux_amd64.tar.gz tar xvzf notation.tar.gz # Copy the Notation binary to the desired bin directory in $PATH, for example cp ./notation /usr/local/binNainstalujte modul plug-in služby Key Vault (
notation-azure-kv) v1.2.1 v prostředí Linux AMD64.Poznámka:
Adresu URL a kontrolní součet SHA256 pro modul plug-in najdete na stránce verze modulu plug-in.
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 67c5ccaaf28dd44d2b6572684d84e344a02c2258af1d65ead3910b3156d3eaf5Vypište dostupné plug-iny a ověřte, že plug-in
notation-azure-kvs verzí1.2.1je zahrnut v seznamu.notation plugin ls
Konfigurace proměnných prostředí
Pro snadné spouštění příkazů v tomto článku zadejte hodnoty prostředků Azure tak, aby odpovídaly existujícím prostředkům služby Container Registry a Key Vault.
Konfigurace názvů zdrojů Key Vault.
AKV_SUB_ID=myAkvSubscriptionId AKV_RG=myAkvResourceGroup # Name of the existing key vault used to store the signing keys AKV_NAME=myakv # Name of the certificate created in the key vault CERT_NAME=wabbit-networks-io CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US" CERT_PATH=./${CERT_NAME}.pemKonfigurace názvů prostředků registru kontejnerů a obrazů:
ACR_SUB_ID=myAcrSubscriptionId ACR_RG=myAcrResourceGroup # Name of the existing registry (example: myregistry.azurecr.io) ACR_NAME=myregistry # Existing full domain of the container registry REGISTRY=$ACR_NAME.azurecr.io # Container name inside the container registry where the image will be stored REPO=net-monitor TAG=v1 IMAGE=$REGISTRY/${REPO}:$TAG # Source code directory that contains the Dockerfile to build IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main
Přihlášení pomocí Azure CLI
az login
Další informace najdete v tématu Ověřování v Azure pomocí Azure CLI.
Udělení přístupových oprávnění ke službě Container Registry a Key Vault
Při práci se službou Container Registry a Key Vault je nezbytné udělit příslušná oprávnění, která vám pomůžou zajistit zabezpečený a řízený přístup. V závislosti na konkrétních scénářích můžete autorizovat přístup pro různé entity, jako jsou uživatelské role, servisní role nebo spravované identity. V tomto článku je přístup autorizovaný pro přihlášeného uživatele Azure.
Autorizace přístupu ke službě Container Registry
U registrů, které mají povoleno řízení přístupu na základě atributů Microsoft Entra (ABAC), jsou pro vytváření a podepisování obrazů kontejnerů ve službě Container Registry potřeba role Container Registry Repository Reader a Container Registry Repository Writer.
U registrů, které nejsou povoleny pro ABAC, jsou vyžadovány role AcrPull a AcrPush.
Další informace o ABAC naleznete v tématu Řízení přístupu na základě atributu Microsoft Entra pro oprávnění úložiště.
Nastavte předplatné, které obsahuje prostředek Container Registry:
az account set --subscription $ACR_SUB_IDPřiřaďte role. Správná role, kterou použít při přiřazení role, závisí na tom, zda je registr povolen ABAC či nikoliv.
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"
Autorizace přístupu ke službě Key Vault
Tato část popisuje dvě možnosti autorizace přístupu ke službě Key Vault.
Použití Azure RBAC (doporučeno)
Pro podepisování pomocí certifikátů podepsaných svým držitelem jsou vyžadovány následující role:
-
Key Vault Certificates Officerpro vytváření a čtení certifikátů -
Key Vault Certificates Userpro čtení existujících certifikátů -
Key Vault Crypto Userpro operace podepisování
Další informace o přístupu ke službě Key Vault pomocí řízení přístupu na základě role v Azure (RBAC) najdete v tématu Poskytnutí přístupu ke klíčům, certifikátům a tajným kódům služby Key Vault pomocí řízení přístupu na základě role v Azure.
Nastavte předplatné, které obsahuje prostředek služby Key Vault:
az account set --subscription $AKV_SUB_IDPřiřaďte role:
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"
Přiřazení zásad přístupu ve službě Key Vault (starší verze)
Pro identitu jsou vyžadována následující oprávnění:
-
Createoprávnění k vytvoření certifikátu -
Getoprávnění ke čtení existujících certifikátů -
Signoprávnění pro operace podepisování
Další informace o přiřazování zásad k objektu zabezpečení najdete v tématu Přiřazení zásad přístupu ke službě Key Vault (starší verze).
Nastavte předplatné, které obsahuje prostředek služby Key Vault:
az account set --subscription $AKV_SUB_IDNastavte zásady přístupu ve službě Key Vault:
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
Důležité
Tento příklad ukazuje minimální oprávnění, která potřebujete k vytvoření certifikátu a podepsání image kontejneru. V závislosti na vašich požadavcích možná budete muset udělit další oprávnění.
Vytvoření certifikátu podepsaného svým držitelem ve službě Key Vault (Azure CLI)
Následující kroky ukazují, jak vytvořit certifikát podepsaný svým držitelem pro účely testování:
Vytvořte soubor zásad certifikátu.
Po spuštění souboru zásad certifikátu pomocí následujícího kódu vytvoří platný certifikát kompatibilní s požadavky na certifikát notárního projektu ve službě Key Vault. Hodnota
ekusje určená pro podepisování kódu, ale pro Notation při podepisování artefaktů není vyžadována. Předmět se později použije jako důvěryhodná identita během ověřování.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 } } EOFVytvořte certifikát:
az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
Podpis obrazu kontejneru pomocí CLI rozhraní Notation a modulu Key Vault
Ověřte se v registru kontejneru pomocí vaší individuální identity Azure:
az acr login --name $ACR_NAMEDůležité
Pokud máte ve svém systému nainstalovaný Docker a použili jste
az acr loginnebodocker logink ověření v kontejnerovém registru, vaše přihlašovací údaje jsou už uložené a dostupné pro Notation. V takovém případě nemusíte znovu spouštětnotation login, abyste se ověřili v registru kontejneru. Další informace o možnostech ověřování pro notaci najdete v tématu Ověřování pomocí registrů kompatibilních s OCI.Sestavte a odešlete novou image pomocí úloh služby Azure Container Registry. Vždy použijte hodnotu digest k identifikaci obrázku pro podepisování, protože značky jsou proměnlivé a lze je přepsat.
DIGEST=$(az acr build -r $ACR_NAME -t $REGISTRY/${REPO}:$TAG $IMAGE_SOURCE --no-logs --query "outputImages[0].digest" -o tsv) IMAGE=$REGISTRY/${REPO}@$DIGESTPokud je image v tomto článku už sestavená a je uložená v registru, slouží značka jako identifikátor pro tuto image pro usnadnění:
IMAGE=$REGISTRY/${REPO}:$TAGZískejte ID podpisového klíče. Certifikát ve službě Key Vault může mít více verzí. Následující příkaz získá ID klíče nejnovější verze:
KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)Podepište image kontejneru pomocí formátu podpisu CBOR Object Signing and Encryption (COSE) pomocí ID podpisového klíče. Pokud chcete podepsat samopodepisovací certifikát, musíte nastavit hodnotu
self_signed=truekonfigurace pluginu.notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGEPokud se chcete ověřit ve službě Key Vault, ve výchozím nastavení se zkoušejí v pořadí následující typy přihlašovacích údajů (pokud jsou povolené):
- Přihlašovací údaje prostředí
- Přihlašovací údaje identit úloh
- Přihlašovací údaje pro spravované identity
- Přihlašovací údaje Azure CLI
Pokud chcete zadat typ přihlašovacích údajů, použijte další konfiguraci modulu plug-in s názvem
credential_type. Například můžete explicitně nastavitcredential_typenaazureclipro použití přihlašovacích údajů Azure CLI, jak je znázorněno v tomto příkladu:notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true --plugin-config credential_type=azurecli $IMAGENásledující tabulka uvádí hodnoty pro různé typy přihlašovacích
credential_typeúdajů.Typ přihlašovacích údajů Hodnota pro credential_typePřihlašovací údaje k prostředí environmentPřihlašovací údaje identit úloh workloadidSpravovaný identitní přihlašovací údaj managedidPřihlašovací údaje Azure CLI azurecliPoznámka:
Od verze notace v1.2.0 používá notace schéma značek referrerů OCI k výchozímu uložení podpisu v Container Registry. V případě potřeby můžete také povolit rozhraní API refererů OCI pomocí příznaku
--force-referrers-tag false. Funkce služby Container Registry podporují rozhraní API refererů OCI s výjimkou registru šifrovaného prostřednictvím klíčů spravovaných zákazníkem (CMK).Zobrazení grafu podepsaných obrázků a přidružených podpisů:
notation ls $IMAGE
Ověření image kontejneru pomocí Notation CLI
Pokud chcete ověřit image kontejneru, přidejte kořenový certifikát, který podepíše listový certifikát do úložiště důvěryhodnosti, a vytvořte zásady důvěryhodnosti pro ověření. Pro certifikát podepsaný svým držitelem, který tento článek používá, je kořenový certifikát samotný certifikát podepsaný svým držitelem.
Stažení veřejného certifikátu:
az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATHPřidejte stažený veřejný certifikát do pojmenovaného úložiště důvěryhodnosti pro ověření podpisu:
STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATHVýpis certifikátu, který chcete potvrdit:
notation cert lsPřed ověřením nakonfigurujte zásady důvěryhodnosti.
Zásady důvěryhodnosti umožňují uživatelům zadat jemně vyladěné zásady ověřování. Následující příklad nakonfiguruje zásadu důvěryhodnosti s názvem
wabbit-networks-images. Tato zásada se vztahuje na všechny artefakty v$REGISTRY/$REPOa používá úložiště důvěryhodnosti s názvem$STORE_NAMEtypu$STORE_TYPE. Předpokládá také, že uživatel důvěřuje konkrétní identitě s předmětem X.509$CERT_SUBJECT. Další informace naleznete v tématu Důvěryhodnost úložiště a specifikace zásad důvěryhodnosti.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" ] } ] } EOFSlouží
notation policyk importu konfigurace zásad důvěryhodnosti ze souboru JSON, který jste vytvořili dříve:notation policy import ./trustpolicy.json notation policy showSlouží
notation verifyk ověření, že se image kontejneru po čase sestavení nezměnila:notation verify $IMAGEPo úspěšném ověření image prostřednictvím zásad důvěryhodnosti se hodnota hash SHA256 ověřeného obrázku vrátí v úspěšné výstupní zprávě.
Použijte časové razítkování
Od vydání verze Notation v1.2.0 podporuje Notation RFC 3161-kompatibilní časové razítkování. Toto vylepšení rozšiřuje důvěryhodnost podpisů vytvořených v době platnosti certifikátu tím, že důvěřuje autoritě časového razítka (TSA). Tento vztah důvěryhodnosti umožňuje úspěšné ověření podpisu i po vypršení platnosti certifikátů.
Jako podepisovatel byste měli zajistit, abyste podepisovali image kontejneru s časovými razítky, která vygenerovala důvěryhodná TSA. Jako ověřovatel obrazů byste měli zajistit, abyste důvěřovali jak podepisovači, tak přidruženému TSA, a zavést důvěru prostřednictvím úložišť důvěry a zásad důvěryhodnosti.
Časové razítko snižuje náklady tím, že eliminuje potřebu pravidelně podepisovat obrázky kvůli vypršení platnosti certifikátu. Tato schopnost je obzvláště důležitá, pokud používáte krátkodobé certifikáty. Podrobné pokyny k podepisování a ověřování obrázků pomocí časového razítka najdete v průvodci časovým razítkem notářského projektu.
Související obsah
Notation poskytuje řešení CI/CD na platformách Azure Pipelines a GitHub Actions.
- Pokud chcete podepsat a ověřit image kontejnerů v kanálech Azure DevOps, přečtěte si téma Podepsání a ověření image kontejneru pomocí notace v kanálu Azure.
- Pokud chcete podepisovat image kontejnerů pomocí GitHub Actions, přečtěte si téma Podepsání image kontejneru pomocí notace v GitHub Actions.
- Pokud chcete ověřit image kontejnerů pomocí GitHub Actions, přečtěte si téma Ověření image kontejneru pomocí notace v GitHub Actions.
Aby se zajistilo, že se ve službě Azure Kubernetes Service (AKS) nasadí jenom důvěryhodné image kontejnerů:
- Použijte Azure Policy Image Integrity (Preview) pomocí průvodce Ověřte podepsané obrazy před jejich nasazením do clusterů Azure Kubernetes Service (Preview).
- Použijte Ratify a Azure Policy podle průvodce Ověření podpisů imagí kontejnerů použitím Ratify a Azure Policy.