Podepisování obrazů kontejnerů pomocí notace a podpisování artefaktů

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.

Tento článek se zaměřuje na podepisování pomocí nástrojů projektu Notary, Notation, a podepisování artefaktů:

  • Dozvíte se tady: Jak pomocí rozhraní příkazového řádku (CLI) Notation podepisovat artefakty.
  • Kde se hodí: Podepisování artefaktů je alternativou ke službě Azure Key Vault. Ačkoliv služba Key Vault poskytuje organizacím úplnou kontrolu nad správou životního cyklu certifikátů, podepisování artefaktů nabízí zjednodušené prostředí pro podepisování s automatizovanou správou životního cyklu certifikátů a krátkodobými certifikáty.
  • Proč je důležité: Podepisování artefaktů zjednodušuje vývojářské prostředí a zároveň poskytuje silné záruky identit. Pomáhá týmům snižovat provozní složitost bez ohrožení zabezpečení.

Požadavky

Než budete moct podepsat a ověřit image kontejnerů pomocí notace a podepisování artefaktů, musíte nastavit požadované prostředky Azure a nainstalovat potřebné nástroje. Tato část vás provede přípravou služby Azure Container Registry, konfigurací podepisování artefaktů a nastavením Azure CLI jako vývojového prostředí.

Příprava imagí kontejnerů ve službě Azure Container Registry

  1. Vytvořte nebo použijte registr kontejneru k ukládání imagí kontejnerů, artefaktů OCI a podpisů.
  2. Nahrát nebo použít obraz kontejneru do registru kontejneru.

Nastavení podepisování artefaktů

Vytvořte ve svém předplatném Azure účet a profil certifikátu pro podepisování artefaktů.

Váš profil certifikátu musí obsahovat zemi/oblast (C), stát nebo kraj (ST nebo S) a organizaci (O) v předmětu certifikátu. Specifikace notářského projektu vyžaduje tato pole.

Nastavení Azure CLI

Nainstalujte Azure CLI nebo použijte Azure Cloud Shell.

Nainstalujte rozhraní příkazového řádku Notation a modul plug-in pro podepisování artefaktů.

Tato příručka spouští příkazy v systémech Linux AMD64 a Windows jako příklady.

  1. Instalace Notation CLI v1.3.2:

    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.3.2/notation_1.3.2_linux_amd64.tar.gz
    # Validate the checksum
    EXPECTED_SHA256SUM="e1a0f060308086bf8020b2d31defb7c5348f133ca0dba6a1a7820ef3cbb6dfe5"
    echo "$EXPECTED_SHA256SUM  notation.tar.gz" | sha256sum -c -
    # Continue if sha256sum matches
    tar xvzf notation.tar.gz
    cp ./notation /usr/local/bin
    

    Pro informace o dalších platformách si přečtěte průvodce instalací notačního systému.

  2. Nainstalujte modul plug-in Pro podepisování artefaktů:

    notation plugin install --url "https://github.com/Azure/artifact-signing-notation-plugin/releases/download/v1.0.0/notation-azure-artifactsigning_1.0.0_linux_amd64.tar.gz" --sha256sum 2f45891a14aa9c88c9bee3d11a887c1adbe9d2d24e50de4bc4b4fa3fe595292f
    

    Najděte nejnovější adresu URL modulu plug-in a kontrolní součet na stránce vydané verze.

  3. Ověřte instalaci modulu plug-in:

    notation plugin ls
    

    Příklad výstupu:

    NAME                    DESCRIPTION                                             VERSION   CAPABILITIES                ERROR
    azure-artifactsigning   Sign OCI artifacts using the Artifact Signing Service   1.0.0     [SIGNATURE_GENERATOR.RAW]   <nil>
    

Konfigurace proměnných prostředí

Nastavte následující proměnné prostředí pro použití v následných příkazech. Zástupné symboly nahraďte skutečnými hodnotami.

Požadované hodnoty najdete na webu Azure Portal:

  • Informace o účtu Podepisování artefaktů získáte tak, že přejdete na svůj účet a pak vyberete Přehled.
  • Informace o profilu certifikátu získáte tak, že přejdete na svůj účet a pak vyberete Objekty>Profily certifikátů.
# Artifact Signing environment variables
AS_SUB_ID="<subscription-id>"
AS_ACCT_RG=<ts-account-resource-group>
AS_ACCT_NAME=<ts-account-name>
AS_ACCT_URL=<ts-account-url>
AS_CERT_PROFILE=<ts-cert-profile>
AS_CERT_SUBJECT=<ts-cert-subject>
AS_SIGNING_ROOT_CERT="https://www.microsoft.com/pkiops/certs/Microsoft%20Enterprise%20Identity%20Verification%20Root%20Certificate%20Authority%202020.crt"
AS_TSA_URL="http://timestamp.acs.microsoft.com/"
AS_TSA_ROOT_CERT="http://www.microsoft.com/pkiops/certs/microsoft%20identity%20verification%20root%20certificate%20authority%202020.crt"

# Azure Container Registry and image environment variables
ACR_SUB_ID="<acr-subscription-id>"
ACR_RG=<acr-resource-group>
ACR_NAME=<registry-name>
ACR_LOGIN_SERVER=$ACR_NAME.azurecr.io
REPOSITORY=<repository>
TAG=<tag>
IMAGE=$ACR_LOGIN_SERVER/${REPOSITORY}:$TAG

Přihlásit se do Azure

Pomocí Azure CLI se přihlaste pomocí identity uživatele:

az login
USER_ID=$(az ad signed-in-user show --query id -o tsv)

Poznámka:

Tato příručka ukazuje přihlášení pomocí uživatelského účtu. Další možnosti identity, včetně spravované identity, najdete v tématu Ověřování v Azure pomocí Azure CLI.

Přiřazení oprávnění ke službě Azure Container Registry a podepisování artefaktů

Udělte identitě potřebné role pro přístup ke službě Container Registry:

  • Pro registry, které mají povolené řízení přístupu na základě atributů (ABAC), přiřaďte:
    • Container Registry Repository Reader
    • Container Registry Repository Writer
  • Pro registry jiného typu než ABAC přiřaďte:
    • AcrPull
    • AcrPush
az role assignment create --role "Container Registry Repository Reader" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
az role assignment create --role "Container Registry Repository Writer" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"

Přiřaďte roli Artifact Signing Certificate Profile Signer k vaší identitě, abyste ji mohli podepsat pomocí podepisování artefaktů:

az role assignment create --assignee $USER_ID --role "Artifact Signing Certificate Profile Signer" --scope "/subscriptions/$AS_SUB_ID/resourceGroups/$AS_ACCT_RG/providers/Microsoft.CodeSigning/codeSigningAccounts/$AS_ACCT_NAME/certificateProfiles/$AS_CERT_PROFILE"

Podepište obraz kontejneru

# Authenticate to Azure Container Registry
az acr login --name $ACR_NAME

# Download the timestamping root certificate
curl -o msft-tsa-root-certificate-authority-2020.crt $AS_TSA_ROOT_CERT

# Sign the image
notation sign --signature-format cose --timestamp-url $AS_TSA_URL --timestamp-root-cert "msft-tsa-root-certificate-authority-2020.crt" --id $AS_CERT_PROFILE --plugin azure-artifactsigning --plugin-config accountName=$AS_ACCT_NAME --plugin-config baseUrl=$AS_ACCT_URL --plugin-config certProfile=$AS_CERT_PROFILE $IMAGE

Vysvětlení klíčových příznaků:

  • --signature-format cose: Pro podpisy používá formát podepisování a šifrování objektů CBOR (COSE).
  • --timestamp-url: Používá server časového razítka, který podporuje podepisování artefaktů.
  • --plugin-config: Předá konfiguraci plug-inu pro podepisování artefaktů.

Výpis podepsaných obrázků a podpisů:

notation ls $IMAGE

Příklad výstupu:

myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
└── application/vnd.cncf.notary.signature
    └── sha256:d3a4c9fbc17e27b19a0b28e7b6a33f2c0f541dbdf8d2e5e8d0d79a835e8a76f2a

Ověřit kontejnerovou image

  1. Stažení a přidání kořenových certifikátů:

    curl -o msft-root-certificate-authority-2020.crt $AS_SIGNING_ROOT_CERT
    SIGNING_TRUST_STORE="myRootCerts"
    notation cert add --type ca --store $SIGNING_TRUST_STORE msft-root-certificate-authority-2020.crt
    
    curl -o msft-tsa-root-certificate-authority-2020.crt $AS_TSA_ROOT_CERT
    TSA_TRUST_STORE="myTsaRootCerts"
    notation cert add -t tsa -s $TSA_TRUST_STORE msft-tsa-root-certificate-authority-2020.crt
    notation cert ls
    

  1. Vytvořte soubor JSON zásad důvěryhodnosti:

    cat <<EOF > trustpolicy.json
    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "myPolicy",
                "registryScopes": [ "$ACR_LOGIN_SERVER/$REPOSITORY" ],
                "signatureVerification": {
                    "level" : "strict"
                },
                "trustStores": [ "ca:$SIGNING_TRUST_STORE", "tsa:$TSA_TRUST_STORE" ],
                "trustedIdentities": [
                    "x509.subject: $AS_CERT_SUBJECT"
                ]
            }
        ]
    }
    EOF
    

    Importujte a zkontrolujte politiku.

    notation policy import trustpolicy.json
    notation policy show
    

  1. Ověřte obrázek:

    notation verify $IMAGE
    

    Příklad výstupu:

    Successfully verified signature for myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
    

    Pokud se ověření nezdaří, ujistěte se, že jsou správně nakonfigurované zásady důvěryhodnosti a certifikáty.