Azure 仮想ネットワークのサービス エンドポイントを使用してコンテナー レジストリへのアクセスを制限する

Azure Virtual Network では、Azure リソースやオンプレミス リソースのセキュアなプライベート ネットワーキングが提供されます。 サービス エンドポイントを使用すると、コンテナー レジストリのパブリック IP アドレスへのアクセスを仮想ネットワークのみに制限することで保護できます。 このエンドポイントでは、Azure バックボーン ネットワーク上のリソースへの最適なルートがトラフィックに提供されます。 仮想ネットワークとサブネットの ID も、各要求と一緒に転送されます。

この記事では、仮想ネットワークでコンテナー レジストリのサービス エンドポイント (プレビュー) を構成する方法について説明します。

各レジストリでは、最大 100 個の仮想ネットワーク規則がサポートされます。

重要

Azure Container Registry で Azure Private Link がサポートされ、仮想ネットワークからプライベート エンドポイントをレジストリにデプロイできるようになりました。 プライベート エンドポイントには、プライベート IP アドレスを使用して仮想ネットワーク内からアクセスできます。 ほとんどのネットワーク シナリオでは、サービス エンドポイントの代わりにプライベート エンドポイントを使用することをお勧めします。 コンテナー レジストリでは、仮想ネットワークから構成されたプライベート リンク機能とサービス エンドポイント機能の両方を有効にすることはサポートされていません。 そのため、リストを実行し、必要に応じてネットワーク ルールを削除することをお勧めします。

レジストリ サービス エンドポイントの構成は、Premium コンテナー レジストリ サービス レベルで利用できます。 レジストリ サービスのレベルと制限については、「Azure Container Registry のサービス レベル」を参照してください。

プレビューの制限事項

  • 現在、Azure Container Registry のサービス エンドポイントの今後の開発は計画されていません。 代わりに、プライベート エンドポイントを使用することをお勧めします。
  • Azure portal を使用してレジストリにサービス エンドポイントを構成することはできません。
  • サービス エンドポイントを使用してコンテナー レジストリにアクセスするためのホストとして使用できるのは、Azure Kubernetes Service クラスターまたは Azure 仮想マシンだけです。 "Azure Container Instances を含むその他の Azure サービスはサポートされていません。 "
  • Azure Container Registry のサービス エンドポイントは、Azure US Government クラウドまたは 21Vianet によって運営される Microsoft Azure クラウドではサポートされていません。

重要

プライベート エンドポイント、選択されたサブネット、または IP アドレスへのアクセスを制限するコンテナー レジストリでは、一部の機能が使用できないか、または追加の構成が必要になることがあります。

  • レジストリへのパブリック ネットワーク アクセスが無効になっている場合、Azure Security Center を含む特定の信頼されたサービスによるレジストリ アクセスのためには、ネットワーク設定でのネットワーク ルールのバイパスを有効にする必要があります。
  • パブリックネットワーク アクセスが無効になると、Azure DevOps Services を含む特定の Azure サービスのインスタンスは現在のところ、コンテナー レジストリにアクセスできません。
  • プライベート エンドポイントは現在、Azure DevOps マネージド エージェントでサポートされていません。 プライベート エンドポイントへのネットワーク回線を備えたセルフホステッド エージェントを使用する必要があります。
  • レジストリに承認されたプライベート エンドポイントが含まれ、かつパブリック ネットワーク アクセスが無効になっている場合、Azure portal、Azure CLI、またはその他のツールを使用してリポジトリやタグを仮想ネットワークの外部で一覧表示することはできません。

前提条件

  • この記事の Azure CLI 手順を使用するには、Azure CLI バージョン 2.0.58 以降が必要です。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

  • コンテナー レジストリがまだない場合は、1 つ作成し (Premium レベルが必要)、Docker Hub から hello-world などのサンプル イメージをプッシュします。 たとえば、Azure portal または Azure CLI を使用してレジストリを作成します。

  • 別の Azure サブスクリプションのサービス エンドポイントを使用してレジストリ アクセスを制限する場合、そのサブスクリプションで Azure Container Registry のリソースプロバイダーを登録する必要があります。 次に例を示します。

    az account set --subscription <Name or ID of subscription of virtual network>
    
    az provider register --namespace Microsoft.ContainerRegistry
    

Docker 対応仮想マシンの作成

テスト目的の場合は、Docker 対応の Ubuntu VM を使用して、Azure コンテナー レジストリにアクセスします。 レジストリに Microsoft Entra 認証を使うには、VM に Azure CLI もインストールします。 既に Azure 仮想マシンがある場合は、この作成手順を省略します。

仮想マシンとコンテナー レジストリに同じリソース グループを使用できます。 このセットアップでは最終的にクリーンアップが簡素化されますが、必須ではありません。 仮想マシンと仮想ネットワークに別々のリソース グループを作成することを選択する場合は、az group create を実行します。 次の例では、リソース グループ名とレジストリの場所に対して環境変数を設定していることを前提としています。

az group create --name $RESOURCE_GROUP --location $REGISTRY_LOCATION

ここで、az vm create を使用して、既定の Ubuntu Azure 仮想マシンをデプロイします。 次の例では、myDockerVM という名前の VM を作成します。

VM_NAME=myDockerVM

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name $VM_NAME \
  --image Ubuntu2204 \
  --admin-username azureuser \
  --generate-ssh-keys

VM が作成されるまで、数分間かかります。 コマンドが完了したら、Azure CLI によって表示された publicIpAddress をメモします。 このアドレスは、VM への SSH 接続を作成するために使用します。

VM に Docker をインストールする

VM が実行されたら、VM への SSH 接続を作成します。 publicIpAddress を VM のパブリック IP アドレスに置き換えます。

ssh azureuser@publicIpAddress

次のコマンドを実行して、Ubuntu VM に Docker をインストールします。

sudo apt-get update
sudo apt install docker.io -y

インストールの後、次のコマンドを実行して、VM 上で Docker が正しく実行されていることを確認します。

sudo docker run -it hello-world

出力:

Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

Azure CLI のインストール

Ubuntu 仮想マシンに Azure CLI をインストールするには、「apt での Azure CLI のインストール」の手順に従います。 次に例を示します。

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

SSH 接続を終了します。

レジストリへのネットワーク アクセスを構成する

このセクションでは、Azure 仮想ネットワーク内のサブネットからのアクセスを許可するようにコンテナー レジストリを構成します。 Azure CLI を使用した手順が用意されています。

サブネットにサービス エンドポイントを追加する

VM を作成するときに、既定では Azure によって仮想ネットワークが同じリソース グループに作成されます。 仮想ネットワークの名前は仮想マシンの名前に基づいています。 たとえば、仮想マシンに myDockerVM という名前を付ける場合、既定の仮想ネットワーク名は myDockerVMVNET で、サブネット名は myDockerVMSubnet です。 これを確認するには、az network vnet list コマンドを使用します。

az network vnet list \
  --resource-group myResourceGroup \
  --query "[].{Name: name, Subnet: subnets[0].name}"

出力:

[
  {
    "Name": "myDockerVMVNET",
    "Subnet": "myDockerVMSubnet"
  }
]

az network vnet subnet update コマンドを使用して、Microsoft.ContainerRegistry サービス エンドポイントをサブネットに追加します。 次のコマンドでは、自分の仮想ネットワークとサブネットの名前に置き換えます。

az network vnet subnet update \
  --name myDockerVMSubnet \
  --vnet-name myDockerVMVNET \
  --resource-group myResourceGroup \
  --service-endpoints Microsoft.ContainerRegistry

az network vnet subnet show コマンドを使用して、サブネットのリソース ID を取得します。 これは、後でネットワーク アクセス規則を構成する手順で必要になります。

az network vnet subnet show \
  --name myDockerVMSubnet \
  --vnet-name myDockerVMVNET \
  --resource-group myResourceGroup \
  --query "id"
  --output tsv

出力:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet

レジストリへの既定のネットワーク アクセスを変更する

既定では、Azure コンテナー レジストリは、任意のネットワーク上のホストからの接続を許可します。 選択したネットワークへのアクセスを制限するには、既定のアクションを変更してアクセスを拒否します。 次の az acr update コマンドでは、自分のレジストリの名前に置き換えます。

az acr update --name myContainerRegistry --default-action Deny

レジストリにネットワーク規則を追加する

az acr network-rule add コマンドを使用して、VM のサブネットからのアクセスを許可するネットワーク規則をレジストリに追加します。 次のコマンドでは、コンテナー レジストリの名前とサブネットのリソース ID に置き換えます。

az acr network-rule add \
  --name mycontainerregistry \
  --subnet <subnet-resource-id>

レジストリへのアクセスの検証

構成が更新されるまで数分間待機した後、VM がコンテナー レジストリにアクセスできることを確認します。 VM への SSH 接続を行い、az acr login コマンドを実行してレジストリにログインします。

az acr login --name mycontainerregistry

docker pull を実行してサンプル イメージをレジストリからプルするなどのレジストリ操作を実行できます。 先頭にレジストリ ログイン サーバー名 (すべて小文字) を付けて、レジストリに適したイメージとタグに置き換えます。

docker pull mycontainerregistry.azurecr.io/hello-world:v1

Docker によってイメージが VM に正常にプルされます。

この例では、ネットワーク アクセス規則を通じてプライベート コンテナー レジストリにアクセスできることを示します。 ただし、ネットワーク アクセス規則が構成されていないログイン ホストからレジストリにアクセスすることはできません。 az acr login コマンドまたは docker login コマンドを使用して別のホストからログインしようとした場合、出力は次のようになります。

Error response from daemon: login attempt to https://xxxxxxx.azurecr.io/v2/ failed with status: 403 Forbidden

既定のレジストリ アクセスの復元

既定でアクセスを許可するようにレジストリを復元するには、構成されているネットワーク規則をすべて削除します。 次に、アクセスを許可する既定のアクションを設定します。

ネットワーク規則を削除する

レジストリに対して構成されているネットワーク規則の一覧を表示するには、次の az acr network-rule list コマンドを実行します。

az acr network-rule list --name mycontainerregistry 

構成されている規則ごとに az acr network-rule remove コマンドを実行して、各規則を削除します。 次に例を示します。

# Remove a rule that allows access for a subnet. Substitute the subnet resource ID.

az acr network-rule remove \
  --name mycontainerregistry \
  --subnet /subscriptions/ \
  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet

アクセスを許可

次の az acr update コマンドでは、自分のレジストリの名前に置き換えます。

az acr update --name myContainerRegistry --default-action Allow

リソースをクリーンアップする

すべての Azure リソースを同じリソース グループ内に作成し、それらが不要になった場合は、1 つの az group delete コマンドを使用してリソースを削除することもできます。

az group delete --name myResourceGroup

次のステップ