Zaufanie do zawartości w usłudze Azure Container Registry
Usługa Azure Container Registry implementuje model zaufania zawartości platformy Docker, umożliwiając wypychanie i ściąganie podpisanych obrazów. Ten artykuł zawiera wprowadzenie do włączania zaufania do zawartości w rejestrach kontenerów.
Uwaga
Zaufanie do zawartości to funkcja warstwy usługi Premium usługi Azure Container Registry.
Ograniczenia
- Token z uprawnieniami o zakresie repozytorium nie obsługuje obecnie wypychania i ściągania podpisanych obrazów platformy Docker.
Jak działa zaufanie do zawartości
W każdym systemie rozproszonym zaprojektowanym z myślą o bezpieczeństwie bardzo ważne jest weryfikowanie zarówno źródła, jak i integralności danych wprowadzanych do systemu. Użytkownicy danych muszą mieć możliwość zweryfikowania wydawcy (źródła) danych, a także pewność, że dane nie zostały zmodyfikowane po publikacji (integralność).
Jako wydawcy obrazu zaufanie do zawartości umożliwia Ci podpisywanie obrazów wypychanych do rejestru. Użytkownicy obrazów (osoby lub systemy ściągające obrazy z rejestru) mogą skonfigurować swoich klientów do ściągania tylko podpisanych obrazów. Gdy użytkownik ściąga podpisany obraz, jego klient platformy Docker weryfikuje integralność obrazu. W tym modelu użytkownicy mają pewność, że podpisane obrazy w Twoim rejestrze zostały faktycznie opublikowane przez Ciebie i że nie zostały one zmodyfikowane od momentu publikacji.
Uwaga
Usługa Azure Container Registry (ACR) nie obsługuje acr import
importowania obrazów podpisanych za pomocą platformy Docker Content Trust (DCT). Zgodnie z projektem podpisy nie są widoczne po zaimportowaniu, a notariusz v2 przechowuje te podpisy jako artefakty.
Zaufane obrazy
Zaufanie do zawartości współdziała z tagami w repozytorium. Repozytoria obrazów mogą zawierać obrazy z zarówno podpisanymi, jak i niepodpisanymi tagami. Przykładowo można podpisać tylko obrazy myimage:stable
i myimage:latest
, ale nie myimage:dev
.
Klucze podpisywania
Zaufanie do zawartości jest zarządzane przy użyciu zestawu kryptograficznych kluczy podpisywania. Te klucze są skojarzone z konkretnym repozytorium w rejestrze. Istnieje kilka typów kluczy podpisywania, które są używane przez klientów platformy Docker i rejestr do zarządzania zaufaniem dla tagów w repozytorium. Po włączeniu zaufania do zawartości i zintegrowaniu go z publikowaniem kontenerów oraz potokiem zużycia należy ostrożnie zarządzać tymi kluczami. Aby uzyskać więcej informacji, zobacz sekcję Zarządzanie kluczami w dalszej części tego artykułu oraz artykuł Manage keys for content trust (Zarządzanie kluczami dla zaufania do zawartości) w dokumentacji platformy Docker.
Napiwek
To jest bardzo ogólne omówienie modelu zaufania do zawartości platformy Docker. Szczegółowe informacje na temat zaufania do zawartości znajdziesz w artykule Content trust in Docker (Zaufanie do zawartości na platformie Docker).
Włączanie zaufania do zawartości rejestru
Pierwszym krokiem jest włączenie zaufania do zawartości na poziomie rejestru. Gdy włączysz zaufanie do zawartości, klienci (użytkownicy lub usługi) będą mogli wypychać podpisane obrazy do Twojego rejestru. Włączenie zaufania do zawartości w rejestrze nie ogranicza użycia rejestru tylko do użytkowników z włączonym zaufaniem do zawartości. Użytkownicy bez włączonego zaufania do zawartości wciąż będą mogli używać Twojego rejestru w zwykły sposób. Jednak użytkownicy z włączony zaufaniem do zawartości w swoich klientach będą widzieć w Twoim rejestrze tylko podpisane obrazy.
Aby włączyć zaufanie do zawartości dla rejestru, najpierw przejdź do rejestru w witrynie Azure Portal. W obszarze Zasady wybierz pozycję Zaufanie>zawartości Włączone>zapisywanie. Możesz również użyć polecenia az acr config content-trust update w interfejsie wiersza polecenia platformy Azure.
Włączanie zaufania do zawartości klienta
Aby pracować z zaufanymi obrazami, zarówno wydawcy obrazów, jak i użytkownicy muszą włączyć zaufanie do zawartości dla swoich klientów platformy Docker. Jako wydawca możesz podpisywać obrazy, które wypychasz do rejestru z włączonym zaufaniem do zawartości. Jako użytkownikowi włączenie zaufania do zawartości ogranicza widok rejestru do wyłącznie podpisanych obrazów. Zaufanie do zawartości jest domyślnie wyłączone w klientach platformy Docker, ale można je włączyć przy użyciu sesji powłoki lub polecenia.
Aby włączyć zaufanie do zawartości dla sesji powłoki, ustaw zmienną środowiskową DOCKER_CONTENT_TRUST
na wartość 1. Na przykład w powłoce Bash:
# Enable content trust for shell session
export DOCKER_CONTENT_TRUST=1
Jeśli zamiast tego chcesz włączyć lub wyłączyć zaufanie do zawartości dla jednego polecenia, kilka poleceń platformy Docker obsługuje argument --disable-content-trust
. Aby włączyć zaufanie do zawartości dla pojedynczego polecenia:
# Enable content trust for single command
docker build --disable-content-trust=false -t myacr.azurecr.io/myimage:v1 .
Jeśli włączono zaufanie do zawartości dla sesji powłoki i chcesz je wyłączyć dla pojedynczego polecenia:
# Disable content trust for single command
docker build --disable-content-trust -t myacr.azurecr.io/myimage:v1 .
Udzielanie uprawnień do podpisywania obrazów
Tylko użytkownicy lub systemy, którym udzielono uprawnień, mogą wypychać zaufane obrazy do rejestru. Aby przyznać użytkownikowi (lub systemowi przy użyciu jednostki usługi) uprawnienia do wypychania zaufanego obrazu, przyznaj AcrImageSigner
rolę tożsamości firmy Microsoft Entra. Jest to dodatek do roli (lub równoważnej) wymaganej AcrPush
do wypychania obrazów do rejestru. Aby uzyskać szczegółowe informacje, zobacz Role i uprawnienia usługi Azure Container Registry.
Ważne
Nie można udzielić uprawnień do wypychania zaufanego obrazu do następujących kont administracyjnych:
- konto administratora rejestru kontenerów platformy Azure
- konto użytkownika w usłudze Microsoft Entra ID z rolą klasycznego administratora systemu.
Uwaga
Od lipca 2021 r AcrImageSigner
. rola obejmuje zarówno akcję, jak Microsoft.ContainerRegistry/registries/sign/write
i Microsoft.ContainerRegistry/registries/trustedCollections/write
akcję danych.
Szczegóły dotyczące przydzielania roli AcrImageSigner
w witrynie Azure Portal i interfejsie wiersza polecenia platformy Azure znajdują się poniżej.
Azure Portal
Wybierz pozycję Kontrola dostępu (IAM).
Kliknij pozycję Dodaj>Dodaj przypisanie roli, aby otworzyć stronę Dodawanie przypisania roli.
Przypisz następującą rolę. W tym przykładzie rola jest przypisywana do pojedynczego użytkownika. Aby uzyskać szczegółowe instrukcje, zobacz Przypisywanie ról platformy Azure przy użyciu witryny Azure Portal.
Ustawienie Wartość Rola AcrImageSigner Przypisz dostęp do User Elementy członkowskie Alain
Interfejs wiersza polecenia platformy Azure
Aby udzielić użytkownikowi uprawnień do podpisywania za pomocą interfejsu wiersza polecenia platformy Azure przypisz użytkownikowi rolę AcrImageSigner
ograniczoną do rejestru. Format polecenia jest następujący:
az role assignment create --scope <registry ID> --role AcrImageSigner --assignee <user name>
Aby na przykład przyznać użytkownikowi nieadministracyjnym rolę, możesz uruchomić następujące polecenia w uwierzytelnionej sesji interfejsu wiersza polecenia platformy Azure. Zmodyfikuj wartość REGISTRY
, aby odzwierciedlić nazwę rejestru kontenerów platformy Azure.
# 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
Możesz także udzielić jednostce usługi uprawnienia do wypychania zaufanych obrazów do rejestru. Używanie jednostki usługi jest przydatne w przypadku systemów kompilacji oraz innych nienadzorowanych systemów, które mają wypychać zaufane obrazy do rejestru. Format jest podobny jak w przypadku udzielania uprawnień użytkownikowi, ale dla wartości --assignee
należy określi identyfikator jednostki usługi.
az role assignment create --scope $REGISTRY_ID --role AcrImageSigner --assignee <service principal ID>
Identyfikator <service principal ID>
może być identyfikatorem appId lub objectId bądź jedną z nazw servicePrincipalName. Aby uzyskać więcej informacji na temat pracy z jednostkami usługi i usługą Azure Container Registry, zobacz Uwierzytelnianie w usłudze Azure Container Registry przy użyciu jednostek usługi.
Ważne
Po zmianie roli uruchom polecenie az acr login
, aby odświeżyć lokalny token tożsamości dla interfejsu wiersza polecenia platformy Azure, aby nowe role mogły obowiązywać. Aby uzyskać informacje na temat weryfikowania ról dla tożsamości, zobacz Dodawanie lub usuwanie przypisań ról platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure i Rozwiązywanie problemów z kontrolą dostępu opartą na rolach platformy Azure.
Wypychanie zaufanego obrazu
Aby wypchnąć tag zaufanego obrazu do rejestru kontenerów, włącz zaufanie do zawartości i wypchnij obraz za pomocą polecenia docker push
. Po wypchnięciu z podpisanym tagiem po raz pierwszy zostanie wyświetlony monit o utworzenie hasła zarówno dla głównego klucza podpisywania, jak i klucza podpisywania repozytorium. Zarówno klucz główny, jak i klucz repozytorium są generowane i przechowywane lokalnie na maszynie.
$ 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
Po pierwszym użyciu polecenia docker push
z włączonym zaufaniem do zawartości klient platformy Docker używa tego samego klucza głównego do kolejnych wypchnięć. Przy każdym kolejnym wypchnięciu do tego samego repozytorium wyświetlany jest tylko monit o podanie klucza repozytorium. Przy każdym wypchnięciu zaufanego obrazu do nowego repozytorium wyświetlany jest monit o podanie hasła dla nowego klucza repozytorium.
Ściąganie zaufanego obrazu
Aby ściągnąć zaufany obraz, włącz zaufanie do zawartości i uruchom polecenie docker pull
jak zwykle. Aby ściągnąć zaufane obrazy, rola jest wystarczająca AcrPull
dla zwykłych użytkowników. Nie są wymagane żadne dodatkowe role, takie jak AcrImageSigner
rola. Użytkownicy z włączonym zaufaniem do zawartości mogą ściągać tylko obrazy z podpisanymi tagami. Oto przykład ściągania podpisanego tagu:
$ 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
Jeśli klient z włączonym zaufaniem zawartości próbuje ściągnąć tag bez znaku, operacja kończy się niepowodzeniem z błędem podobnym do następującego:
$ docker pull myregistry.azurecr.io/myimage:unsigned
Error: remote trust data does not exist
Za kulisami
Po uruchomieniu polecenia docker pull
klient platformy Docker używa tej samej biblioteki co w przypadku interfejsu wiersza polecenia usługi Notary do zażądania mapowania skrótu tag-do-SHA-256 dla wypychanego tagu. Po zweryfikowaniu podpisów w danych zaufania klient nakazuje aparatowi platformy Docker wykonywanie "ściągania według skrótu". Podczas ściągania aparat używa sumy kontrolnej SHA-256 jako adresu zawartości, aby zażądać i zweryfikować manifest obrazu z rejestru kontenerów platformy Azure.
Uwaga
Usługa Azure Container Registry oficjalnie nie obsługuje interfejsu wiersza polecenia notary, ale jest zgodna z interfejsem API serwera notary, który jest dołączony do aplikacji Docker Desktop. Obecnie zaleca się notary w wersji 0.6.0 .
Zarządzanie kluczami
Jak określono w danych wyjściowych polecenia docker push
podczas wypychania pierwszego zaufanego obrazu, klucz główny jest najbardziej wrażliwy. Pamiętaj, aby utworzyć kopię zapasową klucza głównego i przechowywać ją w bezpiecznym miejscu. Domyślnie klient platformy Docker przechowuje klucze podpisywania w następującym katalogu:
~/.docker/trust/private
Utwórz kopię zapasową kluczy katalogu głównego i repozytorium, kompresując je w archiwum i przechowując je w bezpiecznej lokalizacji. Na przykład w powłoce Bash:
umask 077; tar -zcvf docker_private_keys_backup.tar.gz ~/.docker/trust/private; umask 022
Wraz z lokalnie wygenerowanym kluczem głównym i kluczem repozytorium generowanych jest kilka innych i są one zapisywane przez usługę Azure Container Registry podczas wypychania zaufanego obrazu. Szczegółowe omówienie różnych kluczy w implementacji zaufania do zawartości platformy Docker, w tym dodatkowe wskazówki dotyczące zarządzania, znajdziesz w artykule Manage keys for content trust (Zarządzanie kluczami dla zaufania do zawartości) w dokumentacji platformy Docker.
Utracenie klucza głównego
Jeśli utracisz dostęp do klucza głównego, utracisz dostęp do podpisanych tagów w każdym repozytorium, którego tagi były podpisane przy użyciu tego klucza. Usługa Azure Container Registry nie może przywrócić dostępu do tagów obrazów podpisanych przy użyciu utraconego klucza głównego. Aby usunąć wszystkie dane o zaufaniu (podpisy) dla rejestru, najpierw wyłącz, a następnie ponownie włącz zaufanie do zawartości dla rejestru.
Ostrzeżenie
Wyłączenie i ponowne włączenie zaufania do zawartości w rejestrze spowoduje usunięcie całości danych o zaufaniu dla wszystkich podpisanych tagów w każdym repozytorium w rejestrze. Ta akcja jest nieodwracalna — usługa Azure Container Registry nie może odzyskać usuniętych danych o zaufaniu. Wyłączenie zaufania do zawartości nie powoduje usunięcia samych obrazów.
Aby wyłączyć zaufanie do zawartości dla rejestru, przejdź do rejestru w witrynie Azure Portal. W obszarze Zasady wybierz pozycję Zaufanie>zawartości Wyłączone>zapisywanie. Zostanie wyświetlone ostrzeżenie dotyczące utraty wszystkich podpisów w rejestrze. Wybierz przycisk OK, aby trwale usunąć wszystkie podpisy w rejestrze.
Następne kroki
Zobacz Zaufanie do zawartości na platformie Docker, aby uzyskać dodatkowe informacje o zaufaniu zawartości, w tym poleceniach zaufania platformy Docker i delegowaniu zaufania. Mimo iż w tym artykule poruszono kilka kluczowych kwestii, zaufanie do zawartości to obszerny temat i omówiono go dogłębniej w dokumentacji platformy Docker.
Zapoznaj się z dokumentacją usługi Azure Pipelines , aby zapoznać się z przykładem korzystania z zaufania do zawartości podczas kompilowania i wypychania obrazu platformy Docker.