Sdílet prostřednictvím


Podepisování imagí kontejnerů pomocí notace a služby Azure Key Vault pomocí certifikátu podepsaného svým držitelem

Podepisování imagí kontejnerů je proces, který zajišťuje jejich pravost a integritu. Toho dosáhnete přidáním digitálního podpisu do image kontejneru, kterou je možné ověřit během nasazování. Podpis pomáhá ověřit, zda je image od důvěryhodného vydavatele a nebyla změněna. Notace je opensourcový nástroj pro zabezpečení dodavatelského řetězce vyvinutý komunitou Notárního projektu a podporovaným Microsoftem, který podporuje podepisování a ověřování imagí kontejnerů a dalších artefaktů. Azure Key Vault (AKV) slouží k ukládání certifikátů s podpisovými klíči, které se dají používat v notaci s modulem plug-in Notation AKV (azure-kv) k podepisování a ověřování imagí kontejnerů a dalších artefaktů. Azure Container Registry (ACR) umožňuje připojit podpisy k imagím kontejnerů a dalším artefaktům a také zobrazit tyto podpisy.

V tomto kurzu:

  • Instalace modulu plug-in Notation CLI a AKV
  • Vytvoření certifikátu podepsaného svým držitelem v AKV
  • Sestavení a nasdílení image kontejneru pomocí ACR Tasks
  • Podepsání image kontejneru pomocí notačního rozhraní příkazového řádku a modulu plug-in AKV
  • Ověření image kontejneru u podpisu pomocí rozhraní příkazového řádku notace
  • Časové razítko

Požadavky

Instalace modulu plug-in Notation CLI a AKV

  1. Nainstalujte notaci v1.2.0 v prostředí Linux 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.2.0/notation_1.2.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
    
  2. Nainstalujte modul plug-in azure-kv Azure Key Vault v1.2.0 v linuxovém prostředí amd64.

    Poznámka:

    Kontrolní součet ADRESY URL a SHA256 modulu plug-in Notation Azure Key Vault najdete na stránce verze modulu plug-in.

    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. Uveďte dostupné moduly plug-in a potvrďte, že je modul azure-kv plug-in s verzí 1.2.0 součástí seznamu.

    notation plugin ls
    

Konfigurace proměnných prostředí

Poznámka:

Pro snadné provádění příkazů v kurzu zadejte hodnoty prostředků Azure tak, aby odpovídaly existujícím prostředkům ACR a AKV.

  1. Nakonfigurujte názvy prostředků 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
    
  2. Nakonfigurujte názvy prostředků ACR a image.

    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
    

Přihlášení pomocí Azure CLI

az login

Další informace o Azure CLI a o tom, jak se k němu přihlásit, najdete v tématu Přihlášení pomocí Azure CLI.

Zabezpečená přístupová oprávnění pro ACR a AKV

Při práci s ACR a AKV je nezbytné udělit příslušná oprávnění k zajištění zabezpečeného a řízeného přístupu. V závislosti na konkrétních scénářích můžete autorizovat přístup pro různé entity, jako jsou instanční objekty, instanční objekty nebo spravované identity. V tomto kurzu má přístup oprávnění přihlášeného uživatele Azure.

Autorizace přístupu k ACR

Role AcrPull a AcrPush role se vyžadují pro podepisování imagí kontejneru v ACR.

  1. Nastavení předplatného obsahujícího prostředek ACR

    az account set --subscription $ACR_SUB_ID
    
  2. Přiřazení rolí

    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"
    

Autorizace přístupu k AKV

V této části prozkoumáme dvě možnosti autorizace přístupu k AKV.

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 Userpro č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í Azure RBAC najdete v tématu Použití Azure RBAC ke správě přístupu.

  1. Nastavení předplatného obsahujícího prostředek AKV

    az account set --subscription $AKV_SUB_ID
    
  2. Přiřazení rolí

    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 v AKV (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.

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

    az account set --subscription $AKV_SUB_ID
    
  2. Nastavte zásady přístupu v 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
    

Důležité

Tento příklad ukazuje minimální oprávnění potřebná 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 v AKV (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.

    Jakmile se soubor zásad certifikátu spustí, jak je uvedeno níže, vytvoří platný certifikát kompatibilní s požadavkem na certifikát notárního projektu v AKV. Hodnota ekus pro podepisování kódu, ale není vyžadována pro zápis artefaktů. Předmět se použije později jako identita důvěryhodnosti, kterou uživatel při ověřování důvěřuje.

    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
    

Podepsání image kontejneru pomocí notačního rozhraní příkazového řádku a modulu plug-in AKV

  1. Ověřte se ve službě ACR 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žíváte az acr login nebo docker login se ověřuje ve službě ACR, vaše přihlašovací údaje jsou už uložené a dostupné pro zápis. V takovém případě nemusíte znovu spouštět notation login , abyste se ověřili ve službě ACR. Další informace o možnostech ověřování pro zápis najdete v tématu Ověřování pomocí registrů kompatibilních s OCI.

  1. Sestavte a nasdílíte novou image pomocí ACR Tasks. 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 už je image v tomto kurzu sestavená a uložená v registru, slouží značka jako identifikátor pro tuto image, aby byla pro usnadnění použití.

    IMAGE=$REGISTRY/${REPO}:$TAG
    
  2. Získejte ID klíče podpisového klíče. Certifikát v AKV 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)
    
  3. Podepište image kontejneru pomocí formátu podpisu COSE pomocí ID podpisového klíče. Pokud chcete podepsat certifikát podepsaný svým držitelem, musíte nastavit hodnotu self_signed=truekonfigurace modulu plug-in .

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

    Pokud se chcete ve výchozím nastavení ověřit pomocí AKV, zkusí se v pořadí vyzkoušet následující typy přihlašovacích údajů:

    Pokud chcete zadat typ přihlašovacích údajů, použijte další konfiguraci modulu plug-in s názvem credential_type. Můžete například explicitně nastavit credential_type azurecli použití přihlašovacích údajů Azure CLI, jak je znázorněno níže:

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

    Hodnoty různých typů přihlašovacích credential_type údajů najdete v následující tabulce.

    Typ přihlašovacích údajů Hodnota pro credential_type
    Přihlašovací údaje prostředí environment
    Přihlašovací údaje identit úloh workloadid
    Přihlašovací údaje spravované identity managedid
    Přihlašovací údaje Azure CLI azurecli
  4. Zobrazte graf podepsaných obrázků a přidružených podpisů.

    notation ls $IMAGE
    

Ověření image kontejneru pomocí rozhraní příkazového řádku notace

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 použitý v tomto kurzu je kořenový certifikát samotný certifikát podepsaný svým držitelem.

  1. Stáhněte si veřejný certifikát.

    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. Vypíše certifikát, 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, která se vztahuje na všechny artefakty v $REGISTRY/$REPO a používá pojmenované úložiště $STORE_NAME důvěryhodnosti typu $STORE_TYPE. Předpokládá také, že uživatel důvěřuje konkrétní identitě s předmětem $CERT_SUBJECTX.509 . Další podrobnosti najdete v tématu Specifikace zásad důvěryhodnosti a úložiště 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ý jsme vytvořili dříve.

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

    notation verify $IMAGE
    

    Po úspěšném ověření image pomocí zásady důvěryhodnosti se hodnota hash sha256 ověřeného obrázku vrátí v úspěšné výstupní zprávě.

Časové razítko

Vzhledem k tomu, notation verze 1.2.0, notation podporuje RFC 3161 kompatibilní časové razítko. 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), což umožňuje úspěšné ověření podpisu i po vypršení platnosti certifikátů. Jako podepisovač obrázků byste měli zajistit, abyste podepisovali image kontejnerů s časovými razítky vygenerovanými důvěryhodným TSA. Jako ověřovatel imagí, abyste ověřili časová razítka, měli byste zajistit, abyste důvěřovali podepisovači i přidruženému pomocníkovi pro ověřování identit a důvěryhodnosti prostřednictvím úložišť důvěryhodnosti 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, což je zvláště důležité při použití krátkodobých certifikátů. Podrobné pokyny k podepsání a ověření pomocí časového razítka najdete v průvodci časovým razítkem notáře.

Další kroky

Notace také poskytuje řešení CI/CD pro Azure Pipeline a pracovní postup GitHub Actions:

Ověření podepsaného nasazení image v AKS nebo Kubernetes: