JavaScriptを有効にしてください

Azure のネットワークを最小権限にし隊 その2

 ·   7 分で読めます  ·   Kento

企業で Azure を使う際のネットワークの権限管理について書きました
Azure のネットワークを最小権限にし隊 その1 – クラウドを勉強し隊

今回はその続きになります

目指す環境

※前回の記事からのコピペです
以下の条件を満たすことを目指します

  1. 社内ユーザーに Azure のサブスクリプションを提供する
  2. Azure サブスクリプションはできるだけ自由に使わせる
  3. オンプレミスと繋がるネットワークは管理者が管理する

前の記事の課題

前の記事ではカスタムロールを使って実現しましたが、以下の課題がありました

サブスクリプション全体には閲覧権限しか渡していないためリソースグループの作成・削除を気軽に行うことができません

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

今回はデプロイ スタックを使って課題を解決して理想の運用環境を目指します

デプロイ スタックとは

デプロイ スタックとは以下の特徴があります

  1. リソースグループとは違う観点でリソースをまとめてデプロイ・削除できる
  2. 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

以下を実行します

1
2
3
4
5
6
7
8
New-AzResourceGroupDeploymentStack `
  -Name "Vnet_NSG" ` #デプロイ スタック名
  -ResourceGroupName "MNG-RG" ` #管理用リソースグループ (事前に作成しておく)
  -TemplateFile "vnet-nsg.bicep" ` # Bicep ファイル名
  -DenySettingsMode "denyWriteAndDelete" ` #拒否の割り当ての設定
  -DenySettingsApplyToChildScopes ` #子リソースにも適用
  -DenySettingsExcludedAction "Microsoft.Network/virtualNetworks/subnets/join/action" ` #拒否の割り当ての除外アクション
  -DenySettingsExcludedPrincipal "xxxxxxxxx" #拒否の割り当ての除外ユーザー (管理者ユーザー

実行後 Azure Portal を確認するとリソースの作成と, 拒否の割り当てが適用されていることがわかります

portal01
デプロイスタックの作成01:
portal02
デプロイスタックの作成02:
portal03
デプロイスタックの作成03:

管理者の権限確認

管理者は拒否の割り当てから除外されています
Vnet へのアドレス空間の作成や, サブネットの追加, NSG の変更などはもちろん自由にできます
※右上表示からユーザーが admin であることに注目してください

portal04
管理者による変更前:
portal05
管理者によるアドレス空間の追加:
portal06
管理者によるサブネットの追加:
portal07
管理者による NSG 規則の追加:

ユーザーの権限確認

taro という名前のユーザーにサブスクリプション全体で所有者権限を渡します
※右上の表示からユーザーが taro であることに注目してください

portal08
taro に所有者権限を渡している:

しかし taro は拒否の割り当ての結果, NIC の追加以外の操作は実行できません

portal09
アドレス空間の追加の失敗:
portal10
サブネットの追加の失敗:
portal11
NSG 規則の追加の失敗:
portal12
NIC 参加はできる:
portal13
NIC 参加はできる:
portal17
NIC 参加はできる:

サブスクリプション全体に所有者権限を持っているためリソースグループの作成や削除は自由にできます

portal14
リソースグループの作成もできる:
portal15
リソースグループの作成もできる:
portal16
リソースグループの削除もできる:

まとめ

Azure を企業で利用する際に問題になるネットワーク権限についてデプロイスタックの実装方法を試しました
拒否の割り当てをうまく活用することでユーザーに自由に Azure を使わせつつ, 必要な制御を実行することができました

デプロイスタックそのものはプレビュー中なので本番環境への利用はよく検討してください

参考

共有

Kento
著者
Kento
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中