Sdílet prostřednictvím


Podepisování imagí kontejnerů pomocí notace a služby Azure Key Vault pomocí certifikátu vydaného certifikační autoritou

Podepisování a ověřování imagí kontejnerů pomocí certifikátu vydaného důvěryhodnou certifikační autoritou (CA) je cenným postupem zabezpečení. Toto bezpečnostní opatření vám pomůže zodpovědně identifikovat, autorizovat a ověřit identitu vydavatele image kontejneru i samotné image kontejneru. Důvěryhodné certifikační autority (CA), jako jsou GlobalSign, DigiCert a další, hrají zásadní roli při ověřování identity uživatele nebo organizace, udržování zabezpečení digitálních certifikátů a odvolání certifikátu okamžitě po riziku nebo zneužití certifikátu.

Tady je několik základních komponent, které vám pomůžou podepsat a ověřit image kontejnerů pomocí certifikátu vydaného důvěryhodnou certifikační autoritou:

  • Notace je opensourcový nástroj pro zabezpečení dodavatelského řetězce vyvinutý komunitou notárního projectu, který podporuje podepisování a ověřování imagí kontejnerů a dalších artefaktů.
  • Cloudová služba Azure Key Vault (AKV) pro správu kryptografických klíčů, tajných klíčů a certifikátů vám pomůže zajistit bezpečné ukládání a správu certifikátu pomocí podpisového klíče.
  • Rozšíření Notation AKV plugin azure-kv používá klíče uložené ve službě Azure Key Vault k podepisování a ověřování digitálních podpisů imagí kontejnerů a artefaktů.
  • Azure Container Registry (ACR) umožňuje připojit tyto podpisy k podepsané imagi a pomáhá ukládat a spravovat tyto image kontejnerů.

Při ověření obrázku se podpis použije k ověření integrity obrázku a identity podepisující osoby. To pomáhá zajistit, aby image kontejnerů nebyly manipulovány a byly z důvěryhodného zdroje.

V tomto článku:

  • Instalace notačního modulu příkazového řádku a modulu plug-in AKV
  • Vytvoření nebo import certifikátu vydaného certifikační autoritou v AKV
  • Sestavení a nasdílení image kontejneru pomocí úlohy ACR
  • Podepsání image kontejneru pomocí notačního rozhraní příkazového řádku a modulu plug-in AKV
  • Ověření podpisu image kontejneru pomocí rozhraní příkazového řádku notace
  • Časové razítko

Požadavky

Poznámka:

Pro ukládání certifikátů doporučujeme vytvořit novou službu Azure Key Vault.

Instalace notačního modulu příkazového řádku a modulu plug-in 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 cli 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:

Tato příručka používá proměnné prostředí pro usnadnění konfigurace AKV a ACR. Aktualizujte hodnoty těchto proměnných prostředí pro konkrétní prostředky.

  1. Konfigurace proměnných prostředí pro AKV a certifikáty

    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"
    
  2. Nakonfigurujte proměnné prostředí pro 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 
    # 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.

Vytvoření nebo import certifikátu vydaného certifikační autoritou v AKV

Požadavky na certifikáty

Při vytváření certifikátů pro podepisování a ověřování musí certifikáty splňovat požadavek na certifikát notářského projektu.

Tady jsou požadavky na kořenové a zprostředkující certifikáty:

  • Rozšíření basicConstraints musí být přítomné a označené jako kritické. Pole CA musí být nastaveno true.
  • Rozšíření keyUsage musí být přítomno a označeno critical. Bitové pozice musí keyCertSign být nastaveny.

Tady jsou požadavky na certifikáty vydané certifikační autoritou:

  • Vlastnosti certifikátu X.509:
    • Předmět musí obsahovat běžný název (CN), zemi (C), stát nebo provincii (ST) a organizaci (O). V tomto kurzu $CERT_SUBJECT se používá jako předmět.
    • Příznak použití klíče X.509 musí být DigitalSignature pouze.
    • Rozšířené použití klíčů (EKU) musí být prázdné nebo 1.3.6.1.5.5.7.3.3 (pro kodesigning).
  • Vlastnosti klíče:
    • Vlastnost musí být nastavena exportable na falsehodnotu .
    • Ve specifikaci notářského projektu vyberte podporovaný typ a velikost klíče.

Důležité

Aby se zajistila úspěšná integrace s integritou image, měl by být typ obsahu certifikátu nastavený na PEM.

Poznámka:

Tato příručka používá verzi 1.0.1 modulu plug-in AKV. Předchozí verze modulu plug-in měly omezení, které vyžadovalo konkrétní objednávku certifikátu v řetězu certifikátů. Verze 1.0.1 modulu plug-in nemá toto omezení, proto doporučujeme používat verzi 1.0.1 nebo novější.

Vytvoření certifikátu vydaného certifikační autoritou

Vytvořte žádost o podepsání certifikátu (CSR) podle pokynů v žádosti o podepsání certifikátu.

Důležité

Při slučování CSR se ujistěte, že sloučíte celý řetězec, který jste vrátili od dodavatele certifikační autority.

Import certifikátu v AKV

Import certifikátu:

  1. Získejte soubor certifikátu od dodavatele certifikační autority s celým řetězem certifikátů.
  2. Importujte certifikát do služby Azure Key Vault podle pokynů v importu certifikátu.

Poznámka:

Pokud certifikát po vytvoření nebo importu neobsahuje řetěz certifikátů, můžete od dodavatele certifikační autority získat zprostředkující a kořenové certifikáty. Můžete požádat dodavatele, aby vám poskytl soubor PEM, který obsahuje zprostředkující certifikáty (pokud existuje) a kořenový certifikát. Tento soubor pak můžete použít v kroku 5 podepisování imagí kontejneru.

Podepsání image kontejneru pomocí notačního rozhraní příkazového řádku a modulu plug-in 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.

Přístup k ACR pro vytváření obsahu

Role AcrPull a AcrPush role se vyžadují pro vytváření a 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"
    

Sestavení a nasdílení imagí kontejnerů do ACR

  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 se používá digest k identifikaci obrázku pro podepisování, protože značky jsou proměnlivé a dají se 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

Přístup k AKV pro vytváření obsahu

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

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

    Pokud certifikát obsahuje celý řetěz certifikátů, musí být objekt zabezpečení přiřazený následujícími rolemi:

    • Key Vault Secrets User pro čtení tajných kódů
    • Key Vault Certificates Userpro čtení certifikátů
    • Key Vault Crypto User pro operace podepisování
    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"
    

    Pokud certifikát řetězec neobsahuje, musí být objekt zabezpečení přiřazený následujícími rolemi:

    • Key Vault Certificates Userpro čtení certifikátů
    • Key Vault Crypto User pro operace podepisování
    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"
    

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.

Použití zásad přístupu (starší verze)

Pokud chcete nastavit předplatné obsahující prostředky AKV, spusťte následující příkaz:

az account set --subscription $AKV_SUB_ID

Pokud certifikát obsahuje celý řetěz certifikátů, musí být objektu zabezpečení uděleno oprávnění ke klíči, oprávnění SignGetk tajnému klíči a oprávnění Getk certifikátu . Pokud chcete objektu zabezpečení udělit tato oprávnění:

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

Pokud certifikát neobsahuje řetěz, musí být objektu zabezpečení uděleno oprávnění Signke klíči a oprávnění Getk certifikátu . Pokud chcete objektu zabezpečení udělit tato oprávnění:

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

Další informace o přiřazování zásad k objektu zabezpečení najdete v tématu Přiřazení zásad přístupu.

Podepisování imagí kontejneru pomocí certifikátu v AKV

  1. Získejte ID klíče pro certifikát. Certifikát v AKV může mít více verzí. Následující příkaz získá ID klíče pro nejnovější verzi $CERT_NAME certifikátu.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv) 
    
  2. Podepište image kontejneru pomocí formátu podpisu COSE pomocí ID klíče.

    Pokud certifikát obsahuje celý řetěz certifikátů, spusťte následující příkaz:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv 
    

    Pokud certifikát neobsahuje řetěz, pomocí parametru --plugin-config ca_certs=<ca_bundle_file> předejte certifikáty certifikační autority v souboru PEM do modulu plug-in AKV, spusťte následující příkaz:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file> 
    

    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 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
  3. Zobrazte graf podepsaných obrázků a přidružených podpisů.

    notation ls $IMAGE
    

    V následujícím příkladu výstupu je podpis typu application/vnd.cncf.notary.signature identifikovaný hodnotou digest sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e přidružen k objektu $IMAGE.

    myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f
    └── application/vnd.cncf.notary.signature
        └── sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
    

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

  1. Přidejte kořenový certifikát do pojmenovaného úložiště důvěryhodnosti pro ověření podpisu. Pokud kořenový certifikát nemáte, můžete ho získat od certifikační autority. Následující příklad přidá kořenový certifikát $ROOT_CERT do $STORE_NAME úložiště důvěryhodnosti.

    STORE_TYPE="ca" 
    STORE_NAME="wabbit-networks.io" 
    notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT  
    
  2. Vytvořte seznam kořenového certifikátu a ověřte, že $ROOT_CERT se úspěšně přidal.

    notation cert ls 
    
  3. 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í. Ke konfiguraci zásad důvěryhodnosti použijte následující příkaz.

    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
    

    Výše uvedený trustpolicy.json soubor definuje jednu zásadu důvěryhodnosti s názvem wabbit-networks-images. Tato zásada důvěryhodnosti se vztahuje na všechny artefakty uložené v $REGISTRY/$REPO úložištích. Pojmenované úložiště $STORE_NAME důvěryhodnosti typu $STORE_TYPE obsahuje kořenové certifikáty. 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.

  4. Slouží notation policy k importu konfigurace zásad důvěryhodnosti z trustpolicy.json.

    notation policy import ./trustpolicy.json
    
  5. Zobrazte konfiguraci zásad důvěryhodnosti, abyste potvrdili její úspěšný import.

    notation policy show
    
  6. Slouží notation verify k ověření integrity image:

    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ě. Příklad výstupu:

    Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f

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

Často kladené dotazy

  • Co mám dělat, když vypršela platnost certifikátu?

    Pokud platnost certifikátu vypršela, musíte získat nový od důvěryhodného dodavatele certifikační autority spolu s novým privátním klíčem. Certifikát, jehož platnost vypršela, nelze použít k podepisování imagí kontejneru. U imagí, které byly podepsány před vypršením platnosti certifikátu, se můžou úspěšně ověřit, pokud byly podepsány pomocí časového razítka. Bez časového razítka se ověření podpisu nezdaří a k úspěšnému ověření budete muset tyto obrázky znovu podepsat novým certifikátem.

  • Co mám dělat, když je certifikát odvolán?

    Pokud je váš certifikát odvolán, zruší platnost podpisu. K tomu může dojít z několika důvodů, například k ohrožení privátního klíče nebo ke změnám v přidružení držitele certifikátu. Pokud chcete tento problém vyřešit, měli byste nejprve zajistit, aby zdrojový kód a prostředí sestavení byly aktuální a zabezpečené. Potom sestavte image kontejneru ze zdrojového kódu, získejte nový certifikát od důvěryhodného dodavatele certifikační autority spolu s novým privátním klíčem a podepište nové image kontejneru pomocí nového certifikátu podle této příručky.

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: