ユーザーへ Azure VM の起動および停止のみを許可する方法

こんにちは。Azure サポートチームの小久保です。
Azure では、ロールベースのアクセス制御 (RBAC) という機能を使用し、アクセスできるリソースを制限したり、リソースへの操作を制限することが可能です。

[参考]
ロールベースのアクセス制御 (RBAC) とは
https://azure.microsoft.com/ja-jp/documentation/articles/role-based-access-control-what-is/

今回は RBAC を使用し、リソース マネージャ モデル (ARM) VM の起動 / 停止だけをユーザーに許可する方法についてご案内させていただきます。

本ご要望は、以下の 2 つのパターンが考えられます。それぞれの手順について、ご案内させていただきますので、ご要件に合わせて、いずれかの手順をご確認いただければと思います。

  1. ユーザーに "特定の" VM の起動 / 停止だけ行わせたい。
  2. ユーザーに "サブスクリプション内のすべての" VM の起動 / 停止だけ行わせたい。

※ 本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。

1. ユーザーに "特定 VM" の起動 / 停止だけを許可する手順


Azure ポータルで VM を 1 つ選択し、アクセス制御 (IAM) のブレードでユーザーにロールを割り当てるだけです。

理由は、後述の「*** 解説 ***」に記載いたしますが、割り当てるロールは「DevTest Labs ユーザー (DevTest Labs User)」が良いのではないかと思います。

*** 解説 ***

Azure ポータルにて、VM の起動 / 停止を行うためには、以下の操作が Actions プロパティに含まれるロールをユーザーに割り当てる必要があります。

  • Microsoft.Compute/virtualMachines/read仮想マシンのプロパティの取得
  • Microsoft.Compute/virtualMachines/deallocate/action仮想マシンの割り当て解除
  • Microsoft.Compute/virtualMachines/start/action仮想マシンの開始

上記の操作が Actions プロパティに含まれる組み込み (既存の) ロールは、以下の通りです。

所有者 (Owner)
共同作成者 (Contributor)
仮想マシン共同作成者 (Virtual Machine Contributor)
DevTest Labs ユーザー (DevTest Labs User)

[参考]
Azure の組み込みロール
/ja-jp/azure/role-based-access-control/built-in-roles

VM のスコープで RBAC の設定を行っている為、該当の VM に対する操作のみが可能であり、その他リソースへのアクセス権限がないので、基本的に構成変更は行えません。
例えば、VM に NIC を追加しようとしても、NIC の新規作成も、既存の NIC の参照もできません。
VM の起動 / 停止だけを行わせたいのであれば、VM に対して行える操作が最も限定的な「DevTest Labs ユーザー (DevTest Labs User)」が一番適しているのではないかと思われます。

2. ユーザーに "サブスクリプション内のすべての" VM の起動と停止だけを許可する手順


Azure ポータルでサブスクリプションを選択し、アクセス制御 (IAM) のブレードでユーザーにロールを割り当てます。

サブスクリプションのスコープで、「DevTest Labs ユーザー (DevTest Labs User)」ロールをユーザーに割り当てた場合、VM 以外のリソースへのアクセスが可能となります。組み込みロールでは要件を満たせない (今回の場合は、VM の起動 / 停止だけを行わせたい) 場合には、独自のカスタムロールを作成する必要があります。

*** 解説 ***

RBAC は、サブスクリプション、リソース グループ、各リソースのそれぞれのスコープで設定が可能です。
Azure のリソースは、サブスクリプション配下のリソース グループ内に作成されます。

Azure PowerShell でリソースを管理する - スコープを理解する
/ja-jp/azure/azure-resource-manager/powershell-azure-resource-manager#understand-scope

その為、サブスクリプションのスコープで「DevTest Labs ユーザー (DevTest Labs User)」のロールを適用しますと、このロールで許可されている操作 (既存の NIC の読み取り、VM を NIC へ接続するなど) が可能となります。

ご参考までに「DevTest Labs ユーザー (DevTest Labs User)」のロールは以下の通りです。
※ 上述「Azure の組み込みロール」のドキュメントより、一部抜粋

カスタムロールを作成し、Actions プロパティで、許可したい操作だけを明示的に定義することにより、ご要望に沿った (今回の場合、VM の起動と停止だけを行える) ロールの作成が可能となります。
カスタムロールの作成方法については、以下ブログをご参照ください。

[参考]
ロールベースのアクセス制御 (RBAC) の設定 – カスタムロールの使用
https://blogs.technet.microsoft.com/jpaztech/2016/10/12/rbac-custom-role/

カスタムロールの定義サンプル

※ <XXX> 部分は環境に応じて変更してご利用ください。

 {
  "Name": "<カスタムロール名>",
  "IsCustom": true,
  "Description": "<カスタムロールの説明>",
  "Actions": [
    "Microsoft.Compute/virtualMachines/read"
   ,"Microsoft.Compute/VirtualMachines/start/action"
   ,"Microsoft.Compute/virtualMachines/deallocate/action"
   ,"Microsoft.Compute/virtualMachines/restart/action"
  ],
  "NotActions": [
  ],
  "AssignableScopes": [
    "/subscriptions/<サブスクリプション ID>"
  ]
}

※ 上記のカスタムロールを、特定のリソース グループで使用したい場合

AssignableScopes プロパティに、以下を指定します。
"/subscriptions/<サブスクリプション ID>/resourcegroups/<リソース グループ名>"

また、リソース グループやリソース グループ内のリソースの読み取りを許可する為に、Actions プロパティには、以下を指定します。
"Microsoft.Resources/subscriptions/resourceGroups/read"
"Microsoft.Resources/subscriptions/resourceGroups/resources/read"