Oprávnění k repozitáři v Azure Container Registry založená na tokenech jiných než Microsoft

Tento článek popisuje, jak vytvořit tokeny a mapování oborů pro správu přístupu k úložištím v registru kontejneru. Vytvořením tokenů může vlastník registru poskytovat uživatelům nebo službám s vymezeným oborem, časově omezený přístup k úložištím za účelem vyžádání nebo nabízení imagí nebo provádění dalších akcí. Token poskytuje jemněji odstupňovaná oprávnění než jiné možnosti ověřování registru, které oborují oprávnění pro celý registr.

Poznámka:

K správě oprávnění úložiště bez použití nástroje Microsoft Entra je možné použít tokeny a mapy oborů jiných společností než Microsoft Entra. Pokud chcete spravovat oprávnění úložiště pomocí přiřazení rolí Microsoft Entra pro identity Microsoft Entra, přečtěte si téma Řízení přístupu na základě atributů Microsoft Entra (ABAC) pro oprávnění úložiště.

Mezi běžné scénáře vytvoření tokenu patří:

  • Povolte zařízením IoT s jednotlivými tokeny vyžádat image z úložiště.
  • Zadejte externí organizaci s oprávněními k cestě k úložišti.
  • Omezte přístup úložiště k různým skupinám uživatelů ve vaší organizaci. Můžete například poskytnout vývojářům přístup pro zápis a čtení, kteří vytvářejí image, které cílí na konkrétní úložiště, a přístup ke čtení týmům, které nasazují z těchto úložišť.

Tato funkce je dostupná ve všech úrovních služby. Informace o úrovních a omezeních služby registru najdete v tématu Úrovně služby Azure Container Registry.

Omezení

  • Aktuálně nemůžete přiřadit oprávnění specifická pro úložiště identitě Microsoft Entra, jako je služební účet nebo spravovaná identita.

Koncepce

Pokud chcete nakonfigurovat oprávnění v oboru úložiště, vytvoříte token s přidruženou mapou oboru.

  • Token spolu s vygenerovaným heslem umožňuje uživateli ověřit se v registru. Pro heslo tokenu můžete nastavit datum vypršení platnosti nebo token kdykoli zakázat.

    Po ověření pomocí tokenu může uživatel nebo služba provádět jednu nebo více akcí s vymezeným oborem na jedno nebo více úložišť.

    Činnost Popis Příklad
    content/delete Odebrání dat z úložiště Odstranění úložiště nebo manifestu
    content/read Čtení dat z úložiště Stažení artefaktu
    content/write Zápis dat do úložiště Použijte s content/read pro protlačení artefaktu
    metadata/read Čtení metadat z úložiště Seznam značek nebo manifestů
    metadata/write Zápis metadat do úložiště Povolení nebo zakázání operací čtení, zápisu nebo odstranění

Poznámka:

Oprávnění omezená na úložiště nepodporují schopnost zobrazit seznam všech úložišť v registru.

  • Mapování oboru seskupí oprávnění úložiště, která použijete u tokenu, a může se znovu použít na jiné tokeny. Každý token je přidružený k jedné mapě oboru. Pomocí mapy rozsahu můžete:

    • Nakonfigurujte více tokenů s identickými oprávněními pro sadu úložišť.
    • Aktualizujte oprávnění tokenu, když přidáte nebo odeberete akce úložiště v mapě rozsahu nebo použijete jinou mapu rozsahu.

    Azure Container Registry také poskytuje několik map oborů definovaných systémem, které můžete použít při vytváření tokenů. Oprávnění map oboru definovaných systémem se vztahují na všechna úložiště ve vašem registru. Jednotlivé akce odpovídají limitu úložišť na mapování oboru.

Následující obrázek znázorňuje vztah mezi tokeny a mapami oborů.

Tokeny registru a mapy rozsahu

Požadavky

  • Azure CLI – Příklady příkazů Azure CLI v tomto článku vyžadují Azure CLI verze 2.17.0 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalovat nebo upgradovat, podívejte se na Install Azure CLI.
  • Docker – K ověření v registru pro vyžádání nebo nabízení imagí potřebujete místní instalaci Dockeru. Docker poskytuje pokyny k instalaci pro systémy macOS, Windows a Linux .
  • Registr kontejnerů – Pokud ho nemáte, vytvořte v předplatném Azure registr kontejneru. Použijte například Azure Portal nebo Azure CLI.

Vytvořit token - CLI

Vytvoření tokenu a zadání úložišť

Vytvořte token pomocí příkazu az acr token create . Při vytváření tokenu můžete zadat jedno nebo více úložišť a přidružených akcí pro každé úložiště. Úložiště zatím nemusí být v registru. Pokud chcete vytvořit token zadáním existující mapy oboru, přečtěte si další část.

Následující příklad vytvoří token v registru myregistry s následujícími oprávněními v úložišti samples/hello-world : content/write a content/read. Ve výchozím nastavení nastaví příkaz výchozí stav tokenu enabled na disabled, ale stav můžete kdykoli aktualizovat.

az acr token create --name MyToken --registry myregistry \
  --repository samples/hello-world \
  content/write content/read \
  --output json

Výstup zobrazuje podrobnosti o tokenu. Ve výchozím nastavení se vygenerují dvě hesla, jejichž platnost nevyprší, ale volitelně můžete nastavit datum vypršení platnosti. Doporučujeme uložit hesla na bezpečné místo pro pozdější použití pro ověřování. Hesla se nedají znovu načíst, ale dají se vygenerovat nové.

{
  "creationDate": "2023-01-18T00:15:34.066221+00:00",
  "credentials": {
    "certificates": [],
    "passwords": [
      {
        "creationTime": "2023-01-18T00:15:52.837651+00:00",
        "expiry": null,
        "name": "password1",
        "value": "uH54BxxxxK7KOxxxxRbr26dAs8JXxxxx"
      },
      {
        "creationTime": "2023-01-18T00:15:52.837651+00:00",
        "expiry": null,
        "name": "password2",
        "value": "kPX6Or/xxxxLXpqowxxxxkA0idwLtmxxxx"
      }
    ],
    "username": "MyToken"
  },
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myresourcegroup/providers/Microsoft.ContainerRegistry/registries/myregistry/tokens/MyToken",
  "name": "MyToken",
  "objectId": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "myresourcegroup",
  "scopeMapId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myresourcegroup/providers/Microsoft.ContainerRegistry/registries/myregistry/scopeMaps/MyToken-scope-map",
  "status": "enabled",
  "type": "Microsoft.ContainerRegistry/registries/tokens"
}

Poznámka:

Pokud chcete znovu vygenerovat hesla tokenů a období vypršení platnosti, přečtěte si část Opětovné generování hesel tokenů dále v tomto článku.

Výstup obsahuje podrobnosti o mapě rozsahu, kterou vytvořil příkaz. Mapu oboru zde pojmenovanou MyToken-scope-mapmůžete použít k použití stejných akcí úložiště u jiných tokenů. Nebo později aktualizujte mapu oboru, abyste změnili oprávnění přidružených tokenů.

Vytvoření tokenu a definování mapy rozsahu

Alternativní způsob, jak vytvořit token, je zadat existující mapu rozsahu. Pokud ještě nemáte mapování oboru, nejprve vytvořte ho zadáním úložišť a přidružených akcí. Poté při vytváření tokenu zadejte mapu rozsahu.

K vytvoření mapování oboru použijte příkaz az acr scope-map create . Následující příkaz vytvoří mapování oboru se stejnými oprávněními na úložišti samples/hello-world, které jste použili dříve.

az acr scope-map create --name MyScopeMap --registry myregistry \
  --repository samples/hello-world \
  content/write content/read \
  --description "Sample scope map"

Spusťte příkaz az acr token create za účelem vytvoření tokenu a specifikování mapování oboru MyScopeMap. Stejně jako v předchozím příkladu nastaví příkaz výchozí stav tokenu na enabled.

az acr token create --name MyToken \
  --registry myregistry \
  --scope-map MyScopeMap

Výstup zobrazuje podrobnosti o tokenu. Ve výchozím nastavení se generují dvě hesla. Doporučujeme uložit hesla na bezpečné místo pro pozdější použití pro ověřování. Hesla se nedají znovu načíst, ale dají se vygenerovat nové.

Poznámka:

Pokud chcete znovu vygenerovat hesla tokenů a období vypršení platnosti, přečtěte si část Opětovné generování hesel tokenů dále v tomto článku.

Jak používat mapy oborů k definování a přiřazování oprávnění pro více úložišť

Mapa rozsahu umožňuje použití zástupného znaku k definování a udělení podobných oprávnění pro více úložišť, která sdílejí společnou předponu. Úložiště s určitými oprávněními a úložiště se zástupným znakem lze také použít ve stejné mapě oboru. To poskytuje flexibilitu při správě oprávnění pro množinu úložišť v jediné kontextové mapě.

Oprávnění úložiště lze vytvořit, když je vytvořena mapa oboru a přiřazena tokenu. Případně můžete token vytvořit a přímo přiřadit k úložišti.

Následující příklad vytvoří mapu rozsahu se zástupným znakem a pak ji přiřadí k tokenu.

az acr scope-map create --name MyScopeMapWildcard --registry myregistry \
  --repository samples/* \
  content/write content/read \
  --description "Sample scope map with wildcards"
az acr token create --name MyTokenWildcard \
  --registry myregistry \
  --scope-map MyScopeMapWildcard

Následující příklad vytvoří token se zástupným znakem.

 az acr token create --name MyTokenWildcard --registry myregistry \
  --repository samples/* \
  content/write content/read \

Oprávnění se zástupnými čísly jsou doplňková, což znamená, že při přístupu ke konkrétnímu úložišti budou výsledná oprávnění obsahovat oprávnění pro všechna pravidla mapování oboru, která odpovídají předponě zástupného znaku.

V tomto příkladu mapa oboru definuje oprávnění pro tři různé typy úložišť:

Úložiště Povolení
sample/* content/read
sample/teamA/* content/write
sample/teamA/projectB content/delete

Tokenu je mapování oboru přiřazeno k udělení [content/read, content/write, content/delete] oprávnění pro přístup k úložišti sample/teamA/projectB. Pokud se ale stejný token používá pro přístup k úložišti sample/teamA/projectC, má pouze [content/read, content/write] oprávnění.

Důležité

Úložiště používající zástupné znaky v mapě rozsahu musí vždy končit příponou /*, aby byla platná, a mít v názvu úložiště pouze jeden zástupný znak. Tady je několik příkladů neplatných zástupných znaků:

  • sample/*/teamA se zástupným znakem uprostřed názvu úložiště.
  • sample/teamA* se zástupným znakem nekončí na `/*`.
  • sample/teamA/*/projectB/* s více zástupnými znaky v názvu úložiště.

Zástupné znaky na kořenové úrovni

Zástupné cardy lze použít také na kořenové úrovni. To znamená, že všechna oprávnění přiřazená k úložišti definovanému jako *, se použijí v celém registru.

Příklad ukazuje, jak vytvořit token se zástupným znakem kořenové úrovně, který udělí oprávnění tokenu [content/read, content/write] všem úložištím v registru. To poskytuje jednoduchý způsob, jak udělit oprávnění všem úložištím v registru, aniž byste museli zadávat jednotlivá úložiště.

 az acr token create --name MyTokenWildcard --registry myregistry \
  --repository * \
  content/write content/read \

Důležité

Pokud pravidlo se zástupným znakem zahrnuje úložiště, které ještě neexistuje, oprávnění pravidla zástupného znaku se na tento název úložiště budou nadále vztahovat. Například token, který je přiřazený k mapě oboru a uděluje [content/write, metadata/write] oprávnění pro sample/* úložiště. Předpokládejme také, že sample/teamC/teamCimage úložiště ještě neexistuje. Token bude mít oprávnění k nahrání obrázků do úložiště sample/teamC/teamCimage, které současně vytvoří úložiště při úspěšném nahrání.

Vytvoření tokenu – portál

Pomocí webu Azure Portal můžete vytvářet tokeny a mapy oborů. Stejně jako u příkazu CLI az acr token create můžete použít existující mapování oboru nebo vytvořit mapování oboru při vytváření tokenu a zadat jedno nebo více úložišť a přidružené akce. Úložiště zatím nemusí být v registru.

Následující příklad vytvoří token a mapu rozsahu s následujícími oprávněními v úložišti samples/hello-world: content/write a content/read.

  1. Na portálu přejděte do registru kontejneru.

  2. V části Oprávnění úložiště vyberte Tokeny > + Přidat.

    Snímek obrazovky s vytvářením tokenu na portálu

  3. Zadejte název tokenu.

  4. V části Mapa rozsahu zvolte Vytvořit nový.

  5. Konfigurace mapy oboru:

    1. Zadejte název a popis pro mapu rozsahu.

    2. V části Úložiště zadejte samples/hello-worlda v části Oprávnění vyberte content/read a content/write. Pak vyberte +Přidat.

      Snímek obrazovky s vytvářením mapy oboru na portálu

    3. Po přidání úložišť a oprávnění vyberte Přidat a přidejte mapování oboru.

  6. Přijměte výchozí stav tokenu Povoleno a pak vyberte Vytvořit.

Po ověření a vytvoření tokenu se podrobnosti o tokenu zobrazí na obrazovce Tokens (Tokens ).

Přidání hesla tokenu

Pokud chcete použít token vytvořený na portálu, musíte vygenerovat heslo. Můžete vygenerovat jedno nebo dvě hesla a pro každou z nich nastavit datum vypršení platnosti. Nová hesla vytvořená pro tokeny jsou k dispozici okamžitě. Opětovné vygenerování nových hesel pro tokeny bude trvat 60 sekund, než se replikují a budou k dispozici.

  1. Na portálu přejděte do registru kontejneru.

  2. V části Oprávnění úložiště vyberte Tokeny a vyberte token.

  3. V podrobnostech o tokenu vyberte heslo1 nebo heslo2 a vyberte ikonu Generovat.

  4. Na obrazovce s heslem volitelně nastavte datum vypršení platnosti hesla a vyberte Vygenerovat. Doporučujeme nastavit datum vypršení platnosti.

  5. Po vygenerování hesla ho zkopírujte a uložte do bezpečného umístění. Po zavření obrazovky nemůžete načíst vygenerované heslo, ale můžete vygenerovat nové heslo.

    Snímek obrazovky s vytvářením hesla tokenu na portálu

Ověřování pomocí tokenu

Když uživatel nebo služba používá token k ověření v cílovém registru, poskytne název tokenu jako uživatelské jméno a jedno z vygenerovaných hesel.

Metoda ověřování závisí na nakonfigurované akci nebo akcích přidružených k tokenu.

Činnost Jak ověřovat přihlašovací údaje
content/delete az acr repository delete v Azure CLI

Příklad: az acr repository delete --name myregistry --repository myrepo --username MyToken --password xxxxxxxxxx
content/read docker login

az acr login v Azure CLI

Příklad: az acr login --name myregistry --username MyToken --password xxxxxxxxxx
content/write docker login

az acr login v Azure CLI
metadata/read az acr repository show

az acr repository show-tags

az acr manifest list-metadata v Azure CLI
metadata/write az acr repository untag

az acr repository update v Azure CLI

Příklady: Použití tokenu

Následující příklady používají token vytvořený dříve v tomto článku k provádění běžných operací v úložišti: vložení a vyžádání imagí, odstranění imagí a výpis značek úložiště. Token byl původně nastaven s oprávněními pro push (akce content/write a content/read) v úložišti samples/hello-world.

Stažení a štítkování testovacích obrázků

V následujících příkladech si stáhněte veřejné hello-world a nginx obrázky ze služby Microsoft Container Registry a označte je pro svůj registr a úložiště.

docker pull mcr.microsoft.com/hello-world
docker pull mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
docker tag mcr.microsoft.com/hello-world myregistry.azurecr.io/samples/hello-world:v1
docker tag mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine myregistry.azurecr.io/samples/nginx:v1

Ověřování pomocí tokenu

Spusťte docker login nebo az acr login pro ověření identity v registru a následné nahrání nebo stažení imagí. Zadejte název tokenu jako uživatelské jméno a zadejte jedno z jeho hesel. Token musí mít Enabled stav.

Následující příklad je formátován pro prostředí Bash a poskytuje hodnoty pomocí proměnných prostředí.

TOKEN_NAME=MyToken
TOKEN_PWD=<token password>

echo $TOKEN_PWD | docker login --username $TOKEN_NAME --password-stdin myregistry.azurecr.io

Výstup by měl zobrazit úspěšné ověření:

Login Succeeded

Nahrávání imagí do registru

Po úspěšném přihlášení se pokuste odeslat označené image do registru. Vzhledem k tomu, že token má oprávnění k nahrání obrázků do samples/hello-world úložiště, následující nahrání proběhne úspěšně:

docker push myregistry.azurecr.io/samples/hello-world:v1

Token nemá oprávnění k úložišti samples/nginx, takže pokus o odeslání selže s chybou podobnou requested access to the resource is denied.

docker push myregistry.azurecr.io/samples/nginx:v1

Aktualizace oprávnění tokenu

Pokud chcete aktualizovat oprávnění tokenu, aktualizujte oprávnění v přidružené mapě oboru. Aktualizovaná mapa oboru se použije okamžitě u všech přidružených tokenů.

Aktualizujte MyToken-scope-map pomocí akcí content/write a content/read v úložišti samples/ngnx, a odeberte akci content/write v úložišti samples/hello-world.

Pokud chcete použít Azure CLI, spuštěním příkazu az acr scope-map update aktualizujte mapu oboru:

az acr scope-map update \
  --name MyScopeMap \
  --registry myregistry \
  --add-repository samples/nginx content/write content/read \
  --remove-repository samples/hello-world content/write 

Na webu Azure Portal:

  1. Přejděte do registru kontejneru.
  2. V části Oprávnění úložiště vyberte Mapy oborů a vyberte mapu oboru, kterou chcete aktualizovat.
  3. V části Úložiště zadejte samples/nginxa v části Oprávnění vyberte content/read a content/write. Pak vyberte +Přidat.
  4. V části Úložiště vyberte samples/hello-world a v části Oprávnění zrušte výběr content/write. Pak vyberte Uložit.

Po aktualizaci mapy rozsahu se následující odeslání podaří.

docker push myregistry.azurecr.io/samples/nginx:v1

Vzhledem k tomu, že mapa rozsahu má oprávnění pouze k content/read v samples/hello-world úložišti, pokus o odeslání do úložiště samples/hello-world nyní selže:

docker push myregistry.azurecr.io/samples/hello-world:v1

Načtení imagí z obou úložišť proběhne úspěšně, protože mapa oboru poskytuje content/read oprávnění pro obě úložiště:

docker pull myregistry.azurecr.io/samples/nginx:v1
docker pull myregistry.azurecr.io/samples/hello-world:v1

Smazat obrázky

Aktualizujte mapu oboru přidáním content/delete akce do nginx úložiště. Tato akce umožňuje odstranění imagí v úložišti nebo odstranění celého úložiště.

Pro stručnost zobrazujeme pouze příkaz az acr scope-map update k aktualizaci mapy oboru:

az acr scope-map update \
  --name MyScopeMap \
  --registry myregistry \
  --add-repository samples/nginx content/delete

Pokud chcete mapování oboru aktualizovat pomocí portálu, přečtěte si předchozí část.

K odstranění úložiště použijte následující příkaz az acr repository deletesamples/nginx. Pokud chcete odstranit image nebo úložiště, předejte do příkazu název a heslo tokenu. Následující příklad používá proměnné prostředí vytvořené dříve v článku:

az acr repository delete \
  --name myregistry --repository samples/nginx \
  --username $TOKEN_NAME --password $TOKEN_PWD

Zobrazení značek úložiště

Aktualizujte mapu oboru přidáním metadata/read akce do hello-world úložiště. Tato akce umožňuje čtení dat manifestu a značek v úložišti.

Pro stručnost zobrazujeme pouze příkaz az acr scope-map update k aktualizaci mapy oboru:

az acr scope-map update \
  --name MyScopeMap \
  --registry myregistry \
  --add-repository samples/hello-world metadata/read 

Pokud chcete mapování oboru aktualizovat pomocí portálu, přečtěte si předchozí část.

Pokud chcete číst metadata v samples/hello-world úložišti, spusťte příkaz az acr manifest list-metadata nebo az acr repository show-tags .

Pokud chcete číst metadata, předejte název a heslo tokenu každému z příkazů. Následující příklad používá proměnné prostředí vytvořené dříve v článku:

az acr repository show-tags \
  --name myregistry --repository samples/hello-world \
  --username $TOKEN_NAME --password $TOKEN_PWD

Ukázkový výstup:

[
  "v1"
]

Správa tokenů a map oborů

Mapy rozsahu seznamu

Pomocí příkazu az acr scope-map list nebo obrazovky Mapy oborů na portálu zobrazte seznam všech map oborů nakonfigurovaných v registru. Například:

az acr scope-map list \
  --registry myregistry --output table

Výstup se skládá ze tří map oboru definovaných systémem a dalších map oborů generovaných vámi. Tokeny je možné nakonfigurovat s libovolnou z těchto map oboru.

NAME                 TYPE           CREATION DATE         DESCRIPTION
-------------------  -------------  --------------------  ------------------------------------------------------------
_repositories_admin  SystemDefined  2023-01-20T09:44:24Z  Can perform all read, write and delete operations on the ...
_repositories_pull   SystemDefined  2023-01-20T09:44:24Z  Can pull any repository of the registry
_repositories_push   SystemDefined  2023-01-20T09:44:24Z  Can push to any repository of the registry
MyScopeMap           UserDefined    2022-11-15T21:17:34Z  Sample scope map

Zobrazení podrobností o tokenu

Pokud chcete zobrazit podrobnosti o tokenu, například stav a data vypršení platnosti hesla, spusťte příkaz az acr token show nebo vyberte token na obrazovce Tokens na portálu. Například:

az acr scope-map show \
  --name MyScopeMap --registry myregistry

Pomocí příkazu az acr token list nebo obrazovky Tokens na portálu zobrazte seznam všech tokenů nakonfigurovaných v registru. Například:

az acr token list --registry myregistry --output table

Opětovné generování hesel tokenů

Pokud jste nevygenerovali heslo tokenu nebo chcete vygenerovat nová hesla, spusťte příkaz az acr token credential generate . Opětovné vygenerování nových hesel pro tokeny bude trvat 60 sekund, než se replikují a budou k dispozici.

Následující příklad vygeneruje novou hodnotu pro heslo1 pro token MyToken s obdobím vypršení platnosti 30 dnů. Uloží heslo do proměnné prostředí TOKEN_PWD. Tento příklad je naformátovaný pro prostředí Bash.

TOKEN_PWD=$(az acr token credential generate \
  --name MyToken --registry myregistry --expiration-in-days 30 \
  --password1 --query 'passwords[0].value' --output tsv)

Pokud chcete k vygenerování hesla tokenu použít Azure Portal, projděte si kroky v části Vytvoření tokenu – portál výše v tomto článku.

Aktualizace tokenu s novou mapou oboru

Pokud chcete token aktualizovat pomocí jiného mapování oboru, spusťte příkaz az acr token update a zadejte nové mapování oboru. Například:

az acr token update --name MyToken --registry myregistry \
  --scope-map MyNewScopeMap

Na portálu na obrazovce Tokeny vyberte token a v části Mapa oboru vyberte jinou mapu oboru.

Návod

Po aktualizaci tokenu pomocí nové mapy oboru můžete chtít vygenerovat nová hesla tokenů. Použijte příkaz az acr token credential generate nebo vygenerujte heslo tokenu na webu Azure Portal.

Zakázání nebo odstranění tokenu

Možná budete muset dočasně zakázat použití přihlašovacích údajů tokenu pro uživatele nebo službu.

Pomocí Azure CLI spusťte příkaz az acr token update a nastavte na status :disabled

az acr token update --name MyToken --registry myregistry \
  --status disabled

Na portálu vyberte token na obrazovce Tokeny a v části Stav zvolte Zakázáno.

Pokud chcete odstranit token, který trvale zneplatní přístup kýmkoli pomocí svých přihlašovacích údajů, spusťte příkaz az acr token delete .

az acr token delete --name MyToken --registry myregistry

Na portálu vyberte token na obrazovce Tokeny a vyberte Zahodit.

Další kroky