👨‍💼

IT部門が管理するAzure Virtual Networkに 各部署のVMを所属させて職務分掌を行う方法

2023/04/05に公開

モチベ

下記のようなシナリオを実現する方法を確認したい

  • IT部門がAzure環境を運営しており、その他各部署はそこから払い出されている環境を利用する
  • 各部署はネットワーク構成の変更はできないようにする必要がある
  • 各部署に専用のリソースグループを用意するところまではIT部門側で実施
  • 各部署はそれぞれ自由にVMを立てたりしながらAzure環境を利用
    • VMはIT部門が管理するVNETのサブネットに所属
  • IT部門は月次で各部署にそれぞれの利用額を請求

想定Azure環境

  • Networkリソースグループ:IT部門で管理
  • VMリソースグループ:各部署が利用。今回はIaaS環境のみの利用を想定。

構成方法

  • 結局のところRBACロールを各部署のユーザorグループにどのように割り当てるか、というだけの話

各部署のユーザに割り当てるロール

  • Networkリソースグループで閲覧者を割り当てる

    • VMの所属するVNETリソースが見えるようにするため
  • VMリソースグループで仮想マシン共同作成者を割り当てる

  • ただ、仮想マシン共同作成者ロールだけでは、VMのNICを対象のサブネットに所属させる権限が足りない
    ※部署ユーザ側での作成画面

  • “Microsoft.Network/virtualNetworks/subnets/join/action”権限が必要

    • この権限を内包したカスタムロールを作成し、Networkリソースグループで割り当てる

カスタムロールの作成

  • Networkリソースグループでアクセス制御(IAM)からカスタムロールを作成

  • 最初から始める、を選択

  • 上記の権限を検索し、アクセス許可を追加

  • あとは画面に従って、カスタムロールを作成し、ユーザに付与する

  • ロール付与完了後、エラーが消える
    ※部署ユーザ側での作成画面

  • また、仮想マシン共同作成者ロールにはパブリックIP作成権限もないため、上記の画面のように勧めていくとバリデーションエラーになる

    • ネットワークをIT部門が管理しているなら作成できなくて正解ではある
      ※部署ユーザ側での作成画面
{"code":"InvalidTemplateDeployment","message":"The template deployment failed with error: 'Authorization failed for template resource 'demovm-ip' of type 'Microsoft.Network/publicIpAddresses'. The client 'demo@msext.net' with object id '0884995c-d3bb-4b43-a362-ba0445929d7c' does not have permission to perform action 'Microsoft.Network/publicIpAddresses/write' at scope '/subscriptions/42edd95d-ae8d-41c1-ac55-40bf336687b4/resourceGroups/20230404-rg-vm/providers/Microsoft.Network/publicIpAddresses/demovm-ip'.'."}
  • パブリックIPをなしにして作成すると、通る
    ※部署ユーザ側での作成画面

  • と思ったら、デプロイ時にエラーが発生

    • IT部門側で用意しているNSGにNICをJoinする権限がない(先にValidationしてほしい、、、)
      ※部署ユーザ側での作成画面
{"code":"DeploymentFailed","message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/arm-deployment-operations for usage details.","details":[{"code":"LinkedAuthorizationFailed","message":"オブジェクト ID '0884995c-d3bb-4b43-a362-ba0445929d7c' のクライアント 'demo@msext.net' には、スコープ '/subscriptions/42edd95d-ae8d-41c1-ac55-40bf336687b4/resourcegroups/20230404-rg-vm/providers/Microsoft.Network/networkInterfaces/demovm139' でアクション 'Microsoft.Network/networkInterfaces/write' を実行するアクセス許可がありますが、リンクされたスコープ '/subscriptions/42edd95d-ae8d-41c1-ac55-40bf336687b4/resourceGroups/20230404-rg-networking/providers/Microsoft.Network/networkSecurityGroups/rg-networking-nsg' でアクション 'Microsoft.Network/networkSecurityGroups/join/action' を実行するアクセス許可がないか、リンクされたスコープが無効です。"}]}
  • メッセージの通り、不足している'Microsoft.Network/networkSecurityGroups/join/action' これを追加する
  • もしくはNICレベルでのNSGの付与をしない方針にする
    • VMが所属する先のサブネットにはNSGがあるからいいよね、という考え方
  • パブリックIPとNICをどちらも無しにすると、作成できる
    ※部署ユーザ側での作成画面

    ※部署ユーザ側での作成画面

おわり

まとめると、部署ユーザに下記ロールを割り当てることで実現できる

  • VM作成用リソースグループでの仮想マシン共同作成者
  • Networkリソースグループでの“Microsoft.Network/virtualNetworks/subnets/join/action”権限を持つカスタムロール
GitHubで編集を提案
Microsoft (有志)

Discussion