Containerinstallatiekopieën ondertekenen met Notatie en Azure Key Vault met behulp van een zelfondertekend certificaat

Het ondertekenen van containerinstallatiekopieën is een proces dat de authenticiteit en integriteit ervan garandeert. Dit wordt bereikt door een digitale handtekening toe te voegen aan de containerinstallatiekopieën, die tijdens de implementatie kunnen worden gevalideerd. Met de handtekening kunt u controleren of de installatiekopieën afkomstig zijn van een vertrouwde uitgever en niet zijn gewijzigd. Notatie is een opensource-toeleveringsketenprogramma dat is ontwikkeld door het Notary Project, dat ondersteuning biedt voor het ondertekenen en verifiëren van containerinstallatiekopieën en andere artefacten. De Azure Key Vault (AKV) wordt gebruikt om certificaten op te slaan met ondertekeningssleutels die kunnen worden gebruikt door Notation met de AKV-invoegtoepassing Notation (azure-kv) om containerinstallatiekopieën en andere artefacten te ondertekenen en te verifiëren. Met azure Container Registry (ACR) kunt u handtekeningen toevoegen aan containerinstallatiekopieën en andere artefacten en deze handtekeningen weergeven.

In deze zelfstudie:

  • Notation CLI en AKV-invoegtoepassing installeren
  • Een zelfondertekend certificaat maken in AKV
  • Een containerinstallatiekopieën bouwen en pushen met ACR Tasks
  • Een containerinstallatiekopieën ondertekenen met de Notation CLI en de AKV-invoegtoepassing
  • Een containerinstallatiekopieën valideren op basis van de handtekening met notatie CLI

Vereisten

Notation CLI en AKV-invoegtoepassing installeren

  1. Installeer Notation v1.1.0 in een Linux amd64-omgeving. Volg de installatiehandleiding voor notatie om het pakket voor andere omgevingen te downloaden.

    # Download, extract and install
    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.1.0/notation_1.1.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. Installeer de invoegtoepassing azure-kv Notation Azure Key Vault v1.0.2 in een Linux amd64-omgeving.

    Notitie

    De URL en SHA256-controlesom voor de Azure Key Vault-invoegtoepassing notatie vindt u op de releasepagina van de invoegtoepassing.

    notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.0.2/notation-azure-kv_1.0.2_linux_amd64.tar.gz --sha256sum f2b2e131a435b6a9742c202237b9aceda81859e6d4bd6242c2568ba556cee20e
    
  3. Vermeld de beschikbare invoegtoepassingen en controleer of de azure-kv invoegtoepassing met versie 1.0.2 is opgenomen in de lijst.

    notation plugin ls
    

Omgevingsvariabelen configureren

Notitie

Voor een eenvoudige uitvoering van opdrachten in de zelfstudie geeft u waarden op voor de Azure-resources die overeenkomen met de bestaande ACR- en AKV-resources.

  1. Configureer AKV-resourcenamen.

    # 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. ACR- en afbeeldingsresourcenamen configureren.

    # 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
    

Aanmelden met Azure CLI

az login

Zie Aanmelden met Azure CLI voor meer informatie over Azure CLI en hoe u zich hiermee kunt aanmelden.

Toegangsbeleid toewijzen in AKV (Azure CLI)

Een gebruikersprincipaal met de juiste toegangsbeleidsmachtigingen is nodig om een zelfondertekend certificaat te maken en artefacten te ondertekenen. Deze principal kan een gebruikers-principal, service-principal of beheerde identiteit zijn. Deze principal heeft minimaal de volgende machtigingen nodig:

  • Create machtigingen voor certificaten
  • Get machtigingen voor certificaten
  • Sign machtigingen voor sleutels

In deze zelfstudie wordt het toegangsbeleid toegewezen aan een aangemelde Azure-gebruiker. Zie Toegangsbeleid toewijzen voor meer informatie over het toewijzen van beleid aan een principal.

Het abonnement instellen dat de AKV-resource bevat

az account set --subscription <your_subscription_id>

Het toegangsbeleid instellen in 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

Belangrijk

In dit voorbeeld ziet u de minimale machtigingen die nodig zijn voor het maken van een certificaat en het ondertekenen van een containerinstallatiekopieën. Afhankelijk van uw vereisten moet u mogelijk extra machtigingen verlenen.

Een zelfondertekend certificaat maken in AKV (Azure CLI)

De volgende stappen laten zien hoe u een zelfondertekend certificaat maakt voor testdoeleinden.

  1. Maak een certificaatbeleidsbestand.

    Zodra het certificaatbeleidsbestand is uitgevoerd zoals hieronder, wordt er een geldig certificaat gemaakt dat compatibel is met de certificaatvereiste notary Project in AKV. De waarde voor ekus is bedoeld voor ondertekening van programmacode, maar is niet vereist voor notatie om artefacten te ondertekenen. Het onderwerp wordt later gebruikt als vertrouwensidentiteit die door de gebruiker wordt vertrouwd tijdens de verificatie.

    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. Maak het certificaat.

    az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
    

Een containerinstallatiekopieën ondertekenen met de Notation CLI en de AKV-invoegtoepassing

  1. Verifieer bij uw ACR met behulp van uw afzonderlijke Azure-identiteit.

    az acr login --name $ACR_NAME
    

Belangrijk

Als Docker op uw systeem is geïnstalleerd en gebruikt az acr login of docker login om te verifiëren bij uw ACR, worden uw referenties al opgeslagen en beschikbaar voor notatie. In dit geval hoeft u niet opnieuw uit te voeren notation login om te verifiëren bij uw ACR. Zie Verifiëren met OCI-compatibele registers voor meer informatie over verificatieopties voor notatie.

  1. Bouw en push een nieuwe installatiekopieën met ACR Tasks. Gebruik altijd de digest-waarde om de afbeelding te identificeren voor ondertekening, omdat tags veranderlijk zijn en kunnen worden overschreven.

    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
    

    In deze zelfstudie, als de installatiekopie al is gemaakt en is opgeslagen in het register, fungeert de tag als een id voor die installatiekopie voor het gemak.

    IMAGE=$REGISTRY/${REPO}:$TAG
    
  2. Haal de sleutel-id van de ondertekeningssleutel op. Een certificaat in AKV kan meerdere versies hebben. De volgende opdracht haalt de sleutel-id van de nieuwste versie op.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
    
  3. Onderteken de containerinstallatiekopieën met de COSE-handtekeningindeling met behulp van de ondertekeningssleutel-id. Als u zich wilt aanmelden met een zelfondertekend certificaat, moet u de configuratiewaarde self_signed=truevan de invoegtoepassing instellen.

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
    
  4. Bekijk de grafiek met ondertekende afbeeldingen en bijbehorende handtekeningen.

    notation ls $IMAGE
    

Een containerinstallatiekopieën controleren met de Notatie-CLI

Als u de containerinstallatiekopie wilt controleren, voegt u het basiscertificaat toe dat het certificaat ondertekent in het vertrouwensarchief en maakt u vertrouwensbeleid voor verificatie. Voor het zelfondertekende certificaat dat in deze zelfstudie wordt gebruikt, is het basiscertificaat het zelfondertekende certificaat zelf.

  1. Download een openbaar certificaat.

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. Voeg het gedownloade openbare certificaat toe aan het vertrouwensarchief met de naam voor handtekeningverificatie.

    STORE_TYPE="ca"
    STORE_NAME="wabbit-networks.io"
    notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
    
  3. Geef het certificaat weer om te bevestigen.

    notation cert ls
    
  4. Configureer vertrouwensbeleid vóór verificatie.

    Met vertrouwensbeleid kunnen gebruikers een nauwkeurig verificatiebeleid opgeven. In het volgende voorbeeld wordt een vertrouwensbeleid geconfigureerd met de naam wabbit-networks-images, dat van toepassing is op alle artefacten in $REGISTRY/$REPO en het benoemde vertrouwensarchief $STORE_NAME van het type $STORE_TYPEgebruikt. Ook wordt ervan uitgegaan dat de gebruiker een specifieke identiteit vertrouwt met het onderwerp $CERT_SUBJECTX.509. Zie De specificatie van het vertrouwensarchief en het vertrouwensbeleid voor meer informatie.

    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. Hiermee notation policy importeert u de configuratie van het vertrouwensbeleid uit een JSON-bestand dat u eerder hebt gemaakt.

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. Gebruik notation verify dit om te controleren of de containerinstallatiekopieën sinds de buildtijd niet zijn gewijzigd.

    notation verify $IMAGE
    

    Na een geslaagde verificatie van de installatiekopie met behulp van het vertrouwensbeleid wordt de sha256-samenvatting van de geverifieerde installatiekopie geretourneerd in een geslaagd uitvoerbericht.

Volgende stappen

Zie Afbeeldingsintegriteit gebruiken om ondertekende installatiekopieën te valideren voordat u ze implementeert in uw AKS-clusters (Azure Kubernetes Service) en Ratificeren in Azure om aan de slag te gaan met het verifiëren en controleren van ondertekende installatiekopieën voordat u ze implementeert op AKS.