Otomatik olarak imzalanan sertifika kullanarak Notation ve Azure Key Vault ile kapsayıcı görüntülerini imzalama

Kapsayıcı görüntülerini imzalamak, özgünlüklerini ve bütünlüğünü sağlayan bir işlemdir. Bu, kapsayıcı görüntüsüne dağıtım sırasında doğrulanabilen bir dijital imza ekleyerek elde edilir. İmza, görüntünün güvenilir bir yayımcıdan geldiğini ve değiştirilmediğini doğrulamaya yardımcı olur. Noter Projesi tarafından geliştirilen bir açık kaynak tedarik zinciri aracı olan noter, kapsayıcı görüntülerini ve diğer yapıtları imzalamayı ve doğrulamayı destekler. Azure Key Vault (AKV), Notation AKV eklentisi (azure-kv) ile Notation tarafından kapsayıcı görüntülerini ve diğer yapıtları imzalamak ve doğrulamak için kullanılabilen imzalama anahtarları içeren sertifikaları depolamak için kullanılır. Azure Container Registry (ACR), kapsayıcı görüntülerine ve diğer yapıtlara imza eklemenin yanı sıra bu imzaları görüntülemenizi sağlar.

Bu öğreticide:

  • Notation CLI ve AKV eklentisini yükleme
  • AKV'de otomatik olarak imzalanan sertifika oluşturma
  • ACR Görevleri ile kapsayıcı görüntüsü oluşturma ve gönderme
  • Notation CLI ve AKV eklentisiyle kapsayıcı görüntüsü imzalama
  • Notation CLI ile bir kapsayıcı görüntüsünü imzaya göre doğrulama

Önkoşullar

Notation CLI ve AKV eklentisini yükleme

  1. Bir Linux amd64 ortamına Notation v1.1.0 yükleyin. Diğer ortamlara yönelik paketi indirmek için Notation yükleme kılavuzunu izleyin.

    # 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. Bir Linux amd64 ortamına v1.1.0 Gösterimi Azure Key Vault eklentisini azure-kv yükleyin.

    Not

    Notation Azure Key Vault eklentisinin URL ve SHA256 sağlama toplamı eklentinin yayın sayfasında bulunabilir.

    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. Kullanılabilir eklentileri listeleyin ve sürüme 1.1.0 sahip eklentinin azure-kv listeye eklendiğini onaylayın.

    notation plugin ls
    

Ortam değişkenlerini yapılandırma

Not

Öğreticideki komutların kolayca yürütülmesi için Azure kaynaklarına mevcut ACR ve AKV kaynaklarıyla eşleşecek değerler sağlayın.

  1. AKV kaynak adlarını yapılandırın.

    # 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 ve görüntü kaynak adlarını yapılandırın.

    # 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
    

Azure CLI'de oturum açma

az login

Azure CLI ve bu cli ile oturum açma hakkında daha fazla bilgi edinmek için bkz . Azure CLI ile oturum açma.

AKV'de erişim ilkesi atama (Azure CLI)

Otomatik olarak imzalanan bir sertifika oluşturmak ve yapıtları imzalamak için doğru erişim ilkesi izinlerine sahip bir kullanıcı sorumlusu gereklidir. Bu sorumlu bir kullanıcı sorumlusu, hizmet sorumlusu veya yönetilen kimlik olabilir. En azından bu sorumlu aşağıdaki izinlere ihtiyaç duyar:

  • Create sertifika izinleri
  • Get sertifika izinleri
  • Sign anahtar izinleri

Bu öğreticide, erişim ilkesi oturum açmış bir Azure kullanıcısına atanır. İlkeyi sorumluya atama hakkında daha fazla bilgi edinmek için bkz . Erişim İlkesi Atama.

AKV kaynağını içeren aboneliği ayarlama

az account set --subscription <your_subscription_id>

AKV'de erişim ilkesini ayarlama

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

Önemli

Bu örnekte, sertifika oluşturmak ve kapsayıcı görüntüsünü imzalamak için gereken en düşük izinler gösterilir. Gereksinimlerinize bağlı olarak, ek izinler vermeniz gerekebilir.

AKV'de otomatik olarak imzalanan sertifika oluşturma (Azure CLI)

Aşağıdaki adımlarda, test amacıyla otomatik olarak imzalanan bir sertifikanın nasıl oluşturulacağı gösterilmektedir.

  1. Bir sertifika ilkesi dosyası oluşturun.

    Sertifika ilkesi dosyası aşağıdaki gibi yürütüldükten sonra, AKV'de Noter Projesi sertifika gereksinimiyle uyumlu geçerli bir sertifika oluşturur. için ekus değeri kod imzalamaya yöneliktir, ancak yapıtları imzalamak için gösterimi gerekmez. Konu daha sonra kullanıcının doğrulama sırasında güvendiği güven kimliği olarak kullanılır.

    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. Sertifikayı oluşturun.

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

Notation CLI ve AKV eklentisiyle kapsayıcı görüntüsü imzalama

  1. Bireysel Azure kimliğinizi kullanarak ACR'nizde kimlik doğrulaması.

    az acr login --name $ACR_NAME
    

Önemli

Sisteminizde Docker yüklüyse ve ACR'nizde kimlik doğrulaması yapmak için veya kullandıysanız az acr logindocker login , kimlik bilgileriniz zaten depolanmış ve gösterimi için kullanılabilir durumdadır. Bu durumda, ACR'nizde kimlik doğrulaması yapmak için yeniden çalıştırmanız notation login gerekmez. Gösterimin kimlik doğrulama seçenekleri hakkında daha fazla bilgi edinmek için bkz . OCI uyumlu kayıt defterleriyle kimlik doğrulaması.

  1. ACR Görevleri ile yeni bir görüntü oluşturun ve gönderin. Etiketler değişebilir ve üzerine yazılabilir olduğundan, imzalama için görüntüyü tanımlamak için her zaman özet değerini kullanın.

    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
    

    Bu öğreticide, görüntü önceden oluşturulmuşsa ve kayıt defterinde depolanmışsa, etiket kolaylık sağlamak amacıyla bu görüntünün tanımlayıcısı olarak görev alır.

    IMAGE=$REGISTRY/${REPO}:$TAG
    
  2. İmzalama anahtarının Anahtar Kimliğini alın. AKV'deki bir sertifikanın birden çok sürümü olabilir, aşağıdaki komut en son sürümün Anahtar Kimliğini alır.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
    
  3. İmzalama anahtarı kimliğini kullanarak kapsayıcı görüntüsünü COSE imza biçimiyle imzalayın. Otomatik olarak imzalanan bir sertifikayla imzalamak için eklenti yapılandırma değerini self_signed=trueayarlamanız gerekir.

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

    AKV ile kimlik doğrulaması yapmak için varsayılan olarak, etkinleştirildiyse aşağıdaki kimlik bilgisi türleri sırayla denenecektir:

    Bir kimlik bilgisi türü belirtmek istiyorsanız adlı credential_typeek bir eklenti yapılandırması kullanın. Örneğin, aşağıda gösterildiği gibi Azure CLI kimlik bilgilerini kullanmak için olarak açıkça ayarlayabilirsiniz credential_typeazurecli :

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

    Çeşitli kimlik bilgileri türlerinin değerleri credential_type için aşağıdaki tabloya bakın.

    Kimlik bilgisi türü için değer credential_type
    Ortam kimlik bilgileri environment
    İş yükü kimliği kimlik bilgileri workloadid
    Yönetilen kimlik kimlik bilgileri managedid
    Azure CLI kimlik bilgileri azurecli
  4. İmzalı görüntülerin ve ilişkili imzaların grafiğini görüntüleyin.

    notation ls $IMAGE
    

Notation CLI ile kapsayıcı görüntüsünü doğrulama

Kapsayıcı görüntüsünü doğrulamak için, yaprak sertifikayı imzalayan kök sertifikayı güven deposuna ekleyin ve doğrulama için güven ilkeleri oluşturun. Bu öğreticide kullanılan otomatik olarak imzalanan sertifika için kök sertifika, otomatik olarak imzalanan sertifikanın kendisidir.

  1. Genel sertifikayı indirin.

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. İmza doğrulaması için indirilen genel sertifikayı adlandırılmış güven deposuna ekleyin.

    STORE_TYPE="ca"
    STORE_NAME="wabbit-networks.io"
    notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
    
  3. Onaylayacak sertifikayı listeleyin.

    notation cert ls
    
  4. Doğrulamadan önce güven ilkesini yapılandırın.

    Güven ilkeleri, kullanıcıların hassas doğrulama ilkeleri belirtmesine olanak sağlar. Aşağıdaki örnek, içindeki $REGISTRY/$REPO tüm yapıtlar için geçerli olan ve türünde $STORE_TYPEadlandırılmış güven depounu $STORE_NAME kullanan adlı wabbit-networks-imagesbir güven ilkesi yapılandırılır. Ayrıca kullanıcının X.509 konusuyla $CERT_SUBJECTbelirli bir kimliğe güvendiğini varsayar. Diğer ayrıntılar için bkz . Güven deposu ve güven ilkesi belirtimi.

    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. Daha önce oluşturduğumuz bir JSON dosyasından güven ilkesi yapılandırmasını içeri aktarmak için kullanın notation policy .

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. Derleme zamanından bu yana kapsayıcı görüntüsünün değiştirilmediğini doğrulamak için kullanın notation verify .

    notation verify $IMAGE
    

    Güven ilkesi kullanılarak görüntünün başarıyla doğrulanması üzerine, doğrulanmış görüntünün sha256 özeti başarılı bir çıkış iletisinde döndürülür.

Sonraki adımlar

İmzalı görüntüleri AKS'de dağıtmadan önce Azure Kubernetes Service (AKS) kümelerinize dağıtmadan önce doğrulamak için Görüntü Bütünlüğünü Kullanma (Önizleme) ve Azure'da Onaylama konularına bakın.