Aracılığıyla paylaş


CA tarafından verilen sertifikayı kullanarak Notation ve Azure Key Vault ile kapsayıcı görüntülerini imzalama

Kapsayıcı görüntülerini güvenilir bir Sertifika Yetkilisi (CA) tarafından verilen bir sertifikayla imzalamak ve doğrulamak değerli bir güvenlik uygulamasıdır. Bu güvenlik önlemi, hem kapsayıcı görüntüsünün yayımcısının hem de kapsayıcı görüntüsünün kimliğini sorumlu bir şekilde tanımlamanıza, yetkilendirmenize ve doğrulamanıza yardımcı olur. GlobalSign, DigiCert ve diğerleri gibi Güvenilen Sertifika Yetkilileri (CA' lar), bir kullanıcının veya kuruluşun kimliğinin doğrulanmasında, dijital sertifikaların güvenliğinin korunmasında ve herhangi bir risk veya kötüye kullanımda sertifikanın hemen iptal edilmesinde önemli bir rol oynar.

Kapsayıcı görüntülerini güvenilir bir CA tarafından verilen bir sertifikayla imzalamanıza ve doğrulamanıza yardımcı olan bazı temel bileşenler şunlardır:

  • Noter Project topluluğu tarafından geliştirilen ve Microsoft tarafından desteklenen, kapsayıcı görüntülerini ve diğer yapıtları imzalamayı ve doğrulamayı destekleyen bir açık kaynak tedarik zinciri güvenlik aracıdır.
  • Şifreleme anahtarlarını, gizli dizileri ve sertifikaları yönetmeye yönelik bulut tabanlı bir hizmet olan Azure Key Vault (AKV), imzalama anahtarıyla bir sertifikayı güvenli bir şekilde depolamanıza ve yönetmenize yardımcı olur.
  • Notation uzantısı olan azure-kv Gösterimi AKV eklentisi, kapsayıcı görüntülerinin ve yapıtlarının dijital imzalarını imzalamak ve doğrulamak için Azure Key Vault'ta depolanan anahtarları kullanır.
  • Azure Container Registry (ACR), imzalanan görüntüye bu imzaları eklemenize olanak tanır ve bu kapsayıcı görüntülerini depolamanıza ve yönetmenize yardımcı olur.

Görüntüyü doğruladığınızda, imza görüntünün bütünlüğünü ve imzalayanın kimliğini doğrulamak için kullanılır. Bu, kapsayıcı görüntülerinin üzerinde oynanmamasını ve güvenilir bir kaynaktan olmasını sağlamaya yardımcı olur.

Bu makalede:

  • Notasyon CLI ve AKV eklentisini yükleme
  • AKV'de CA tarafından verilen sertifikayı oluşturma veya içeri aktarma
  • ACR göreviyle 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 kapsayıcı görüntüsü imzasını doğrulama
  • Zaman damgası oluşturma

Önkoşullar

Not

Yalnızca sertifikaları depolamak için yeni bir Azure Key Vault oluşturmanızı öneririz.

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

Bu kılavuz, AKV ve ACR'yi yapılandırırken kolaylık sağlamak için ortam değişkenlerini kullanır. Belirli kaynaklarınız için bu ortam değişkenlerinin değerlerini güncelleştirin.

  1. AKV ve sertifikalar için ortam değişkenlerini yapılandırma

    AKV_SUB_ID=myAkvSubscriptionId
    AKV_RG=myAkvResourceGroup
    AKV_NAME=myakv 
    
    # Name of the certificate created or imported in AKV 
    CERT_NAME=wabbit-networks-io 
    
    # X.509 certificate subject
    CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US"
    
  2. ACR ve görüntüler için ortam değişkenlerini 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 
    # 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 CA tarafından verilen sertifikayı oluşturma veya içeri aktarma

Sertifika gereksinimleri

İmzalama ve doğrulama için sertifika oluştururken sertifikaların Noter Projesi sertifika gereksinimini karşılaması gerekir.

Kök ve ara sertifikaların gereksinimleri şunlardır:

  • Uzantı mevcut basicConstraints olmalı ve kritik olarak işaretlenmelidir. alanı CA ayarlanmalıdır true.
  • Uzantı keyUsage mevcut ve işaretli criticalolmalıdır. BIT konumları keyCertSign AYARLANMALıDıR.

Ca tarafından verilen sertifikaların gereksinimleri şunlardır:

  • X.509 sertifika özellikleri:
    • Konu ortak ad (), ülke (CNC), eyalet veya il (ST) ve kuruluş (O) içermelidir. Bu öğreticide konu $CERT_SUBJECT olarak kullanılır.
    • X.509 anahtar kullanım bayrağı yalnızca olmalıdır DigitalSignature .
    • Genişletilmiş Anahtar Kullanımları (EKU' lar) boş veya 1.3.6.1.5.5.7.3.3 (Birlikte Tasarlama için) olmalıdır.
  • Önemli özellikler:
    • exportable özelliği olarak falseayarlanmalıdır.
    • Noter Projesi belirtiminden desteklenen bir anahtar türü ve boyutu seçin.

Önemli

Görüntü Bütünlüğü ile tümleştirmenin başarılı olmasını sağlamak için sertifikanın içerik türü PEM olarak ayarlanmalıdır.

Not

Bu kılavuzda AKV eklentisinin 1.0.1 sürümü kullanılır. Eklentinin önceki sürümlerinde, bir sertifika zincirinde belirli bir sertifika sırası gerektiren bir sınırlama vardı. Eklentinin 1.0.1 sürümünde bu sınırlama yoktur, bu nedenle 1.0.1 veya sonraki bir sürümü kullanmanız önerilir.

CA tarafından verilen bir sertifika oluşturma

Sertifika imzalama isteği oluşturma başlığındaki yönergeleri izleyerek bir sertifika imzalama isteği (CSR) oluşturun.

Önemli

CSR'yi birleştirirken, CA satıcısından geri getirilen zincirin tamamını birleştirdiğinizden emin olun.

AKV'de sertifikayı içeri aktarma

Sertifikayı içeri aktarmak için:

  1. Sertifika zincirinin tamamıyla CA satıcısından sertifika dosyasını alın.
  2. Sertifikayı içeri aktarma yönergelerini izleyerek sertifikayı Azure Key Vault'a aktarın.

Not

Sertifika oluşturulduktan veya içeri aktarıldıktan sonra bir sertifika zinciri içermiyorsa, ara ve kök sertifikaları CA satıcınızdan alabilirsiniz. Satıcınızdan size ara sertifikaları (varsa) ve kök sertifikayı içeren bir PEM dosyası sağlamasını isteyebilirsiniz. Bu dosya daha sonra kapsayıcı görüntülerini imzalamanın 5. adımında kullanılabilir.

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

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şim yazma

AcrPull ve AcrPush rolleri, ACR'de kapsayıcı görüntüleri oluşturmak ve 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"
    

Kapsayıcı görüntülerini derleme ve ACR'ye gönderme

  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, her zaman resmi imzalamak üzere tanımlamak için kullanın digest .

    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

AKV'ye erişim yazma

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

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

    Sertifika tüm sertifika zincirini içeriyorsa, sorumlu aşağıdaki rollerle atanmalıdır:

    • Key Vault Secrets User gizli dizileri okumak için
    • Key Vault Certificates Usersertifikaları okumak için
    • Key Vault Crypto User imzalama işlemleri için
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Secrets User" --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

    Sertifika zincir içermiyorsa, sorumlu aşağıdaki rollerle atanmalıdır:

    • Key Vault Certificates Usersertifikaları okumak için
    • Key Vault Crypto User imzalama işlemleri için
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

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.

Erişim ilkesini kullanma (Eski)

AKV kaynaklarını içeren aboneliği ayarlamak için aşağıdaki komutu çalıştırın:

az account set --subscription $AKV_SUB_ID

Sertifika tüm sertifika zincirini içeriyorsa, sorumluya anahtar izni, gizli dizi izni SignGetve sertifika izinleri Getverilmelidir. Sorumluya şu izinleri vermek için:

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --secret-permissions get --certificate-permissions get --object-id $USER_ID

Sertifika zinciri içermiyorsa, sorumluya anahtar izni Signve sertifika izinleri Getverilmelidir. Sorumluya şu izinleri vermek için:

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --certificate-permissions get --object-id $USER_ID

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

AKV'de sertifikayı kullanarak kapsayıcı görüntülerini imzalama

  1. Sertifikanın Anahtar Kimliğini alın. AKV'deki bir sertifikanın birden çok sürümü olabilir, aşağıdaki komut sertifikanın en son sürümü $CERT_NAME için Anahtar Kimliğini alır.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv) 
    
  2. Anahtar Kimliği'ni kullanarak kapsayıcı görüntüsünü COSE imza biçimiyle imzalayın.

    Sertifika tüm sertifika zincirini içeriyorsa aşağıdaki komutu çalıştırın:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv 
    

    Sertifika zinciri içermiyorsa, BIR PEM dosyasındaki CA sertifikalarını AKV eklentisine geçirmek için parametresini kullanın --plugin-config ca_certs=<ca_bundle_file> , aşağıdaki komutu çalıştırın:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file> 
    

    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 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
  3. İmzalı görüntülerin ve ilişkili imzaların grafiğini görüntüleyin.

    notation ls $IMAGE
    

    Aşağıdaki çıktı örneğinde, özet sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e tarafından tanımlanan türdeki application/vnd.cncf.notary.signature bir imza ile $IMAGEilişkilendirilir.

    myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f
    └── application/vnd.cncf.notary.signature
        └── sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
    

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

  1. İmza doğrulaması için kök sertifikayı adlandırılmış bir güven deposuna ekleyin. Kök sertifikanız yoksa sertifikayı CA'nızdan alabilirsiniz. Aşağıdaki örnek, kök sertifikayı $ROOT_CERT güven deposuna $STORE_NAME ekler.

    STORE_TYPE="ca" 
    STORE_NAME="wabbit-networks.io" 
    notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT  
    
  2. başarıyla eklendiğini onaylamak için kök sertifikayı $ROOT_CERT listeleyin.

    notation cert ls 
    
  3. 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. Güven ilkesini yapılandırmak için aşağıdaki komutu kullanın.

    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
    

    Yukarıdaki trustpolicy.json dosya adlı wabbit-networks-imagesbir güven ilkesi tanımlar. Bu güven ilkesi, depolarda $REGISTRY/$REPO depolanan tüm yapıtlar için geçerlidir. Türündeki $STORE_TYPE adlandırılmış güven deposu $STORE_NAME kök sertifikaları içerir. 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.

  4. güven ilkesi yapılandırmasını uygulamasından trustpolicy.jsoniçeri aktarmak için kullanınnotation policy.

    notation policy import ./trustpolicy.json
    
  5. İçeri aktarma işleminin başarılı olduğunu onaylamak için güven ilkesi yapılandırmasını gösterin.

    notation policy show
    
  6. Görüntünün bütünlüğünü 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. Çıktı örneği:

    Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f

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.

SSS

  • Sertifikanın süresi dolduysa ne yapmalıyım?

    Sertifikanızın süresi dolduysa, yeni bir özel anahtarla birlikte güvenilen bir CA satıcısından yeni bir sertifika almanız gerekir. Süresi dolmuş bir sertifika, kapsayıcı görüntülerini imzalamak için kullanılamaz. Sertifikanın süresi dolmadan önce imzalanan görüntüler, zaman damgasıyla imzalanmışsa yine de başarıyla doğrulanabilir. Zaman damgası olmadan imza doğrulaması başarısız olur ve başarılı bir doğrulama için bu görüntüleri yeni sertifikayla yeniden imzalamanız gerekir.

  • Sertifika iptal edilirse ne yapmalıyım?

    Sertifikanız iptal edilirse, imzayı geçersiz kılır. Bu, özel anahtarın gizliliğinin ihlal edilmesi veya sertifika sahibinin ilişkisindeki değişiklikler gibi çeşitli nedenlerle oluşabilir. Bu sorunu çözmek için öncelikle kaynak kodunuzun ve derleme ortamınızın güncel ve güvenli olduğundan emin olmanız gerekir. Ardından, kaynak koddan kapsayıcı görüntüleri derleyin, yeni bir özel anahtarla birlikte güvenilir bir CA satıcısından yeni bir sertifika alın ve bu kılavuzu izleyerek yeni kapsayıcı görüntülerini yeni sertifikayla imzalayı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: