# Az - Container Registry

{{#include ../../../banners/hacktricks-training.md}}

## 基本情報

Azure Container Registry (ACR) は、**Azure クラウド内でコンテナイメージを保存、管理、アクセスする**ための安全でプライベートなレジストリです。いくつかの Azure サービスとシームレスに統合され、大規模な自動ビルドおよびデプロイワークフローを提供します。地理的レプリケーションや脆弱性スキャンなどの機能を備えた ACR は、コンテナ化されたアプリケーションのエンタープライズグレードのセキュリティとコンプライアンスを確保するのに役立ちます。

### 権限

これらは、Container Registry に対して付与できる**異なる権限**です [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager):

- アクセス リソース マネージャー
- レジストリの作成/削除
- イメージのプッシュ
- イメージのプル
- イメージデータの削除
- ポリシーの変更
- イメージの署名

また、割り当て可能な**組み込みロール**もあり、**カスタムロール**を作成することも可能です。

![](/images/registry_roles.png)

### 認証

> [!WARNING]
> レジストリ名に大文字が含まれていても、**小文字**を使用してログイン、プッシュ、プルすることが非常に重要です。

ACR に認証する方法は 4 つあります:

- **Entra ID を使用**: これは ACR に認証するための**デフォルト**の方法です。**`az acr login`** コマンドを使用して ACR に認証します。このコマンドは、**`~/.docker/config.json`** ファイルに資格情報を**保存**します。さらに、**クラウドシェル**のように Docker ソケットにアクセスできない環境でこのコマンドを実行している場合、**`--expose-token`** フラグを使用して ACR に認証するための**トークン**を取得できます。次に、認証するにはユーザー名として `00000000-0000-0000-0000-000000000000` を使用します。例: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **管理者アカウントを使用**: 管理者ユーザーはデフォルトで無効になっていますが、有効にすることができ、その後、管理者アカウントの**ユーザー名**と**パスワード**を使用してレジストリにアクセスすることが可能になります。これは、いくつかの Azure サービスがこれを使用しているため、まだサポートされています。このユーザーには**2 つのパスワード**が作成され、どちらも有効です。`az acr update -n <acrName> --admin-enabled true` で有効にできます。ユーザー名は通常、レジストリ名（`admin` ではなく）です。
- **トークンを使用**: レジストリにアクセスするための**特定の `scope map`**（権限）を持つ**トークン**を作成することが可能です。その後、トークンの名前をユーザー名として使用し、生成されたパスワードのいずれかを使用して、`docker login -u <registry-name> -p <password> <registry-url>` でレジストリに認証できます。
- **サービスプリンシパルを使用**: **サービスプリンシパル**を作成し、イメージをプルするために **`AcrPull`** のようなロールを割り当てることが可能です。その後、SP appId をユーザー名として、生成されたシークレットをパスワードとして使用して、**レジストリにログイン**できます。

レジストリへのアクセスを持つ SP を生成するための [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) からの例のスクリプト:
```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"
```
### 暗号化

**Premium SKU** のみが、画像やその他のアーティファクトの **静止時の暗号化** をサポートしています。

### ネットワーキング

**Premium SKU** のみが **プライベートエンドポイント** をサポートしています。他のSKUは **パブリックアクセス** のみをサポートしています。パブリックエンドポイントは `<registry-name>.azurecr.io` の形式で、プライベートエンドポイントは `<registry-name>.privatelink.azurecr.io` の形式です。このため、レジストリの名前はすべてのAzureで一意である必要があります。

### Microsoft Defender for Cloud

これにより、レジストリ内の **画像をスキャン** して **脆弱性** を検出できます。

### ソフトデリート

**ソフトデリート** 機能により、指定された日数内に **削除されたレジストリを復元** できます。この機能は **デフォルトで無効** になっています。

### ウェブフック

レジストリ内に **ウェブフックを作成** することが可能です。このウェブフックでは、**プッシュまたは削除アクションが実行されるたびにリクエストが送信されるURL** を指定する必要があります。さらに、ウェブフックは影響を受けるリポジトリ（画像）を示すスコープを指定できます。例えば、'foo:\*' はリポジトリ 'foo' の下のイベントを意味します。

攻撃者の視点からは、レジストリ内で **アクションを実行する前にこれを確認** し、必要に応じて一時的に削除して検出を避けることが興味深いです。

### 接続されたレジストリ

これは基本的に、通常はオンプレミスにある別のレジストリから **画像をミラーリング** することを可能にします。

2つのモードがあります: **ReadOnly** と **ReadWrite**。最初のモードでは、画像はソースレジストリからのみ **プル** され、2番目のモードでは、画像をソースレジストリに **プッシュ** することもできます。

クライアントがAzureからレジストリにアクセスするためには、接続されたレジストリが使用されるときに **トークン** が生成されます。

### 実行とタスク

実行とタスクは、通常ローカルまたはCI/CDパイプラインで行う必要があるAzureコンテナ関連のアクションを実行することを可能にします。例えば、レジストリ内で **画像をビルド、プッシュ、実行** できます。

コンテナをビルドして実行する最も簡単な方法は、通常の実行を使用することです:
```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
```
しかし、それは攻撃者の視点からはあまり興味深くない実行をトリガーします。なぜなら、それらには管理されたアイデンティティが付いていないからです。

しかし、**tasks** には **system and user managed identity** を付けることができます。これらのタスクは、コンテナ内で **escalate privileges** に役立ちます。特権昇格のセクションでは、タスクを使用して特権を昇格させる方法を見ることができます。

### Cache

キャッシュ機能は、**download images from an external repository** を行い、新しいバージョンをレジストリに保存することを可能にします。Azure Vaultから資格情報を選択することで、いくつかの **credentials configured** を持つ必要があります。

これは攻撃者の視点から非常に興味深いです。なぜなら、攻撃者が資格情報にアクセスするのに十分な権限を持っている場合、**pivot to an external platform** を可能にし、**download images from an external repository** を行い、キャッシュを構成することは **persistence mechanism** としても使用できるからです。

## Enumeration

> [!WARNING]
> レジストリ名に大文字が含まれていても、アクセスするためのURLには小文字のみを使用することが非常に重要です。
```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 <registry-name>

# List tokens of a registry
az acr token list --registry <registry-name> --resource-group <res-group>

# List repositories in a registry
az acr repository list --name <registry-name> --resource-group <res-group>

# List the tags of a repository
az acr repository show-tags --repository <repository-name> --name <registry-name> --resource-group <res-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 <registry-name>

# List tasks
## Check the git URL or the command
az acr task list --registry <registry-name>

# List tasks runs
az acr task list-runs --registry <registry-name>

# List connected registries
az acr connected-registry list --registry <registry-name>

# List cache
az acr cache list --registry <registry-name>

# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>
```
## 認証されていないアクセス

{{#ref}}
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
{{#endref}}

## 権限昇格とポストエクスプロイト

{{#ref}}
../az-privilege-escalation/az-container-registry-privesc.md
{{#endref}}

## 参考文献

- [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}}
