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
- Kapsayıcı görüntülerini ve imzalarını depolamak için Azure Container Registry oluşturma veya kullanma
- Azure Key Vault oluşturun veya kullanın .
- En son Azure CLI'yı yükleme ve yapılandırma veya Azure Cloud Shell'de komut çalıştırma
Not
Yalnızca sertifikaları depolamak için yeni bir Azure Key Vault oluşturmanızı öneririz.
Notasyon CLI ve AKV eklentisini yükleme
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
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
Kullanılabilir eklentileri listeleyin ve sürüme
1.2.0
sahip eklentininazure-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.
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"
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ırtrue
. - Uzantı
keyUsage
mevcut ve işaretlicritical
olmalı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 (
CN
C
), 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.
- Konu ortak ad (), ülke (
- Önemli özellikler:
Ö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:
- Sertifika zincirinin tamamıyla CA satıcısından sertifika dosyasını alın.
- 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.
ACR kaynağını içeren aboneliği ayarlama
az account set --subscription $ACR_SUB_ID
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
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ı.
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
Azure RBAC kullanma (Önerilen)
AKV kaynağını içeren aboneliği ayarlama
az account set --subscription $AKV_SUB_ID
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çinKey Vault Certificates User
sertifikaları okumak içinKey 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 User
sertifikaları okumak içinKey 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 Sign
Get
ve sertifika izinleri Get
verilmelidir. 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 Sign
ve sertifika izinleri Get
verilmelidir. 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
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)
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:
- Ortam kimlik bilgileri
- İş yükü kimliği kimlik bilgileri
- Yönetilen kimlik kimlik bilgileri
- Azure CLI kimlik bilgileri
Bir kimlik bilgisi türü belirtmek istiyorsanız adlı
credential_type
ek 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 ayarlayabilirsinizcredential_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
İ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ürdekiapplication/vnd.cncf.notary.signature
bir imza ile$IMAGE
iliş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
İ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
başarıyla eklendiğini onaylamak için kök sertifikayı
$ROOT_CERT
listeleyin.notation cert ls
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-images
bir 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_SUBJECT
belirli bir kimliğe güvendiğini varsayar. Diğer ayrıntılar için bkz . Güven deposu ve güven ilkesi belirtimi.güven ilkesi yapılandırmasını uygulamasından
trustpolicy.json
içeri aktarmak için kullanınnotation policy
.notation policy import ./trustpolicy.json
İçeri aktarma işleminin başarılı olduğunu onaylamak için güven ilkesi yapılandırmasını gösterin.
notation policy show
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:
- Azure Pipeline'da Notation ile bir kapsayıcı görüntüsünü imzalama ve doğrulama
- GitHub Actions İş Akışında Notation ile kapsayıcı görüntüsünü imzalama ve doğrulama
AKS veya Kubernetes'te imzalı görüntü dağıtımlarını doğrulamak için: