# Az - Container Registry {{#include ../../../banners/hacktricks-training.md}} ## Grundinformationen Azure Container Registry (ACR) ist ein sicheres, privates Registry, das es Ihnen ermöglicht, **Container-Images in der Azure-Cloud zu speichern, zu verwalten und darauf zuzugreifen**. Es integriert sich nahtlos mit mehreren Azure-Diensten und bietet automatisierte Build- und Bereitstellungs-Workflows in großem Maßstab. Mit Funktionen wie Geo-Replikation und Schwachstellenscanning hilft ACR, die Sicherheit und Compliance auf Unternehmensniveau für containerisierte Anwendungen zu gewährleisten. ### Berechtigungen Dies sind die **verschiedenen Berechtigungen** [laut den Dokumenten](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager), die über ein Container-Registry vergeben werden können: - Zugriff auf den Resource Manager - Erstellen/Löschen von Registries - Image pushen - Image pullen - Bilddaten löschen - Richtlinien ändern - Images signieren Es gibt auch einige **vordefinierte Rollen**, die zugewiesen werden können, und es ist auch möglich, **benutzerdefinierte Rollen** zu erstellen. ![](/images/registry_roles.png) ### Authentifizierung > [!WARNING] > Es ist sehr wichtig, dass Sie, auch wenn der Registrierungsname einige Großbuchstaben enthält, immer **Kleinbuchstaben** verwenden, um sich anzumelden, Images zu pushen und zu pullen. Es gibt 4 Möglichkeiten, sich bei einem ACR zu authentifizieren: - **Mit Entra ID**: Dies ist die **Standard**-Methode zur Authentifizierung bei einem ACR. Es verwendet den **`az acr login`** Befehl, um sich beim ACR zu authentifizieren. Dieser Befehl **speichert die Anmeldeinformationen** in der **`~/.docker/config.json`** Datei. Darüber hinaus, wenn Sie diesen Befehl aus einer Umgebung ohne Zugriff auf einen Docker-Socket wie in einer **Cloud-Shell** ausführen, ist es möglich, das **`--expose-token`** Flag zu verwenden, um das **Token** zur Authentifizierung beim ACR zu erhalten. Um sich zu authentifizieren, müssen Sie als Benutzernamen `00000000-0000-0000-0000-000000000000` verwenden, wie: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` - **Mit einem Administratorkonto**: Der Administratorkonto ist standardmäßig deaktiviert, kann jedoch aktiviert werden, und dann ist es möglich, auf die Registry mit dem **Benutzernamen** und **Passwort** des Administratorkontos mit vollständigen Berechtigungen für die Registry zuzugreifen. Dies wird weiterhin unterstützt, da einige Azure-Dienste es verwenden. Beachten Sie, dass für diesen Benutzer **2 Passwörter** erstellt werden und beide gültig sind. Sie können es mit `az acr update -n --admin-enabled true` aktivieren. Beachten Sie, dass der Benutzername normalerweise der Registrierungsname ist (und nicht `admin`). - **Mit einem Token**: Es ist möglich, ein **Token** mit einem **spezifischen `scope map`** (Berechtigungen) zu erstellen, um auf die Registry zuzugreifen. Dann ist es möglich, diesen Token-Namen als Benutzernamen und eines der generierten Passwörter zur Authentifizierung bei der Registry mit `docker login -u -p aregistry-url>` zu verwenden. - **Mit einem Dienstprinzipal**: Es ist möglich, einen **Dienstprinzipal** zu erstellen und eine Rolle wie **`AcrPull`** zuzuweisen, um Images zu pullen. Dann ist es möglich, sich mit der SP appId als Benutzernamen und einem generierten Geheimnis als Passwort bei der Registry anzumelden. Beispielskript aus den [Dokumenten](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) zur Erstellung eines SP mit Zugriff auf eine Registry: ```bash #!/bin/bash ACR_NAME=$containerRegistry SERVICE_PRINCIPAL_NAME=$servicePrincipal # Obtain the full registry ID ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv) PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv) USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv) echo "Service principal ID: $USER_NAME" echo "Service principal password: $PASSWORD" ``` ### Verschlüsselung Nur die **Premium SKU** unterstützt **Verschlüsselung im Ruhezustand** für die Images und andere Artefakte. ### Netzwerk Nur die **Premium SKU** unterstützt **private Endpunkte**. Die anderen unterstützen nur **öffentlichen Zugriff**. Ein öffentlicher Endpunkt hat das Format `.azurecr.io` und ein privater Endpunkt hat das Format `.privatelink.azurecr.io`. Aus diesem Grund muss der Name des Registrys in ganz Azure einzigartig sein. ### Microsoft Defender für Cloud Dies ermöglicht es Ihnen, die **Images** im Registry auf **Schwachstellen** zu **scannen**. ### Soft-Delete Die Funktion **Soft-Delete** ermöglicht es Ihnen, ein **gelöschtes Registry** innerhalb der angegebenen Anzahl von Tagen **wiederherzustellen**. Diese Funktion ist **standardmäßig deaktiviert**. ### Webhooks Es ist möglich, **Webhooks** innerhalb von Registries zu **erstellen**. In diesem Webhook muss die URL angegeben werden, an die eine **Anfrage gesendet wird, wann immer eine Push- oder Löschaktion durchgeführt wird**. Darüber hinaus können Webhooks einen Geltungsbereich angeben, um die Repositories (Images) zu kennzeichnen, die betroffen sind. Zum Beispiel bedeutet 'foo:\*', dass Ereignisse unter dem Repository 'foo' stattfinden. Aus der Perspektive eines Angreifers ist es interessant, dies **vor der Durchführung einer Aktion** im Registry zu überprüfen und es vorübergehend zu entfernen, wenn nötig, um eine Entdeckung zu vermeiden. ### Verbundene Registries Dies ermöglicht im Wesentlichen, die **Images** von einem Registry zu einem anderen zu **spiegeln**, der sich normalerweise vor Ort befindet. Es hat 2 Modi: **ReadOnly** und **ReadWrite**. Im ersten Modus werden die Images nur **von** dem Quell-Registry **gezogen**, und im zweiten Modus können Images auch **zum** Quell-Registry **geschoben** werden. Damit Clients auf das Registry von Azure aus zugreifen können, wird ein **Token** generiert, wenn das verbundene Registry verwendet wird. ### Ausführungen & Aufgaben Ausführungen & Aufgaben ermöglichen es, in Azure containerbezogene Aktionen auszuführen, die Sie normalerweise lokal oder in einer CI/CD-Pipeline durchführen mussten. Zum Beispiel können Sie **Images im Registry erstellen, pushen und ausführen**. Der einfachste Weg, einen Container zu erstellen und auszuführen, ist die Verwendung einer regulären Ausführung: ```bash # Build echo "FROM mcr.microsoft.com/hello-world" > Dockerfile az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --file Dockerfile . # Run az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null ``` Allerdings wird dies Ausführungen auslösen, die aus der Perspektive eines Angreifers nicht besonders interessant sind, da ihnen keine verwaltete Identität zugeordnet ist. Allerdings können **Tasks** eine **system- und benutzerverwaltete Identität** zugeordnet haben. Diese Tasks sind die nützlichsten, um **Privilegien zu eskalieren** im Container. Im Abschnitt zur Eskalation von Privilegien ist zu sehen, wie man Tasks zur Eskalation von Privilegien nutzen kann. ### Cache Die Cache-Funktion ermöglicht es, **Bilder aus einem externen Repository herunterzuladen** und die neuen Versionen im Registry zu speichern. Es erfordert, dass einige **Anmeldeinformationen konfiguriert** werden, indem die Anmeldeinformationen aus einem Azure Vault ausgewählt werden. Dies ist aus der Perspektive eines Angreifers sehr interessant, da es ermöglicht, zu einer **externen Plattform zu pivotieren**, wenn der Angreifer genügend Berechtigungen hat, um auf die Anmeldeinformationen zuzugreifen. **Bilder aus einem externen Repository herunterzuladen** und einen Cache zu konfigurieren, könnte auch als **Persistenzmechanismus** verwendet werden. ## Enumeration > [!WARNING] > Es ist sehr wichtig, dass Sie, auch wenn der Registrierungsname einige Großbuchstaben enthält, nur Kleinbuchstaben in der URL verwenden, um darauf zuzugreifen. ```bash # List of all the registries # Check the network, managed identities, adminUserEnabled, softDeletePolicy, url... az acr list # Get the details of a registry az acr show --name # List tokens of a registry az acr token list --registry --resource-group # List repositories in a registry az acr repository list --name --resource-group # List the tags of a repository az acr repository show-tags --repository --name --resource-group # List deleted repository tags ## At the time of this writing there isn't yet any command to restore it az acr repository list-deleted --name # List tasks ## Check the git URL or the command az acr task list --registry # List tasks runs az acr task list-runs --registry # List connected registries az acr connected-registry list --registry # List cache az acr cache list --registry # Get cache details az acr cache show --name --registry ``` ## Privilegienerweiterung & Nachausnutzung {{#ref}} ../az-privilege-escalation/az-automation-accounts-privesc.md {{#endref}} ## Referenzen - [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli) - [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) {{#include ../../../banners/hacktricks-training.md}}