Aracılığıyla paylaş


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 topluluğu tarafından geliştirilen ve Microsoft tarafından desteklenen, kapsayıcı görüntülerinin ve diğer yapıtların imzalanması ve doğrulanması için desteklenen bir açık kaynak tedarik zinciri güvenlik aracıdır. 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
  • Zaman damgası oluşturma

Önkoşullar

Notation CLI ve AKV eklentisini yükleme

  1. Bir Linux amd64 ortamına Notation v1.2.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.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. Bir Linux amd64 ortamına Notation Azure Key Vault eklentisi azure-kv v1.2.0'ı 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.2.0/notation-azure-kv_1.2.0_linux_amd64.tar.gz --sha256sum 06bb5198af31ce11b08c4557ae4c2cbfb09878dfa6b637b7407ebc2d57b87b34
    
  3. Kullanılabilir eklentileri listeleyin ve sürüme 1.2.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.

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

    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
    

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.

ACR ve AKV'ye güvenli erişim izinleri

ACR ve AKV ile çalışırken, güvenli ve denetimli erişim sağlamak için uygun izinleri vermek önemlidir. Belirli senaryolarınıza bağlı olarak kullanıcı sorumluları, hizmet sorumluları veya yönetilen kimlikler gibi farklı varlıklar için erişim yetkisi vekleyebilirsiniz. Bu öğreticide, erişim oturum açmış bir Azure kullanıcısına yetkilendirilmiştir.

ACR'ye erişimi yetkilendirme

AcrPull ve AcrPush rolleri, ACR'de kapsayıcı görüntülerini imzalamak için gereklidir.

  1. ACR kaynağını içeren aboneliği ayarlama

    az account set --subscription $ACR_SUB_ID
    
  2. Rolleri atama

    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"
    

AKV'ye erişimi yetkilendirme

Bu bölümde, AKV'ye erişim yetkisi vermek için iki seçeneği inceleyeceğiz.

Otomatik olarak imzalanan sertifikaları kullanarak imzalamak için aşağıdaki roller gereklidir:

  • Key Vault Certificates Officer sertifika oluşturma ve okuma için
  • Key Vault Certificates Uservar olan sertifikaları okumak için
  • Key Vault Crypto User imzalama işlemleri için

Azure RBAC ile Key Vault erişimi hakkında daha fazla bilgi edinmek için bkz . Erişimi yönetmek için Azure RBAC kullanma.

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

    az account set --subscription $AKV_SUB_ID
    
  2. Rolleri atama

    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"
    

AKV'de erişim ilkesi atama (eski)

Kimlik için aşağıdaki izinler gereklidir:

  • Create sertifika oluşturma izinleri
  • Get mevcut sertifikaları okuma izinleri
  • Sign imzalama işlemleri için izinler

İlkeyi sorumluya atama hakkında daha fazla bilgi edinmek için bkz . Erişim İlkesi Atama.

  1. AKV kaynağını içeren aboneliği ayarlayın:

    az account set --subscription $AKV_SUB_ID
    
  2. AKV'de erişim ilkesini ayarlayın:

    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 login docker 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_type azurecli :

    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.

Zaman damgası oluşturma

Notation v1.2.0 sürümünden bu yana, Notation RFC 3161 uyumlu zaman damgasını destekler. Bu geliştirme, zaman damgası yetkilisine (TSA) güvenerek sertifikanın geçerlilik süresi içinde oluşturulan imzaların güvenini genişletir ve sertifikaların süresi dolduktan sonra bile başarılı imza doğrulamasını etkinleştirir. Görüntü imzalayan olarak, kapsayıcı görüntülerini güvenilir bir TSA tarafından oluşturulan zaman damgalarıyla imzaladığınızdan emin olmanız gerekir. Görüntü doğrulayıcı olarak, zaman damgalarını doğrulamak için hem görüntü imzalayana hem de ilişkili TSA'ya güvendiğinizi ve güven depoları ve güven ilkeleri aracılığıyla güven oluşturduğunuzdan emin olmanız gerekir. Zaman damgası oluşturma, kısa süreli sertifikaları kullanırken özellikle kritik öneme sahip olan sertifika süre sonu nedeniyle görüntüleri düzenli aralıklarla yeniden imzalama gereksinimini ortadan kaldırarak maliyetleri azaltır. Zaman damgasını kullanarak imzalama ve doğrulama hakkında ayrıntılı yönergeler için noter projesi zaman damgası kılavuzuna bakın.

Sonraki adımlar

Gösterimi ayrıca Azure Pipeline ve GitHub Actions İş Akışı üzerinde CI/CD çözümleri sağlar:

AKS veya Kubernetes'te imzalı görüntü dağıtımlarını doğrulamak için: