企業で Azure を使う際のネットワークの権限管理について書きました
Azure のネットワークを最小権限にし隊 その1 – クラウドを勉強し隊
今回はその続きになります
去年に引き続き 2回目の参加です!
目指す環境
※前回の記事からのコピペです
以下の条件を満たすことを目指します
- 社内ユーザーに Azure のサブスクリプションを提供する
- Azure サブスクリプションはできるだけ自由に使わせる
- オンプレミスと繋がるネットワークは管理者が管理する
前の記事の課題
前の記事ではカスタムロールを使って実現しましたが、以下の課題がありました
サブスクリプション全体には閲覧権限しか渡していないためリソースグループの作成・削除を気軽に行うことができません
---
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
今回はデプロイ スタックを使って課題を解決して理想の運用環境を目指します
デプロイ スタックとは
デプロイ スタックとは以下の特徴があります
- リソースグループとは違う観点でリソースをまとめてデプロイ・削除できる
- RBAC の拒否割り当てが使える
---
title: 通常のデプロイ
---
graph LR
A["`Bicep
ARM テンプレート`"]
C[リソース]
A -- デプロイ --> C
---
title: デプロイスタックの利用
---
graph LR
A["`Bicep
ARM テンプレート`"]
subgraph デプロイスタック
C[リソース]
D([拒否の割り当て])
end
A -- デプロイ --> C
Bicep や ARM テンプレート を使ったリソースのデプロイ時にデプロイ スタックという箱をつけてあげるイメージです
拒否の割り当てを更新することもできます
---
title: デプロイスタックの更新
---
graph LR
A["`Bicep
ARM テンプレート`"]
subgraph デプロイスタック
C[リソース]
D([拒否の割り当てを更新])
end
A -- デプロイ --> C
style D fill:#f9f,color:#fff
デプロイスタックという箱が邪魔になれば消すこともできます
---
title: デプロイスタックだけの削除
---
graph LR
A["`Bicep
ARM テンプレート`"]
subgraph デプロイスタック
C[リソース]
D([拒否の割り当て])
end
A -- デプロイ --> C
style デプロイスタック stroke-dasharray: 5 5,color:gray
style D stroke-dasharray: 5 5,color:gray
リソースごとデプロイスタックの削除をすることもできます
---
title: デプロイスタックとリソースの削除
---
graph LR
A["`Bicep
ARM テンプレート`"]
subgraph デプロイスタック
C[リソース]
D([拒否の割り当て])
end
A -- デプロイ --x C
style C stroke-dasharray: 5 5,color:gray
style デプロイスタック stroke-dasharray: 5 5,color:gray
style D stroke-dasharray: 5 5,color:gray
詳しくは以前に試したこちらの記事を参照してください
Bicep でのデプロイ スタックの作成とデプロイ - Azure Resource Manager | Microsoft Learn
実装イメージ
管理者にだけ操作を許すリソースはデプロイスタックを使って作成する
この時に拒否の割り当て (ロック) をかけることでユーザ-には変更させない
サブスクリプションの実装イメージはこちらです
---
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]
D([拒否の割り当て])
subgraph デプロイスタック
r5
r6
D
end
管理者に権限を付与するイメージはこちらです
サブスクリプション全体に所有者権限を渡します
デプロイスタックで作成するリソースは管理者が変更する可能性があると想定して拒否の割り当てを除外しておきます
---
title: 管理者の権限
---
graph TD
subgraph 所有者
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]
D([拒否の割り当て を除外])
subgraph デプロイスタック
r5
r6
D
end
style D stroke-dasharray: 5 5,color:gray
end
ユーザーにはカスタムロールの時とは違って, 所有者または共同作成者を与えています
デプロイスタック使って作成するリソースには拒否の割り当てを設定するため, 変更や削除はできません
ただし, Vnet に NIC を作成することは許可させたいため一部のアクションは拒否の割り当ての除外にしておきます
---
title: ユーザーの権限
---
graph TD
subgraph 所有者または共同作成者
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]
D(["'拒否の割り当て
一部のアクションは除外'"])
subgraph デプロイスタック
r5
r6
D
end
end
こうすることで
- Vnet と NSG の設定は自由に変更できない
- Vnet に NIC を参加できる
- リソースグループにリソースを作成, 削除できる
- リソースグループの作成,削除も自由にできる
- カスタムロールでは実現できなかったこと
その結果,ユーザーに特権ロールを付与しても今回のモチベーションの 目指す環境 を実現することができます
デプロイ スタックで作成するもの
構成が複雑になってきたので整理します
項目 | 内容 |
---|---|
リソース | Vnet, NSG |
拒否の割り当て | 変更, 削除不可 |
子リソースへの許否の割り当て | 有効 |
拒否の割り当ての除外ユーザー | 管理者となるユーザー |
拒否の割り当ての除外アクション | ユーザーにも許可させること, Microsoft.Network/virtualNetworks/subnets/join/action |
検証
実際にデプロイして, 管理者の操作, ユーザーの操作を試してみます
デプロイ スタックの作成
デプロイスタックで作成する Bicep ファイルはこちらになります
Azure_Bicep/products/vnet-nsg.bicep at main · NakayamaKento/Azure_Bicep
以下を実行します
|
|
実行後 Azure Portal を確認するとリソースの作成と, 拒否の割り当てが適用されていることがわかります
管理者の権限確認
管理者は拒否の割り当てから除外されています
Vnet へのアドレス空間の作成や, サブネットの追加, NSG の変更などはもちろん自由にできます
※右上表示からユーザーが admin であることに注目してください
ユーザーの権限確認
taro という名前のユーザーにサブスクリプション全体で所有者権限を渡します
※右上の表示からユーザーが taro であることに注目してください
しかし taro は拒否の割り当ての結果, NIC の追加以外の操作は実行できません
サブスクリプション全体に所有者権限を持っているためリソースグループの作成や削除は自由にできます
まとめ
Azure を企業で利用する際に問題になるネットワーク権限についてデプロイスタックの実装方法を試しました
拒否の割り当てをうまく活用することでユーザーに自由に Azure を使わせつつ, 必要な制御を実行することができました
デプロイスタックそのものはプレビュー中なので本番環境への利用はよく検討してください