Podpisywanie obrazów kontenerów za pomocą notacji i usługi Azure Key Vault przy użyciu certyfikatu z podpisem własnym

Podpisywanie obrazów kontenerów to proces zapewniający ich autentyczność i integralność. Można to osiągnąć przez dodanie podpisu cyfrowego do obrazu kontenera, który można zweryfikować podczas wdrażania. Podpis pomaga sprawdzić, czy obraz pochodzi z zaufanego wydawcy i nie został zmodyfikowany. Notacja to narzędzie łańcucha dostaw typu open source opracowane przez projekt notary, które obsługuje podpisywanie i weryfikowanie obrazów kontenerów oraz innych artefaktów. Usługa Azure Key Vault (AKV) służy do przechowywania certyfikatów z kluczami podpisywania, których można używać za pomocą wtyczki Notation AKV (azure-kv) do podpisywania i weryfikowania obrazów kontenerów i innych artefaktów. Usługa Azure Container Registry (ACR) umożliwia dołączanie podpisów do obrazów kontenerów i innych artefaktów, a także wyświetlanie tych podpisów.

W tym samouczku:

  • Instalowanie interfejsu wiersza polecenia notacji i wtyczki AKV
  • Tworzenie certyfikatu z podpisem własnym w usłudze AKV
  • Kompilowanie i wypychanie obrazu kontenera za pomocą usługi ACR Tasks
  • Podpisywanie obrazu kontenera przy użyciu interfejsu wiersza polecenia notacji i wtyczki AKV
  • Weryfikowanie obrazu kontenera względem podpisu za pomocą interfejsu wiersza polecenia notacji

Wymagania wstępne

Instalowanie interfejsu wiersza polecenia notacji i wtyczki AKV

  1. Zainstaluj notację w wersji 1.1.0 w środowisku systemu Linux amd64. Postępuj zgodnie z przewodnikiem instalacji notacji, aby pobrać pakiet dla innych środowisk.

    # 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. Zainstaluj wtyczkę azure-kv Notation Azure Key Vault w wersji 1.1.0 w środowisku systemu Linux amd64.

    Uwaga

    Adres URL i sumę kontrolną SHA256 dla wtyczki Notation Azure Key Vault można znaleźć na stronie wydania wtyczki.

    notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.1.0/notation-azure-kv_1.1.0_linux_amd64.tar.gz --sha256sum 2fc959bf850275246b044203609202329d015005574fabbf3e6393345e49b884
    
  3. Wyświetl listę dostępnych wtyczek i upewnij się, że wtyczka azure-kv z wersją 1.1.0 znajduje się na liście.

    notation plugin ls
    

Skonfiguruj zmienne środowiskowe

Uwaga

Aby ułatwić wykonywanie poleceń w samouczku, podaj wartości zasobów platformy Azure, aby dopasować je do istniejących zasobów usługi ACR i usługi AKV.

  1. Skonfiguruj nazwy zasobów usługi AKV.

    # 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. Konfigurowanie nazw zasobów usługi ACR i obrazów.

    # 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
    

Logowanie się za pomocą interfejsu wiersza polecenia platformy Azure

az login

Aby dowiedzieć się więcej na temat interfejsu wiersza polecenia platformy Azure i sposobu logowania się przy użyciu niego, zobacz Logowanie się przy użyciu interfejsu wiersza polecenia platformy Azure.

Przypisywanie zasad dostępu w usłudze AKV (interfejs wiersza polecenia platformy Azure)

Podmiot zabezpieczeń użytkownika z odpowiednimi uprawnieniami zasad dostępu jest wymagany do utworzenia certyfikatu z podpisem własnym i artefaktów podpisywania. Ten podmiot zabezpieczeń może być jednostką użytkownika, jednostką usługi lub tożsamością zarządzaną. Co najmniej ten podmiot zabezpieczeń wymaga następujących uprawnień:

  • Create uprawnienia do certyfikatów
  • Get uprawnienia do certyfikatów
  • Sign uprawnienia dla kluczy

W tym samouczku zasady dostępu są przypisywane do zalogowanego użytkownika platformy Azure. Aby dowiedzieć się więcej na temat przypisywania zasad do podmiotu zabezpieczeń, zobacz Przypisywanie zasad dostępu.

Ustawianie subskrypcji zawierającej zasób usługi AKV

az account set --subscription <your_subscription_id>

Ustawianie zasad dostępu w usłudze 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

Ważne

W tym przykładzie przedstawiono minimalne uprawnienia wymagane do utworzenia certyfikatu i podpisania obrazu kontenera. W zależności od wymagań może być konieczne przyznanie dodatkowych uprawnień.

Tworzenie certyfikatu z podpisem własnym w usłudze AKV (interfejs wiersza polecenia platformy Azure)

W poniższych krokach pokazano, jak utworzyć certyfikat z podpisem własnym na potrzeby testowania.

  1. Utwórz plik zasad certyfikatu.

    Po wykonaniu pliku zasad certyfikatu, jak pokazano poniżej, tworzy prawidłowy certyfikat zgodny z wymaganiami certyfikatu programu Project notary w usłudze AKV. Wartość parametru ekus dotyczy podpisywania kodu, ale nie jest wymagana do notacji w celu podpisania artefaktów. Temat jest używany później jako tożsamość zaufania, której ufa użytkownik podczas weryfikacji.

    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. Utwórz certyfikat.

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

Podpisywanie obrazu kontenera przy użyciu interfejsu wiersza polecenia notacji i wtyczki AKV

  1. Uwierzytelnianie w usłudze ACR przy użyciu indywidualnej tożsamości platformy Azure.

    az acr login --name $ACR_NAME
    

Ważne

Jeśli platforma Docker jest zainstalowana w systemie i używana az acr login do uwierzytelniania w usłudze ACR, docker login poświadczenia są już przechowywane i dostępne do notacji. W takim przypadku nie trzeba uruchamiać notation login ponownie, aby uwierzytelnić się w usłudze ACR. Aby dowiedzieć się więcej na temat opcji uwierzytelniania dla notacji, zobacz Uwierzytelnianie przy użyciu rejestrów zgodnych z protokołem OCI.

  1. Skompiluj i wypchnij nowy obraz za pomocą usługi ACR Tasks. Zawsze używaj wartości skrótu, aby zidentyfikować obraz do podpisywania, ponieważ tagi są modyfikowalne i można je zastąpić.

    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
    

    W tym samouczku, jeśli obraz został już skompilowany i jest przechowywany w rejestrze, tag służy jako identyfikator dla tego obrazu dla wygody.

    IMAGE=$REGISTRY/${REPO}:$TAG
    
  2. Pobierz identyfikator klucza podpisywania. Certyfikat w usłudze AKV może mieć wiele wersji. Następujące polecenie pobiera identyfikator klucza najnowszej wersji.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
    
  3. Podpisz obraz kontenera przy użyciu formatu podpisu COSE przy użyciu identyfikatora klucza podpisywania. Aby zalogować się przy użyciu certyfikatu z podpisem własnym, należy ustawić wartość self_signed=truekonfiguracji wtyczki .

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

    Aby uwierzytelnić się za pomocą usługi AKV, domyślnie następujące typy poświadczeń, jeśli są włączone, zostaną wypróbowane w następującej kolejności:

    Jeśli chcesz określić typ poświadczeń, użyj dodatkowej konfiguracji wtyczki o nazwie credential_type. Możesz na przykład jawnie ustawić wartość credential_type na azurecli potrzeby korzystania z poświadczeń interfejsu wiersza polecenia platformy Azure, jak pokazano poniżej:

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

    Poniższa tabela zawiera wartości credential_type różnych typów poświadczeń.

    Typ poświadczeń Wartość dla credential_type
    Poświadczenia środowiska environment
    Poświadczenia tożsamości obciążenia workloadid
    Poświadczenia tożsamości zarządzanej managedid
    Poświadczenia interfejsu wiersza polecenia platformy Azure azurecli
  4. Wyświetl graf podpisanych obrazów i skojarzonych podpisów.

    notation ls $IMAGE
    

Weryfikowanie obrazu kontenera za pomocą interfejsu wiersza polecenia notacji

Aby zweryfikować obraz kontenera, dodaj certyfikat główny podpisujący certyfikat liścia do magazynu zaufania i utwórz zasady zaufania na potrzeby weryfikacji. W przypadku certyfikatu z podpisem własnym używanego w tym samouczku certyfikat główny jest certyfikatem z podpisem własnym.

  1. Pobierz certyfikat publiczny.

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. Dodaj pobrany certyfikat publiczny do nazwanego magazynu zaufania na potrzeby weryfikacji podpisu.

    STORE_TYPE="ca"
    STORE_NAME="wabbit-networks.io"
    notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
    
  3. Wyświetl listę certyfikatów, aby potwierdzić.

    notation cert ls
    
  4. Skonfiguruj zasady zaufania przed weryfikacją.

    Zasady zaufania umożliwiają użytkownikom określanie dostrojonych zasad weryfikacji. W poniższym przykładzie skonfigurowano zasady zaufania o nazwie wabbit-networks-images, które mają zastosowanie do wszystkich artefaktów w $REGISTRY/$REPO programie i używają nazwanego magazynu $STORE_NAME zaufania typu $STORE_TYPE. Przyjęto również założenie, że użytkownik ufa określonej tożsamości z tematem $CERT_SUBJECTX.509 . Aby uzyskać więcej informacji, zobacz Specyfikacje zasad zaufania i magazynu zaufania.

    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. Użyj polecenia notation policy , aby zaimportować konfigurację zasad zaufania z utworzonego wcześniej pliku JSON.

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. Użyj polecenia notation verify , aby sprawdzić, czy obraz kontenera nie został zmieniony od czasu kompilacji.

    notation verify $IMAGE
    

    Po pomyślnej weryfikacji obrazu przy użyciu zasad zaufania skrót sha256 zweryfikowanego obrazu jest zwracany w pomyślnym komunikacie wyjściowym.

Następne kroki

Zobacz Używanie integralności obrazów do weryfikowania podpisanych obrazów przed wdrożeniem ich w klastrach usługi Azure Kubernetes Service (wersja zapoznawcza) i Ratify na platformie Azure , aby rozpocząć weryfikowanie podpisanych obrazów i przeprowadzanie inspekcji ich przed wdrożeniem ich w usłudze AKS.