Delen via


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-toeleveringsketenbeveiligingsprogramma dat is ontwikkeld door de Notary Project-community en wordt ondersteund door Microsoft, 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 ondertekenen met de Notation CLI en de AKV-invoegtoepassing
  • Een containerinstallatiekopieën valideren op basis van de handtekening met notatie CLI
  • Tijdstempel

Vereisten

Notation CLI en AKV-invoegtoepassing installeren

  1. Installeer Notation v1.2.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.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. Installeer de invoegtoepassing azure-kv Notation Azure Key Vault v1.2.0 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.2.0/notation-azure-kv_1.2.0_linux_amd64.tar.gz --sha256sum 06bb5198af31ce11b08c4557ae4c2cbfb09878dfa6b637b7407ebc2d57b87b34
    
  3. Vermeld de beschikbare invoegtoepassingen en controleer of de azure-kv invoegtoepassing met versie 1.2.0 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.

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

    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
    

Aanmelden met Azure CLI

az login

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

Toegangsmachtigingen voor ACR en AKV beveiligen

Wanneer u met ACR en AKV werkt, is het essentieel om de juiste machtigingen te verlenen om veilige en gecontroleerde toegang te garanderen. U kunt toegang verlenen voor verschillende entiteiten, zoals gebruikers-principals, service-principals of beheerde identiteiten, afhankelijk van uw specifieke scenario's. In deze zelfstudie is de toegang gemachtigd voor een aangemelde Azure-gebruiker.

Toegang tot ACR autoriseren

De AcrPull en AcrPush rollen zijn vereist voor het ondertekenen van containerinstallatiekopieën in ACR.

  1. Het abonnement instellen dat de ACR-resource bevat

    az account set --subscription $ACR_SUB_ID
    
  2. De rollen toewijzen

    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"
    

Toegang tot AKV autoriseren

In deze sectie verkennen we twee opties voor het autoriseren van toegang tot AKV.

De volgende rollen zijn vereist voor het ondertekenen met behulp van zelfondertekende certificaten:

  • Key Vault Certificates Officer voor het maken en lezen van certificaten
  • Key Vault Certificates Uservoor het lezen van bestaande certificaten
  • Key Vault Crypto User voor ondertekeningsbewerkingen

Zie Een Azure RBAC gebruiken om toegang te beheren voor meer informatie over Key Vault-toegang met Azure RBAC.

  1. Het abonnement instellen dat de AKV-resource bevat

    az account set --subscription $AKV_SUB_ID
    
  2. De rollen toewijzen

    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"
    

Toegangsbeleid toewijzen in AKV (verouderd)

De volgende machtigingen zijn vereist voor een identiteit:

  • Create machtigingen voor het maken van een certificaat
  • Get machtigingen voor het lezen van bestaande certificaten
  • Sign machtigingen voor ondertekeningsbewerkingen

Zie Toegangsbeleid toewijzen voor meer informatie over het toewijzen van beleid aan een principal.

  1. Stel het abonnement in dat de AKV-resource bevat:

    az account set --subscription $AKV_SUB_ID
    
  2. Stel het toegangsbeleid in AKV in:

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

    Voor verificatie met AKV worden standaard de volgende referentietypen geprobeerd als deze optie is ingeschakeld:

    Als u een referentietype wilt opgeven, gebruikt u een extra configuratie van de invoegtoepassing met de naam credential_type. U kunt bijvoorbeeld expliciet instellen credential_type op azurecli het gebruik van Azure CLI-referenties, zoals hieronder wordt weergegeven:

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

    Zie de onderstaande tabel voor de waarden voor credential_type verschillende referentietypen.

    Referentietype Waarde voor credential_type
    Omgevingsreferenties environment
    Referentie voor workloadidentiteit workloadid
    Referenties voor beheerde identiteit managedid
    Azure CLI-referentie azurecli
  4. Bekijk de grafiek met ondertekende afbeeldingen en bijbehorende handtekeningen.

    notation ls $IMAGE
    

Een containerinstallatiekopie 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.

Tijdstempel

Sinds de release van Notation v1.2.0 ondersteunt Notation RFC 3161-compatibele tijdstempels. Deze verbetering breidt het vertrouwen uit van handtekeningen die zijn gemaakt binnen de geldigheidsperiode van het certificaat door een TSA (Timestamping Authority) te vertrouwen, waardoor een geslaagde handtekeningverificatie mogelijk is, zelfs nadat de certificaten zijn verlopen. Als ondertekenaar van een installatiekopie moet u ervoor zorgen dat u containerinstallatiekopieën ondertekent met tijdstempels die zijn gegenereerd door een vertrouwde TSA. Als afbeeldingscontrole moet u ervoor zorgen dat u zowel de ondertekenaar van de installatiekopie als de bijbehorende TSA vertrouwt en een vertrouwensrelatie tot stand brengt via vertrouwensarchieven en vertrouwensbeleid. Tijdstempel vermindert de kosten door het periodiek opnieuw ondertekenen van installatiekopieën vanwege het verlopen van certificaten, wat met name essentieel is bij het gebruik van kortstondige certificaten. Raadpleeg de handleiding voor tijdstempels van Notary Project voor gedetailleerde instructies voor het ondertekenen en verifiëren van tijdstempels.

Volgende stappen

Notatie biedt ook CI/CD-oplossingen in Azure Pipeline en GitHub Actions Workflow:

De implementatie van ondertekende installatiekopieën valideren in AKS of Kubernetes: