Azure Container Registry'de içerik güveni
Azure Container Registry, Docker'ın içerik güveni modelini uygulayarak imzalı görüntülerin gönderilip çekilmesine olanak tanır. Bu makale, kapsayıcı kayıt defterlerinizde içerik güvenini etkinleştirmeye başlamanızı sağlar.
Not
İçerik güveni, Azure Container Registry'nin Premium hizmet katmanının bir özelliğidir.
Sınırlamalar
- Depo kapsamlı izinlere sahip belirteç şu anda imzalı görüntülerin docker ile gönderilip çekilmesini desteklememektedir.
İçerik güveni nasıl çalışır?
Güvenlik ön planda tutularak tasarlanmış olan tüm dağıtılmış sistemlerde, sisteme giren verilerin hem kaynağının hem de bütün doğrulanması önemlidir. Verileri tüketen kullanıcıların, verilerin yayımcısını (kaynağını) doğrulamakla kalmayıp aynı zamanda yayımlandıktan sonra değiştirilmediğinden (bütünlüğünden) de emin olması gerekir.
İçerik güveni, görüntü yayımcılarının kayıt defterine gönderdikleri görüntüleri imzalamasını sağlar. Görüntünüzün tüketicileri (görüntüyü kayıt defterinizden çeken kişiler veya sistemler), istemcilerini yalnızca imzalı görüntüleri çekecek şekilde yapılandırır. Tüketici, imzalı görüntüyü çektiğinde Docker istemcisi bu görüntünün bütünlüğünü doğrular. Bu modelde tüketiciler, kayıt defterinizdeki imzalı görüntülerin sizin tarafınızdan yayımlandığından ve yayımlama işleminin sonrasında değiştirilmediğinden emin olur.
Not
Azure Container Registry (ACR), Docker İçerik Güveni (DCT) ile imzalanan görüntülerin içeri aktarılmasını desteklemez acr import
. Tasarım gereği, içeri aktarma işleminden sonra imzalar görünmez ve noter v2 bu imzaları yapıt olarak depolar.
Güvenilen görüntüler
İçerik güveni, depo içindeki etiketlerle çalışır. Görüntü depolarında hem imzalı hem de imzasız etiketlere sahip görüntüler bulunabilir. Örneğin yalnızca myimage:stable
ve myimage:latest
görüntülerini imzalayabilir, myimage:dev
görüntülerini hariç tutabilirsiniz.
İmzalama anahtarları
İçerik güveni, şifreli imzalama anahtarları kullanılarak yönetilir. Bu anahtarlar, kayıt defterindeki belirli bir depo ile ilişkilendirilir. Depo içindeki etiketlerin güven durumunu yönetmek için Docker istemcilerinin ve kayıt defterinizin kullandığı birçok imzalama anahtarı türü vardır. İçerik güvenini etkinleştirip kapsayıcı yayımlama ve tüketim işlem hattınızla tümleştirdiğinizde bu anahtarları dikkatli bir şekilde yönetmeniz gerekir. Daha fazla bilgi için bu makalenin ilerleyen bölümlerindeki Anahtar yönetimi başlığına ve Docker belgelerindeki İçerik güveni için anahtar yönetimi bölümüne bakın.
İpucu
Burada Docker'ın içerik güven modeline yüzeysel bir genel bakış sunulmaktadır. İçerik güveniyle ilgili ayrıntılı bilgiler için bkz. Docker'da içerik güveni.
Kayıt defteri içerik güvenini etkinleştirme
Öncelikle kayıt defteri düzeyinde içerik güvenini etkinleştirmeniz gerekir. İçerik güvenini etkinleştirdikten sonra istemciler (kullanıcılar veya hizmetler) imzalı görüntüleri kayıt defterine gönderebilir. Kayıt defterinizde içerik güvenini etkinleştirmeniz, kayıt defterinin kullanımını yalnızca içerik güvenini etkinleştirmiş olan tüketicilerle sınırlamaz. İçerik güvenini etkinleştirmemiş tüketiciler de kayıt defterinizi normal bir şekilde kullanmaya devam edebilir. Ancak istemcilerinde içerik güvenini etkinleştirmiş olan tüketiciler kayıt defterinizde yalnızca imzalı görüntüleri görebilir.
Kayıt defterinizde içerik güvenini etkinleştirmek için öncelikle Azure portaldan kayıt defterine gidin. İlkeler'in altında İçerik Güveni>Etkin>Kaydetme'yi seçin. Azure CLI'da az acr config content-trust update komutunu da kullanabilirsiniz.
İstemci içerik güvenini etkinleştirme
Güvenilen görüntülerle çalışmak için hem görüntü yayımcılarının hem de tüketicilerin Docker istemcilerinde içerik güvenini etkinleştirmesi gerekir. Yayımcı olarak içerik güveni etkinleştirilmiş kayıt defterine gönderdiğiniz görüntüleri imzalayabilirsiniz. Tüketici olarak içerik güvenini etkinleştirdiğinizde kayıt defterinde yalnızca imzalı görüntüleri görürsünüz. İçerik güveni Docker istemcilerinde varsayılan olarak devre dışıdır ancak bir kabuk oturumu veya komut için etkinleştirebilirsiniz.
İçerik güvenini bir kabuk oturumunda etkinleştirmek için DOCKER_CONTENT_TRUST
ortam değişkeninin değerini 1 olarak belirleyin. Örneğin, Bash kabuğunda:
# Enable content trust for shell session
export DOCKER_CONTENT_TRUST=1
Bunun yerine içerik güvenini tek bir komut için etkinleştirmek veya devre dışı bırakmak istiyorsanız birçok Docker komutuyla --disable-content-trust
bağımsız değişkenini kullanabilirsiniz. İçerik güvenini tek bir komutta etkinleştirmek için:
# Enable content trust for single command
docker build --disable-content-trust=false -t myacr.azurecr.io/myimage:v1 .
İçerik güvenini kabuk oturumunuz için etkinleştirdiyseniz ve tek bir komut için devre dışı bırakmak istiyorsanız:
# Disable content trust for single command
docker build --disable-content-trust -t myacr.azurecr.io/myimage:v1 .
Görüntü imzalama izinleri verme
Yalnızca izin verdiğiniz kullanıcılar veya sistemler kayıt defterinize güvenilen görüntü gönderebilir. Bir kullanıcıya (veya hizmet sorumlusu kullanan bir sisteme) güvenilir görüntü gönderme izni vermek için, rolü Microsoft Entra kimliklerine AcrImageSigner
verin. Bu, görüntüleri kayıt defterine AcrPush
göndermek için gereken (veya eşdeğeri) role ek olarak kullanılır. Ayrıntılar için bkz . Azure Container Registry rolleri ve izinleri.
Önemli
Aşağıdaki yönetim hesaplarına güvenilir görüntü gönderme izni veremezsiniz:
- Azure kapsayıcı kayıt defterinin yönetici hesabı
- klasik sistem yöneticisi rolüyle Microsoft Entra Id'de bir kullanıcı hesabı.
Not
Temmuz 2021'den AcrImageSigner
itibaren rol hem eylemi hem de Microsoft.ContainerRegistry/registries/sign/write
veri eylemini Microsoft.ContainerRegistry/registries/trustedCollections/write
içerir.
Azure portalda ve Azure CLI ile AcrImageSigner
rolünün atanmasıyla ilgili ayrıntılı bilgiler aşağıda verilmiştir.
Azure portal
Erişim denetimi (IAM) öğesini seçin.
Ekle>Rol ataması ekle seçeneğini belirleyerek Rol ataması ekle sayfasını açın.
Aşağıdaki rolü atayın. Bu örnekte rol tek bir kullanıcıya atanır. Ayrıntılı adımlar için bkz. Azure portalı kullanarak Azure rolleri atama.
Ayar Value Role AcrImageSigner Şu kişiye erişim ata: User Üyeler Alain
Azure CLI
Azure CLI kullanarak bir kullanıcıya imzalama izni vermek için kullanıcıya AcrImageSigner
rolünü atayın ve kapsamını kayıt defterinizle sınırlandırın. Komut biçimi şu şekildedir:
az role assignment create --scope <registry ID> --role AcrImageSigner --assignee <user name>
Örneğin, yönetici olmayan bir kullanıcıya rolü vermek için, kimliği doğrulanmış bir Azure CLI oturumunda aşağıdaki komutları çalıştırabilirsiniz. REGISTRY
değerini Azure kapsayıcı kayıt defterinizin adıyla değiştirin.
# Grant signing permissions to authenticated Azure CLI user
REGISTRY=myregistry
REGISTRY_ID=$(az acr show --name $REGISTRY --query id --output tsv)
az role assignment create --scope $REGISTRY_ID --role AcrImageSigner --assignee azureuser@contoso.com
Dilerseniz bir hizmet sorumlusuna da kayıt defterinize güvenilen görüntü gönderme izni verebilirsiniz. Hizmet sorumlusu kullanımı, derleme sistemleri ve kayıt defterinize güvenilen görüntü göndermesi gereken diğer katılımsız sistemler için kullanışlıdır. Biçim, kullanıcıya izin vermeye benzer ancak --assignee
değerinde hizmet sorumlusu kimliği belirtmeniz gerekir.
az role assignment create --scope $REGISTRY_ID --role AcrImageSigner --assignee <service principal ID>
<service principal ID>
, hizmet sorumlusunun appId, objectId veya servicePrincipalNames değerlerinden biri olabilir. Hizmet sorumluları veya Azure Container Registry ile çalışma hakkında daha fazla bilgi için bkz. Hizmet sorumlularıyla Azure Container Registry kimlik doğrulaması.
Önemli
Herhangi bir rol değişikliği yaptıktan sonra, yeni rollerin etkili olabilmesi için Azure CLI için yerel kimlik belirtecini yenilemek için komutunu çalıştırın az acr login
. Kimlik rollerini doğrulama hakkında bilgi için bkz . Azure CLI kullanarak Azure rol atamaları ekleme veya kaldırma ve Azure RBAC sorunlarını giderme.
Güvenilen görüntü gönderme
Kapsayıcı kayıt defterinize güvenilen görüntü etiketi göndermek için içerik güvenini etkinleştirin ve docker push
ile görüntüyü gönderin. İmzalı bir etiketle gönderme işlemi ilk kez tamamlandıktan sonra, hem kök imzalama anahtarı hem de depo imzalama anahtarı için parola oluşturmanız istenir. Kök ve depo anahtarları yerel makinenizde oluşturulur ve depolanır.
$ docker push myregistry.azurecr.io/myimage:v1
[...]
The push refers to repository [myregistry.azurecr.io/myimage]
ee83fc5847cb: Pushed
v1: digest: sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1 size: 524
Signing and pushing trust metadata
You are about to create a new root signing key passphrase. This passphrase
will be used to protect the most sensitive key in your signing system. Please
choose a long, complex passphrase and be careful to keep the password and the
key file itself secure and backed up. It is highly recommended that you use a
password manager to generate the passphrase and keep it safe. There will be no
way to recover this key. You can find the key in your config directory.
Enter passphrase for new root key with ID 4c6c56a:
Repeat passphrase for new root key with ID 4c6c56a:
Enter passphrase for new repository key with ID bcd6d98:
Repeat passphrase for new repository key with ID bcd6d98:
Finished initializing "myregistry.azurecr.io/myimage"
Successfully signed myregistry.azurecr.io/myimage:v1
İçerik güveni etkin ilk docker push
işleminizden sonraki işlemler için Docker istemcisi aynı kök anahtarı kullanır. Aynı depoya yapılan sonraki gönderme işlemlerinde yalnızca depo anahtarı istenir. Güvenilen görüntüyü yeni bir depoya gönderdiğinizde yeni depo anahtarı için bir parola belirtmeniz istenir.
Güvenilen görüntüyü çekme
Güvenilen görüntüyü çekmek için içerik güvenini etkinleştirin ve docker pull
komutunu normal bir şekilde çalıştırın. Güvenilir görüntüleri çekmek için rol AcrPull
normal kullanıcılar için yeterlidir. Rol gibi AcrImageSigner
ek roller gerekmez. İçerik güvenini etkinleştiren tüketiciler yalnızca imzalı etikete sahip görüntüleri çekebilir. İmzalı etiket çekme örneği aşağıda verilmiştir:
$ docker pull myregistry.azurecr.io/myimage:signed
Pull (1 of 1): myregistry.azurecr.io/myimage:signed@sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b
sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b: Pulling from myimage
8e3ba11ec2a2: Pull complete
Digest: sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b
Status: Downloaded newer image for myregistry.azurecr.io/myimage@sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b
Tagging myregistry.azurecr.io/myimage@sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b as myregistry.azurecr.io/myimage:signed
İçerik güveni etkinleştirilmiş bir istemci imzasız bir etiketi çekmeye çalışırsa, işlem aşağıdakine benzer bir hatayla başarısız olur:
$ docker pull myregistry.azurecr.io/myimage:unsigned
Error: remote trust data does not exist
Arka planda
docker pull
komutunu çalıştırdığınızda Docker istemcisi Notary CLI ile aynı kitaplığı kullanarak çektiğiniz etiket için SHA-256 özet eşlemesi etiketini ister. güven verilerindeki imzaları doğruladıktan sonra istemci Docker Altyapısı'na "özete göre çekme" yapması talimatını verir. Çekme sırasında Altyapı, Azure kapsayıcı kayıt defterinden görüntü bildirimi istemek ve doğrulamak için içerik adresi olarak SHA-256 sağlama toplamını kullanır.
Not
Azure Container Registry, Noter CLI'yi resmi olarak desteklemez, ancak Docker Desktop'ta bulunan Noter Sunucusu API'siyle uyumludur. Şu anda Noter sürümü 0.6.0 önerilir.
Anahtar yönetimi
İlk güvenilen görüntünüzü gönderdiğinizde gösterilen docker push
çıktısında belirtildiği üzere kök anahtar en hassas veridir. Kök anahtarınızı yedeklemeyi ve güvenli bir yerde saklamayı unutmayın. Docker istemcisi, imzalama anahtarları varsayılan olarak şu dizinde depolar:
~/.docker/trust/private
Kök ve depo anahtarlarınızı arşivde sıkıştırıp güvenli bir konumda depolayarak yedekleyin. Örneğin, Bash içinde:
umask 077; tar -zcvf docker_private_keys_backup.tar.gz ~/.docker/trust/private; umask 022
Güvenilen görüntü gönderdiğinizde yerel ortamda oluşturulan kök ve depo anahtarlarına ek olarak Azure Container Registry tarafından oluşturulan ve depolanan anahtarlar da vardır. Docker içerik güveni uygulamasındaki çeşitli anahtarların ayrıntılı açıklaması için Docker belgelerinin İçerik güveni için anahtar yönetimi bölümüne bakın.
Kök anahtarın kaybolması
Kök anahtarınıza erişimi kaybederseniz etiketleri bu anahtarla imzalanmış olan depolardaki imzalı etiketlere de erişimi kaybedersiniz. Azure Container Registry, kök anahtarı kayıp olan görüntü etiketlerine erişim sağlayamaz. Kayıt defterinizdeki tüm güven verilerini (imzaları) kaldırmak için kayıt defterinde içerik güvenini devre dışı bırakıp yeniden etkinleştirmeniz gerekir.
Uyarı
Kayıt defterinizde içerik güvenini devre dışı bırakıp yeniden etkinleştirdiğinizde kayıt defterinizdeki tüm depolarda bulunan imzalı etiketlerin tüm güven verileri silinir. Bu eylem geri alınamaz. Azure Container Registry, silinen güven verilerini kurtaramaz. İçerik güvenini devre dışı bıraktığınızda görüntüler silinmez.
Kayıt defterinizde içerik güvenini devre dışı bırakmak için Azure portaldan kayıt defterine gidin. İlkeler'in altında İçerik Güveni>Devre Dışı Kaydet'i> seçin. Kayıt defterinizdeki tüm imzaların silineceğini belirten bir uyarı görüntülenir. Kayıt defterinizdeki tüm imzaları kalıcı olarak silmek için Tamam'ı seçin.
Sonraki adımlar
Docker güven komutları ve güven temsilcileri dahil olmak üzere içerik güveni hakkında ek bilgi için bkz. Docker'da içerik güveni. Bu makalede birkaç önemli noktaya değinilmiş olsa da içerik güveni kapsamlı bir konudur ve Docker belgelerinde daha ayrıntılı olarak ele alınmıştır.
Docker görüntüsü derleyip gönderdiğinizde içerik güveni kullanma örneği için Azure Pipelines belgelerine bakın.