Azure リソースの RBAC でカスタムロールを作成する


※ この投稿は PowerShell Advent Calendar 2016 に参加しています

 

Azure 上の全てのリソースは Azure AD に登録されたユーザーやグループを使用してアクセス制御が行えます。この時に使用するアクセス制御の方法を RBAC(Role Based Access Control)と言います。

 

Azure ポータル(https://portal.azure.com/)で何らかのリソース(いかの場合は仮想マシン)を選択すると、必ずメニューの中に「アクセス制御(IAM)」が表示され、ここを起点としてRBACを設定することができます。

 

image

 

RBAC の概念を簡単に図にすると、以下のようになります。リソースに直接アクセス権を設定するのではなく、ROLE を介してアクセス権を得ることになります。ROLE には「アクション」が定義されており、これが Azure のリソースに対して行える権限を表しています。

image

 

ここでは「仮想マシン作成協力者」というロールのアクションを見てみましょう。以下が仮想マシン作成協力者に定義されているアクション(アクセス許可)の一覧です。

image

見ていただくとわかりますが、リソースプロバイダーに対してアクセス権が設定されていることがわかります。リソースプロバイダーについてはここでは解説しませんが、リソースの種類だと思ってください。Microsoft Compute は仮想マシンに関連したリソースを意味しています。ここには仮想マシンや仮想マシンノスケールセットなどが含まれています。Microsoft Network はネットワークに関連したリソースを意味しており、仮想ネットワーク、ネットワークインターフェースなどのリソースが含まれています。

 

Microsoft Computeをクリックして表示した画面が以下です。Virtual Machine に対してフルコントロールが与えられているのがなんとなくわかりますか?Availability Sets には「読み取り」「書き込み」「削除」の権限が与えられています。

image

 

さて、ここからがいよいよ PowerShell の出番です。これらを PowerShell から確認してみましょう。

 

まずは、以下の PowerShell コマンドレットで Azure AD にログオンします。

 

Add-AzureRMAccount

 

次に、以下のコマンドを実行してみてください。

 

Get-AzureRmRoleDefinition “Virtual Machine Contributor” | `
    Select Actions | foreach {echo $_.actions}

 

実行結果は以下の通りです。Microsoft.Compute(太字)と上の画面ショットを比べてみてください。一致していることがわかると思います。以下のアクションで「*」はワイルドカードです。Microsoft.Compute/virtualMachines/* であれば、Microsoft.Compute/virtualMachines/ 配下のアクションのすべてにアクセスが可能であることを意味しています。

 

Microsoft.Authorization/*/read
Microsoft.Compute/availabilitySets/*
Microsoft.Compute/locations/*
Microsoft.Compute/virtualMachines/*
Microsoft.Compute/virtualMachineScaleSets/*

Microsoft.Insights/alertRules/*
Microsoft.Network/applicationGateways/backendAddressPools/join/action
Microsoft.Network/loadBalancers/backendAddressPools/join/action
Microsoft.Network/loadBalancers/inboundNatPools/join/action
Microsoft.Network/loadBalancers/inboundNatRules/join/action
Microsoft.Network/loadBalancers/read
Microsoft.Network/locations/*
Microsoft.Network/networkInterfaces/*
Microsoft.Network/networkSecurityGroups/join/action
Microsoft.Network/networkSecurityGroups/read
Microsoft.Network/publicIPAddresses/join/action
Microsoft.Network/publicIPAddresses/read
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.RecoveryServices/locations/*
Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/*/read
Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/read
Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/write
Microsoft.RecoveryServices/Vaults/backupPolicies/read
Microsoft.RecoveryServices/Vaults/backupPolicies/write
Microsoft.RecoveryServices/Vaults/read
Microsoft.RecoveryServices/Vaults/usages/read
Microsoft.RecoveryServices/Vaults/write
Microsoft.ResourceHealth/availabilityStatuses/read
Microsoft.Resources/deployments/*
Microsoft.Resources/subscriptions/resourceGroups/read
Microsoft.Storage/storageAccounts/listKeys/action
Microsoft.Storage/storageAccounts/read
Microsoft.Support/*

 

既定で用意されている「組み込みロール」は以下のページを参照してください。「仮想マシン作成協力者」 も組み込みロールの1つです。

 

RBAC: 組み込みのロール

https://docs.microsoft.com/ja-jp/azure/active-directory/role-based-access-built-in-roles

 

では、例えば「仮想マシンを起動/停止するだけ」の権限を持ったロールを定義することはできるのでしょうか?

もちろんできます。

 

まずは「仮想マシンの起動、停止」アクションを調べるために、Azure 上で用意されている全アクションの一覧を出力してみましょう。以下のコマンドを使用すると、すべてのリソースのすべてのアクションをグリッドビューに一覧表示することができます。

 

Get-AzureRMProviderOperation * | Out-GridView

 

Microsoft.Compute に関するアクションだけに絞り込むときは以下のように入力します。

 

Get-AzureRMProviderOperation -OperationSearchString Microsoft.Compute/* | Out-GridView

 

出力された結果の中で、仮想マシンの起動と停止、再起動に関するアクションは以下の通りです。

 

Microsoft.Compute/VirtualMachines/start/action

Microsoft.Compute/VirtualMachines/powerOff/action

Microsoft.Compute/VirtualMachines/restart/action

 

あと、当然仮想マシンの一覧を読み込めないと意味がないので、以下も必要です。read には /action を付加する必要はありません。

 

Microsoft.Compute/VirtualMachines/read

 

これだけでは足りません。PowerOff するには、ディスクを接続解除(deallocate)する権限も必要です。

 

Microsoft.Compute/VirtualMachines/deallocate/action

 

それでは、これらのアクションだけを持つロールを定義してみましょう。

はじめに新しいロールの枠組み枠を作成します。新規に作成する際は、既存のロールをコピーして再利用します。これは現在の標準手順ですので、そういうもんだと思ってください。

 

まずは $Role 変数に「仮想マシンの共同作成者」ロールの中身をコピーします。

$role = Get-AzureRmRoleDefinition “Virtual Machine Contributor”

 

忘れないうちに、Role の識別子である Id を Null にしておきます。Id は新規ロールを作成する際に、新しく割り振られます。

 

$Role.Id = $Null

 

次にロールの名前と説明文を指定しましょう。日本語でも英語でも大丈夫です。

 

$Role.Name = “仮想マシンの起動と停止”

$Role.Description = “仮想マシンの起動と停止、再起動ができます”

 

今度は $role に定義されたアクションをクリアします。

 

$Role.Actions.Clear()

 

ここまでできたら、$Role だけ入力して現在の設定値を確認しましょう。

 

image

 

ここに必要なアクションを埋め込みます。

 

$role.Actions.Add(“Microsoft.Compute/VirtualMachines/start/action”)
$role.Actions.Add(“Microsoft.Compute/VirtualMachines/stop/action”)
$role.Actions.Add(“Microsoft.Compute/VirtualMachines/restart/action”)
$role.Actions.Add(“Microsoft.Compute/VirtualMachines/read”)
$role.Actions.Add(“Microsoft.Compute/VirtualMachines/deallocate/action”)

 

最後に、このロールを使用するサブスクリプションを定義します。

サブスクリプションを定義するにはサブスクリプションのIDが必要なので、まずは以下のコマンドで SubscriptionId を取得しましょう。

 

Get-AzureRmSubscription

 

SubsctionId が取得できたら、この値を使用して以下のコマンドを実行します。

 

$role.AssignableScopes.Clear()
$role.AssignableScopes.Add(“/subscriptions/9cb9d877-xxxx-xxxx-xxxx-xxxxxxxxxxxx”)

 

最後に $Role に格納された情報を使用して新しくロールを作成するコマンドを実行します。

 

New-AzureRmRoleDefinition -Role $role

 

これで新規カスタムロールの作成は完了です。

さっそく、このロールをリソースグループに割り当ててみましょう。リソースグループに割り当てると、その中のすべてのリソースにアクセス権が継承されます。

Azure Portal でリソースグループを選択し、IAM を選択します。

 

次に、「追加」をクリックしてください。

 

image

 

「役割の選択」をクリックすると、今作成した「仮想マシンの起動と停止」という役割が表示されているはずです。新規に作成したカスタムロールは、オレンジ色のしるしがついています。

image

 

「仮想マシンの起動と停止」を選択したら、次にこのロールに割り当てるユーザーを指定して保存すれば完了です。

 

Azure Portal に割り当てたユーザーでログオンしなおしてみてください。

Virtual Machine 画面を開くと、アクセス権を割り当てたリソースグループの仮想マシンだけが表示されます。

image

 

そして、特定のを開くと以下のようになるはずです。「開始」「再起動」「停止」の操作が許可されていることがわかります。管理者の場合、ここに「削除」が表示されるはずですが、このユーザーには表示されていません。

 

image

 

「接続」が表示されていますが、現在のRBACでは接続ボタンを無効化することはできないようです。接続を許可したくない場合には、グループポリシー等を使用して、仮想マシンの内部でアクセス制御してください。

今回、このユーザーにはリソースグループの参照権限を与えていません。そのため、リソースグループ画面を開くと、以下のようになります。リソースグループへの権限を与えないと、その配下に一切のリソースを新規に作成することができません。

 

image

 

また、試しに特定の Virtual Machine から「ネットワーク インターフェース」を選択して情報を参照しようとしても、以下のようにアクセスが拒否されます。

 

image

Comments (0)

Skip to main content