Azure を企業で利用するときは
- せキュアな環境にしたい
- オンプレミスと接続して使いたい
- そのためにはオンプレミスに繋がる Vnet, NSG などのネットワーク権限をユーザ-に渡すのは最小にしたい
その結果, 管理者が負担をしないといけないけど… - Azure 管理者の負荷は下げたい
などの課題がよく出てきます
今日はこれについて考えてみます
目指す環境
以下の条件を満たすことを目指します
- 社内ユーザーに Azure のサブスクリプションを提供する
- Azure サブスクリプションはできるだけ自由に使わせる
- オンプレミスと繋がるネットワークは管理者が管理する
実装方法
本記事では RBAC のカスタムロールを使った方法を記述します
別記事では デプロイ スタックを使った方法について記述します
実装イメージ
Azure 管理者はサブスクリプションに対して所有者権限を持つ (ライセンスがあれば PIM も使う)
社内の Azure 利用ユーザーに触らせたくないリソースは1つのリソースグループにまとめる
このリソースグループに Vnet や NSG がある
Azure 利用ユーザーはそれ以外のリソースグループに自由にリソースを作成する
サブスクリプションとリソースグループの関係はこちらです
---
title: サブスクリプション全体構成
---
graph TD
sub1[サブスクリプション] --> rg1[Freeリソースグループ1]
sub1 --> rg2[Freeリソースグループ2]
sub1 --> rg3[管理リソースグループ]
rg1 --> r1[リソース1]
rg1 --> r2[リソース2]
rg2 --> r3[リソース3]
rg2 --> r4[リソース4]
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
管理者の権限を追加するとこちらです
サブスクリプションに所有者権限を付与しています
---
title: 管理者の権限
---
graph TD
subgraph 所有者
sub1[サブスクリプション]
rg1[Freeリソースグループ1]
rg2[Freeリソースグループ2]
rg3[管理リソースグループ]
sub1 --> rg1
sub1 --> rg2
sub1 --> rg3
rg1 --> r1[リソース1]
rg1 --> r2[リソース2]
rg2 --> r3[リソース3]
rg2 --> r4[リソース4]
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end
ユーザーにはサブスクリプション全体に閲覧者を付与します
ネットワークの設定は変更させたくない, しかし NIC の作成権限くらいは渡したい
ということで以下の構成にしてみます
---
title: ユーザーの権限
---
graph TD
subgraph 閲覧者
sub1[サブスクリプション]
rg1[Freeリソースグループ1]
rg2[Freeリソースグループ2]
rg3[管理リソースグループ]
sub1 --> rg1
sub1 --> rg2
sub1 --> rg3
subgraph 所有者
rg1 --> r1[リソース1]
rg1 --> r2[リソース2]
rg2 --> r3[リソース3]
rg2 --> r4[リソース4]
end
subgraph サブネットへ NIC を参加
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end
end
こうすることで
- Vnet と NSG の設定は自由に変更できない
- Vnet に NIC を参加できる
- Free のリソースグループの中では自由に操作ができる
を実現できます
実際その通りです.
ただし、今回はオンプレミスに繋がっている管理者が作成した環境の保護にだけ焦点を当てています
そのためオンプレにつながらない”ユーザーが作成する独立した Vnet” は無視します
サブネットへ NIC を参加権限について
Azure で仮想マシンや PaaS の Private Endpoint を使用するときは NIC を作成する必要があります
NIC は必ずどこかの Vnet に参加する必要があり、今回は管理リソースグループに含まれる Vnet に参加させます
そのために サブネットへ NIC の参加権限が必要になります
作業 | 操作するリソースグループ | RBAC 権限 |
---|---|---|
NIC リソースの作成 | Freeリソースグループ | 所有者 |
NIC の サブネット 参加 | Vnet がある 管理リソースグループ | Microsoft.Network/virtualNetworks/subnets/join/action |
NIC を Vnet に所属させるためにはサブネットでの subnets/join/action があれば可能です
図にするとこんな感じです
---
title: デプロイ イメージ
---
graph TD
subgraph 閲覧者
sub1[サブスクリプション]
rg1[Freeリソースグループ1]
rg2[Freeリソースグループ2]
rg3[管理リソースグループ]
sub1 --> rg1
sub1 --> rg2
sub1 --> rg3
subgraph 所有者
rg1 --> r1[NIC]
rg1 --> r2[リソース2]
rg2 --> r3[リソース3]
rg2 --> r4[リソース4]
end
subgraph サブネットへ NIC を参加
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end
r1 -- 参加 --> r5
end
カスタムロールを作成するならこれだけです
|
|
検証
VM の作成
実際に検証してみます
まずは管理者を想定したアカウントで以下の構成を作成
---
title: 検証:管理者の権限
---
graph TD
subgraph 所有者
sub1[サブスクリプション]
rg1[free-rg]
rg3[manage-rg]
sub1 --> rg1
sub1 --> rg3
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end

次にユーザーを想定したアカウントに権限を付与します
---
title: 検証:ユーザーの権限
---
graph TD
subgraph 閲覧者
sub1[サブスクリプション]
rg1[free-rg]
rg3[manage-rg]
sub1 --> rg1
sub1 --> rg3
subgraph 所有者
rg1
end
subgraph nic-subnet-join
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end
end

このユーザー (taro) で Azure Portal にアクセスして VM を作成してみます
---
title: 検証:VM の作成
---
graph TD
subgraph 閲覧者
sub1[サブスクリプション]
rg1[free-rg]
rg3[manage-rg]
sub1 --> rg1
sub1 --> rg3
subgraph 所有者
rg1 --> r1[VM]
rg1 --> r2[Disk]
rg1 --> r3[Public IP]
rg1 --> r4[NIC]
end
subgraph nic-subnet-join
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end
r4 -- 参加 --> r5
end
VM 作成時の検証は問題なくクリアして、デプロイも完了しました


作成したリソースを確認してみます
所有者権限を持つ free-rg には VM に関するリソースができていて、追加の Vnet はありません

manage-rg では追加のリソースはありませんが、NIC が参加していることがわかります


Private Endpoint の作成
次に Private Endpoint の作成をしてみます
新しい free2-rg を作成して、ストレージアカウントと Private Endpoint を作成します
---
title: 検証:Private Endpoint の作成
---
graph TD
subgraph 閲覧者
sub1[サブスクリプション]
rg1[free2-rg]
rg3[manage-rg]
sub1 --> rg1
sub1 --> rg3
subgraph 所有者
rg1 --> r1[ストレージアカウント]
rg1 --> r2[Private Endpoint]
rg1 --> r4[NIC]
end
subgraph nic-subnet-join
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end
r4 -- 参加 --> r5
end
適当に作ったストレージアカウントに対して Private Endpoint を作成します




今回は NIC を参加させる権限しかユーザーに与えていません
そのため以下の操作には失敗します
- ネットワーク ポリシーの変更
- DNS ゾーンを VNet にリンク
ただし、これらの操作は Azure 管理者が行う操作と見なして今回は割愛します
free2-rg を見ると無事にリソースが作成できています
Vnet の方を見に行くと参加している NIC が増えていることがわかります


おまけ
Azure の RBAC はサブスクリプションやリソースグループ単位だけじゃなく、リソース単位でも権限を付与することができます
これは子リソースにも一部(?) 対応しているので特定のサブネットにだけ権限付与することもできます
---
title: 特性のサブネットにフォーカスしたユーザーの権限
---
graph TD
subgraph 閲覧者
sub1[サブスクリプション]
rg1[free-rg]
rg3[manage-rg]
sub1 --> rg1
sub1 --> rg3
subgraph 所有者
rg1
end
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
subgraph nic-subnet-join
r7[Subnet1]
end
r5 --> r7
r5 --> r8[Subnet2]
end
こうすることで、NIC を参加させるサブネットを制限することもできます
検証は割愛しますが設定は Azure Portal のここから行うことができます

課題
ここまで NIC を Vnet に参加させる権限を見てきました
この権限の渡し方をすると NSG や Vnet Peering などの設定を変更させることは防げます
しかし、サブスクリプション全体には閲覧権限しか渡していないためリソースグループの作成・削除を気軽に行うことができません
→Azure 管理者に依頼する必要がある
まとめ
今回はカスタムロールを使って企業によくある「ネットワーク権限を渡したくない」を考えました
しかし、課題は残っています
次回はデプロイ スタックを使ってこの課題を解決したいと思います