今回は、Microsoft Azure の管理アカウントに対しての権限設定について書いてみようと思います。
Microsoft Azure の管理アカウント権限
Microsoft Azure には、組み込みロールという権限のテンプレートが作成されています。
こんな感じですね。アイコンで青いのが組み込みロールで、オレンジ色のが自分で作ったカスタムロールです。
所有者が一番色々権限を持っているロールで、共同作成者はロールの追加・削除や、ユーザとロールの紐づけの変更ができないみたいな感じです。
組み込みロールとロールについての権限については、以下のドキュメントにすんごい詳しく書いてあります。
カスタムロールの作り方
MS 安納さんの記事がとても分かりやすいです。
■Azure リソースの RBAC でカスタムロールを作成する
要約しちゃうと、こんな感じ
# ベースとなる組み込みロールの設定の読み込み $role = Get-AzureRmRoleDefinition "[組み込みロール名]" # IDと名称、説明の初期化 $role.id = $Null $role.Name = "[カスタムロール名]" $role.Description = "[カスタムロールの説明]" #権限の変更 $role.Actions.Add("[追加する許可する権限]") $role.Actions.Remove("[削除する許可する権限]") $role.NotActions.Add("[追加する禁止する権限]") $role.NotActions.Remove("[削除する禁止する権限]") #サブスクリプションID都の紐づけ $role.AssignableScopes.Clear() $role.AssignableScopes.Add("/subscriptions/" + [サブスクリプションID]) #設定した権限でカスタムロールを作成 New-AzureRmRoleDefinition -Role $role
やってみて気づいたこと
* で設定すると、その項目を全部登録した場合に動作の違い
権限設定は、以下の2項目で行っていきます。
- Actions : 許可する権限
- NotActions : 禁止する権限
権限の設定ポリシーとしては、以下の2つがあると思います。
- Actions に * を設定して、すべての権限を許可してから、NotActions で禁止をする
- Actions に許可する権限をすべて積んでいく
で、この時に、* で設定した場合と、Actions にすべての権限を追加した場合とで、若干動作が異なる場合があります。
多分、表示上、見えてない権限があるのだと思います。
ですので、明示的に与えたい権限がある場合は、Actions に権限を積んでいくというのがいいと思います。
(逆に、NotActions で制限しきれない部分もある感じです。今だけの問題だといいんですが。。。)
Actions と NotActions に同じ権限詰んだらどうなる??
Actions と NotActions に VM を作成できる権限をつけたとします。
この場合は、NotActions が勝つので、VM は作成できないです。
1つのアカウントに複数のロールをぶら下げ気た場合どうなる??
1つのアカウントに複数のロールをぶら下げた場合はどうなるかってことですが、
例えば、 VM を管理できるロールと、App Service を管理できるロール の二つのロールをぶら下げた場合、
VM も App Service も管理できるロールとなります。
割と当たり前のことを書いてる感じですが、
例えば、VM を管理できるロールを
Actions は「*」、NotActions は VMを管理する権限以外すべて(App Service を管理する権限を含む) と設定したとします。
App Service を管理できるロールは
ActionsにApp Service を管理できる権限 という設定とします。
この2つのロールを1つのアカウントにぶら下げても同じ結果となります。
ロールが適用されているユーザの確認
以下のコマンドで確認できます。
Get-AzureRmRoleAssignment -IncludeClassicAdministrators
結果のサンプルはこんな感じ
RoleAssignmentId : /subscriptions/45454582-4309-419e-aa39-94f8c7510a6d/providers/Microsoft.Authorization/roleAssignments/45f5be9a-a644-479c-b388-af8a81229c4e Scope : /subscriptions/45454582-4309-419e-aa39-94f8c7510a6d DisplayName : testuser01 SignInName : testuser01@[ドメイン] RoleDefinitionName : Owner RoleDefinitionId : 8e3af657-a8ff-443c-a75c-2fe8c4bcb635 ObjectId : aefcbf81-5a59-4356-a244-a84a54d8484e ObjectType : User RoleAssignmentId : /subscriptions/45454582-4309-419e-aa39-94f8c7510a6d/providers/Microsoft.Authorization/roleAssignments/632b2524-533e-4e46-8617-525b497ec340 Scope : /subscriptions/45454582-4309-419e-aa39-94f8c7510a6d DisplayName : testuser02 SignInName : testuser02@[ドメイン] RoleDefinitionName : RoleDefinitionId : dae7505b-017f-40d3-ad5e-479050cd2021 ObjectId : 4b348a0b-5e38-4965-a18d-0df91afef334 ObjectType : User
カスタムドメインの時ってロール名が取れないんですよねー。
ロールの定義内容は以下のコマンドで取得できます。
Get-AzureRmRoleDefinition
こいつらを使って、アカウントとロール名を出すのは以下のようにします。
$RoleAssignment = Get-AzureRmRoleAssignment | Select-Object SignInName,RoleDefinitionId $RoleDefinition = Get-AzureRmRoleDefinition | Select-Object Id,Name $JoinForHash = @{} foreach($n in $RoleDefinition){$JoinForHash[$n.ID] = $n.Name} $RoleAssignment | % {[PSCustomObject]@{ SignInName = $_.SignInName; RoleName = $($JoinForHash[$_.RoleDefinitionId])}}
結果はこんな感じ
SignInName RoleName ---------- -------- testuser01@[ドメイン] Owner testuser02@[ドメイン] OwnerTest
まとめ
Azure を適切に管理するために、ユーザに与える権限は適切な権限を与えましょう。
コメント
[…] RBAC での設定については、以前に「Azure の管理アカウントをカスタムロールで権限設定する」という記事を書いていますので、そちらをご覧ください。 […]