JavaScriptを有効にしてください

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

 ·   7 分で読めます  ·   Kento

Azure を企業で利用するときは

  • せキュアな環境にしたい
  • オンプレミスと接続して使いたい
  • そのためにはオンプレミスに繋がる Vnet, NSG などのネットワーク権限をユーザ-に渡すのは最小にしたい
    その結果, 管理者が負担をしないといけないけど…
  • Azure 管理者の負荷は下げたい

などの課題がよく出てきます
今日はこれについて考えてみます

目指す環境

以下の条件を満たすことを目指します

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

実装方法

本記事では 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 のリソースグループの中では自由に操作ができる

を実現できます

サブネットへ 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

カスタムロールを作成するならこれだけです

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
    "properties": {
        "roleName": "nic-subnet-join",
        "description": "仮想ネットワークに NIC を参加させる最小の権限",
        "assignableScopes": [
            "/subscriptions/XXXXX"
        ],
        "permissions": [
            {
                "actions": [
                    "Microsoft.Network/virtualNetworks/subnets/join/action"
                ],
                "notActions": [],
                "dataActions": [],
                "notDataActions": []
            }
        ]
    }
}

検証

VM の作成

実際に検証してみます
まずは管理者を想定したアカウントで以下の構成を作成

---
title: 検証:管理者の権限
---
graph TD
subgraph 所有者
sub1[サブスクリプション]
rg1[free-rg]
rg3[manage-rg]
sub1 --> rg1
sub1 --> rg3
rg3 --> r5[Vnet]
rg3 --> r6[NSG]
end
portal01
管理者によって作成されたリソース:

次にユーザーを想定したアカウントに権限を付与します

---
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
portal02
ユーザーに付与する権限:

このユーザー (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 作成時の検証は問題なくクリアして、デプロイも完了しました

portal03
ユーザーによる VM の作成01:
portal04
ユーザーによる VM の作成02:

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

portal05
ユーザーによる VM の作成03:

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

portal06
ユーザーによる VM の作成04:
portal07
ユーザーによる VM の作成05:

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 を作成します

portal08
ユーザーによる Private Endpoint の作成01:
portal09
ユーザーによる Private Endpoint の作成02:
portal10
ユーザーによる Private Endpoint の作成03:
portal11
ユーザーによる Private Endpoint の作成04:

free2-rg を見ると無事にリソースが作成できています
Vnet の方を見に行くと参加している NIC が増えていることがわかります

portal12
ユーザーによる Private Endpoint の作成05:
portal13
ユーザーによる Private Endpoint の作成06:

おまけ

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 のここから行うことができます

portal14
サブネット単位でのアクセス付与:

課題

ここまで NIC を Vnet に参加させる権限を見てきました
この権限の渡し方をすると NSG や Vnet Peering などの設定を変更させることは防げます

しかし、サブスクリプション全体には閲覧権限しか渡していないためリソースグループの作成・削除を気軽に行うことができません
→Azure 管理者に依頼する必要がある

まとめ

今回はカスタムロールを使って企業によくある「ネットワーク権限を渡したくない」を考えました
しかし、課題は残っています
次回はデプロイ スタックを使ってこの課題を解決したいと思います

参考

共有

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