🎉

Azure Container Registriesで属性ベースのアクセス制御(ABAC)がGAしたので試してみた

に公開

はじめに

2025/11/18にAzure Container Registriesの属性ベースのアクセス制御(ABAC)がGAしまました🎉
実際に試してみながら、今回のアップデートを解説してみます!

ACRのABACでできること

属性ベースのアクセス制御(Attribute-Based Access Control、略してABAC)を使用すると、Azureロールの割り当てに属性を用いた条件を追加することができます。

ACRでは、ロールを割り当てる際に属性「リポジトリ名」を条件に指定でき、特定のリポジトリだけに権限を付与できます。

従来のロールベースのアクセス制御(Role-Based Access Control、略してRBAC)ではACRの全てのリポジトリに対してロールが適用され、リポジトリ単位で権限を制御することはできませんでした。
ABACを利用することで、複数のアプリケーションでACRを共有している場合に担当リポジトリだけに限定した権限を付与するといったことができるようになります。

試してみる

概要

ACRに2つのリポジトリを作成し、それぞれにABACを設定して自分のチームのリポジトリに限定した権限を付与してみます。

ACRの作成

ACR作成時にロールの割り当てアクセス許可モードRBAC レジストリ + ABAC リポジトリのアクセス許可を選択することでABACが使用できるようになります。
ABACは全てのリージョンでGAしていますが、Azure Portalの日本語表示ではまだプレビュー表記が残っています。

作成済みのACRもプロパティで変更可能です。

ABACで使用するロール

ABACを使用する場合は、専用のロールを割り当てる必要があります。

ロール 主な権限(データプレーン) ABAC条件 補足/制約
Container Registry Repository Contributor Pull/Push/Delete、メタデータ閲覧(タグ等)が可能。リポジトリの一覧表示は不可。 対応
Container Registry Repository Writer Pull/Push、メタデータ閲覧(タグ等)が可能。リポジトリの一覧表示は不可。 対応 Deleteは不可(Contributorのみ可能)。
Container Registry Repository Reader Pullとメタデータ閲覧(タグ等)が可能。リポジトリの一覧表示は不可。 対応
Container Registry Repository Catalog Lister リポジトリの一覧表示のみ可能。Push/Pull/Deleteは不可。 非対応 ABAC条件を付けられず常に全リポジトリに適用される。

ABACの設定

Team A UserTeam B UserそれぞれにReader(閲覧者)Container Registry Repository WriterContainer Registry Repository Catalog Listerロールを付与し、自分の所属するチームのリポジトリのみ権限を付与する条件を定義します。

Readerロールの付与

Azure PortalでACRを表示できるようにするためにコントロールプレーン用のロールを付与します。
Reader(閲覧者)ロールを付与します。

Container Registry Repository Writerロールの付与

ACRリポジトリにコンテナイメージをPushするためにデータプレーン用のABACロールを付与します。
ロール割り当ての追加画面でABAC条件に対応したロールを選択すると、条件タブが有効になります。

条件タブでは、割り当ての対象とするアクションの指定と、条件の定義を行います。
条件の属性ではリポジトリ名のみが指定可能です。完全一致や前方一致などの条件が作成可能で、対応している演算子は こちら に記載されています。

今回は自分の所属するチームのリポジトリのみ権限を付与したいので、リポジトリ名がteam-a/で始まっている場合のみ、データアクション権限を付与する条件としています。(Team B Userも同様に設定)

Container Registry Repository Catalog Listerロールの付与

ACRリポジトリの一覧を表示するためにデータプレーン用のABACロールを付与します。
Catalog ListerロールはABACの条件に対応していないので、条件タブは無効となっています。
条件に対応していないロールは全てのリポジトリに対して適用されます。

動作確認

Team A Userでteam-aリポジトリにPush

Team Aに所属するTeam A Userでコンテナイメージをビルドして、ACRにPushしてみます。

git clone https://github.com/Azure-Samples/aci-helloworld.git
cd aci-helloworld

REG="acrazpoc"
IMAGE="team-a/sample/aci-helloworld"
TAG="v1"

# コンテナイメージのビルド
LOGIN_SERVER=$(az acr show -n acrazpoc --query loginServer -o tsv)
docker build -t "$LOGIN_SERVER/$IMAGE:$TAG" .

# ACRにログイン
TOKEN=$(az acr login --name acrazpoc --expose-token --output tsv --query accessToken)
docker login $LOGIN_SERVER -u 00000000-0000-0000-0000-000000000000 -p "$TOKEN"

# ACRにPush
docker push "$LOGIN_SERVER/$IMAGE:$TAG"

Pushは成功し、Azure Portalでもリポジトリが追加されたことが確認できます。

Team A Userでteam-bリポジトリにPush

今度はTeam Aに所属するTeam A Userでコンテナイメージをビルドして、リポジトリ名をteam-bとしてACRにPushしてみます。

git clone https://github.com/Azure-Samples/acr-build-helloworld-node
cd acr-build-helloworld-node

EG="acrazpoc"
IMAGE="team-b/acr-build-helloworld-node"
TAG="v1"

# コンテナイメージのビルド
LOGIN_SERVER=$(az acr show -n acrazpoc --query loginServer -o tsv)
docker build -t "$LOGIN_SERVER/$IMAGE:$TAG" .

# ACRにログイン
TOKEN=$(az acr login --name acrazpoc --expose-token --output tsv --query accessToken)
docker login $LOGIN_SERVER -u 00000000-0000-0000-0000-000000000000 -p "$TOKEN"

# ACRにPush
docker push "$LOGIN_SERVER/$IMAGE:$TAG"

ABACでリポジトリ名がteam-a/で始まっている場合のみ、データアクション権限を付与する条件を設定しており、Pushするリポジトリ名は条件に一致しないためPushはブロックされます。

ush access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed

Team B Userでteam-bリポジトリにPush

Team Bに所属するTeam B Userでサインインし直して、リポジトリ名をteam-bとしてACRにPushします。コマンドは先ほどの手順と同じものを使用します。

Pushは成功し、Azure Portalでもリポジトリが追加されたことが確認できます。
Container Registry Repository Catalog Listerロールが付与されているため、全てのリポジトリの一覧が表示されます。

Team A Userでteam-bリポジトリにアクセスしてみる

ABACでリポジトリ名がteam-a/で始まっている場合のみ、データアクション権限を付与する条件を設定しており、リポジトリ名は条件に一致しないためアクセスはブロックされます。

表示するリポジトリをフィルタする

ABACを有効にしたACRでリポジトリ一覧を表示するにはContainer Registry Repository Catalog Listerロールの割り当てが必要ですが、ABACの条件に対応していないので権限を持つリポジトリのみを表示することができません。権限を付与されていないものも含め、ACRの全てのリポジトリ名が表示されます。

そのため、現時点では利用者側で一覧表示のフィルタを行う必要があります。

Azure Portalでは、リポジトリ名の部分一致で一覧表示をフィルタすることができます。

Azure CLIでは、--queryパラメーターを使用してコマンドの結果に対してフィルタをすることができます。

az acr repository list -n acrazpoc \
  --query "[?starts_with(@, 'team-a/')]" \
  -o tsv

最後に

ACR 全体ではなくリポジトリ単位でアクセス制御できるため、開発者・CI/CDパイプライン・コンテナ実行基盤などに対して、許可したリポジトリに限ってイメージのPull/Pushを許可する最小権限設計がしやすくなりました。

リポジトリ一覧を表示するContainer Registry Repository Catalog ListerロールだけABAC条件に対応していないのがもどかしいですが、今後の機能強化に期待しています!

参考

https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-rbac-abac-repository-permissions?tabs=azure-portal#effect-on-existing-role-assignments

Discussion