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.

Screenshot shows enabling content trust for a registry in the Azure portal.

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

  1. Wybierz pozycję Kontrola dostępu (IAM) .

  2. Wybierz pozycję Dodaj>przypisanie roli, aby otworzyć stronę Dodawanie przypisania roli.

  3. 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 Użytkownika
    Członkowie Alain

    Add role assignment page in Azure portal.

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.

Disabling content trust for a registry in the Azure portal

Następne kroki