Sdílet prostřednictvím


Podepisování imagí kontejnerů pomocí Notation, Azure Key Vault a samopodepsaného certifikátu

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

Instalace Notation CLI a doplňku Key Vault

  1. 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/bin
    
  2. Nainstalujte 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 67c5ccaaf28dd44d2b6572684d84e344a02c2258af1d65ead3910b3156d3eaf5
    
  3. Vypište dostupné plug-iny a ověřte, že plug-in notation-azure-kv s verzí 1.2.1 je 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.

  1. 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}.pem
    
  2. Konfigurace 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ě.

  1. Nastavte předplatné, které obsahuje prostředek Container Registry:

    az account set --subscription $ACR_SUB_ID
    
  2. Př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.

Pro podepisování pomocí certifikátů podepsaných svým držitelem jsou vyžadovány následující role:

  • Key Vault Certificates Officer pro vytváření a čtení certifikátů
  • Key Vault Certificates User pro čtení existujících certifikátů
  • Key Vault Crypto User pro 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.

  1. Nastavte předplatné, které obsahuje prostředek služby Key Vault:

    az account set --subscription $AKV_SUB_ID
    
  2. Př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í:

  • Create oprávnění k vytvoření certifikátu
  • Get oprávnění ke čtení existujících certifikátů
  • Sign oprá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).

  1. Nastavte předplatné, které obsahuje prostředek služby Key Vault:

    az account set --subscription $AKV_SUB_ID
    
  2. Nastavte 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í:

  1. 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 ekus je 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
        }
    }
    EOF
    
  2. Vytvoř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

  1. Ověřte se v registru kontejneru pomocí vaší individuální identity Azure:

    az acr login --name $ACR_NAME
    

    Důležité

    Pokud máte ve svém systému nainstalovaný Docker a použili jste az acr login nebo docker login k 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ět notation 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.

  2. 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}@$DIGEST
    

    Pokud 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}:$TAG
    
  3. Zí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)
    
  4. 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=true konfigurace pluginu.

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
    

    Pokud 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é):

    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ě nastavit credential_type na azurecli pro 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 $IMAGE
    

    Ná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_type
    Přihlašovací údaje k prostředí environment
    Přihlašovací údaje identit úloh workloadid
    Spravovaný identitní přihlašovací údaj managedid
    Přihlašovací údaje Azure CLI azurecli

    Pozná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).

  5. 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.

  1. Stažení veřejného certifikátu:

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. Př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_PATH
    
  3. Výpis certifikátu, který chcete potvrdit:

    notation cert ls
    
  4. Př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/$REPO a používá úložiště důvěryhodnosti s názvem $STORE_NAME typu $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"
                ]
            }
        ]
    }
    EOF
    
  5. Slouží notation policy k importu konfigurace zásad důvěryhodnosti ze souboru JSON, který jste vytvořili dříve:

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. Slouží notation verify k ověření, že se image kontejneru po čase sestavení nezměnila:

    notation verify $IMAGE
    

    Po ú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.

Notation poskytuje řešení CI/CD na platformách Azure Pipelines a GitHub Actions.

Aby se zajistilo, že se ve službě Azure Kubernetes Service (AKS) nasadí jenom důvěryhodné image kontejnerů: