Azure ポータルなどでユーザーがアクセスできるリソースを限定させたい、リソースへの操作を限定させたい場合、ロールベースのアクセス制御 (RBAC) を使用して制御します。
あらかじめ用意された組み込みロールで事足りれば良いのですが、それよりさらに制限させたい場合は、やはりカスタムロールを作って、ユーザーにそれを割り当てます。
カスタムロールって面倒くさいなーって思い込んでいましたが、実際にやってみたらそんなことはありませんでした。
ユーザーへ Azure VM の起動および停止のみを許可する方法
Azure サポートの以下の記事を参考にしました。
参考:ユーザーへ Azure VM の起動および停止のみを許可する方法 - Japan Azure IaaS Support Blog
この記事を要約すると冒頭で書いたとおりですが、具体例として「ユーザーに特定の仮想マシンの起動と停止のみ許可する」手段について書かれています。
この具体例のとおりにアクセス制限させるためには、
- 以下の操作が Action プロパティに含むロールをユーザーに割り当てる
- Microsoft.Compute/virtualMachines/read
- Microsoft.Compute/virtualMachines/deallocate/action
- Microsoft.Compute/virtualMachines/start/action
- これらのプロパティが含む組み込み (既定の) ロールは
- 所有者 (Owner)
- 共同作成者 (Contributor)
- 仮想マシン共同作成者 (Virtual Machine Contributor)
- DevTest Labs ユーザー (DevTest Labs User)
- ユーザーに組み込みロールを割り当てるなら、限定的な「DevTest Labs ユーザー」が最適
- 許可する操作のみを明示的に限定したいなら、「カスタムロール」を作成 → ユーザーにそれを割り当てる
ちょうど情シスから「仮想マシンの起動、停止、接続のみ許可できるなら、システムの担当者にも Azure ポータルにアクセスさせても良いんだけど...今それないからよろしくねー」という話があり、私もいつまでも付き合っていられないので、以下のようなカスタムロールを作ることにしました。
1.カスタムロール定義 (json) を作成
カスタムロールを作るためには、定義ファイルを用意する必要があります。書式は以下のとおり。
{
"Name": "カスタムロールの名前",
"IsCustom": true,
"Description": "カスタムロールの説明",
"Actions": [
"COMMENT:このロールで実行できる操作を指定"
],
"NotActions": [
"COMMENT:実行できる操作の中 (Actions) から除外する操作を指定"
],
"DataActions": [
"COMMENT:対象のオブジェクト内のデータに対して、このロールで実行できるデータ操作を指定 ※プレビュー"
],
"NotDataActions": [
"COMMENT:実行できるデータ操作の中 (DataActions) から除外するデータ操作を指定 ※プレビュー"
],
"AssignableScopes": [
"COMMENT:このロールを割り当て可能なスコープ (サブスクリプション, リソースグループ, リソース) を指定"
]
}
リソースに対する操作は、以下の記事から探し出します。
巨大なページなので、ページ内検索を駆使してやりたいことを探し出します。
ピンとこない説明に苦戦、負けそうです...(@_@)
※もっと良い方法あるかな??
参考:Azure Resource Manager のリソース プロバイダー操作
そんなこんなで私が作ってみたカスタムロールの定義は以下のとおり。
{
"Name": "Azure VM Start/Stop/Connect",
"IsCustom": true,
"Description": "Azure 仮想マシンの起動、停止、接続のみを許可するロール",
"Actions": [
"Microsoft.Compute/virtualMachines/read"
,"Microsoft.Compute/virtualMachines/deallocate/action"
,"Microsoft.Compute/virtualMachines/restart/action"
,"Microsoft.Compute/virtualMachines/start/action"
,"Microsoft.Network/networkInterfaces/*/read"
,"Microsoft.Network/networkInterfaces/read"
,"Microsoft.Resources/subscriptions/resourceGroups/read"
,"Microsoft.Resources/subscriptions/resourceGroups/resources/read"
,"Microsoft.ClassicCompute/virtualMachines/read"
,"Microsoft.ClassicCompute/VirtualMachines/start/action"
,"Microsoft.ClassicCompute/virtualMachines/shutdown/action"
,"Microsoft.ClassicCompute/virtualMachines/restart/action"
,"Microsoft.ClassicCompute/virtualMachines/downloadRemoteDesktopConnectionFile/action"
,"Microsoft.ClassicCompute/virtualMachines/operationStatuses/read"
],
"AssignableScopes": [
"/subscriptions/<サブスクリプション ID>"
]
}
クラシック仮想マシンはやりたい操作の Action を探し出すのはとてもラクでしたが、ARM 仮想マシンはやりたい操作に関連するリソースを考えながら書いていきました。あとは、やりたい操作が実現できている組み込みロールを参考にしながら書きました。(今回は「DevTest Labs ユーザー」ロールを参考にしました。)
2.サブスクリプションにカスタムロール定義を登録
PowerShell で作成したカスタムロール定義を登録します。
# ログイン
PS C:\> Login-AzureRmAccount
# サブスクリプションを選択
PS C:\> Select-AzureRmSubscription -Subscription <サブスクリプション ID>
# カスタムロールを登録
PS C:\> New-AzureRmRoleDefinition -InputFile <カスタムロール定義ファイルパス>
3.リソースのアクセス制御にユーザーを登録
あとは、特定のリソースのアクセス制御に、登録したカスタムロールを割り当てたユーザーを登録します。
役割に登録したカスタムロール (Azure VM Start/Stop/Connect) が登録されていることを確認。
仮想マシンのアクセス制御に、登録したカスタムロールを割り当てたユーザーを登録します。
登録したカスタムロールを書き換えたい
はじめから希望どおりのものが作れるわけでもなく、トライ&エラーを何度も繰り返しました。
カスタムロールを登録し直す場合は、ユーザーに割り当てたロールを解除→再割り当てしたり、登録したカスタムロールを削除→再登録したりすると、それらの設定がうまく反映されない (反映がとても遅い) 場合があります。
最も良いやり方は、リソースのアクセス制御のカスタムロールを割り当てたユーザーはそのままに、PowerShell で、以下のように「ロールを取得」、「ロールのプロパティを編集」、「ロールを更新」という手順を行うと良いと思います。
- Get-AzureRmRoleDefinition
- ロールのプロパティを編集 ※Actions や NotActions などのデータ型は List[string]
- Set-AzureRmRoleDefinition