AzureのRecource Manager (ARM)ではリソースに細かな権限をつけて制御することが可能です。主にRBAC(Role Base Access Control)と言われてるやつですね。
それと連動して、実はポリシーを定義してより細かな制御ができるようになっています。(ただしポリシーは現状プレビュー機能)
何ができますか
指定リソースに対して条件を付け、一致する場合に拒否または監査することができます。
例えばリソース新規作成時に指定されたタグに値が入っていない場合に拒否したり。(このシナリオだとコストセンターへの(タグによる)緩い紐づけを強制できそうですね)
他には想定外のリージョンへの作成を拒否したり、想定外のインスタンスが起動しないようにVMサイズを制限したり。あるいは特定のソース(VMやストレージなどのリソース)に対して拒否するなどが可能です(VNETの作成を拒否してすでに存在しているVNETだけ使用させるとかできそうですね)。
ポリシーそのものはJSONで記述します。また条件に論理演算子など利用できます。
ただし現状はREST APIのPUT操作に対してのみ有効ということで、リソースの作成時のみを対象に制御できます。
また適用対象(スコープ)はRBACと同じような感じです。ポリシーを割り当てた対象配下の子リソースもそのポリシーを継承します。詳細はRBACも参照ください。
ちなみにRBACと連動するので組織アカウントでないとダメです。
基本的に既定で操作が許可されているので、ポリシーで明示的に否認するシステムですね。
ポリシーの書き方
だいたいこんな感じです。
{ "if" : { <condition> | <logical operator> }, "then" : { "effect" : "deny | audit" } }
細かい詳細はドキュメント見たほうがいいでしょう。ifで条件をもろもろ指定してthenのeffectでdeny(拒否)またはaudit(監査)を指定します。
ポリシーの適用
ポリシーを適用するにはREST APIを使うかAzure PowerShellを使います。まず最初にポリシーを定義します。その後リソースなどにポリシーを割り当てる感じですね。
ポリシーの作成には New-AzureRmPolicyDefinition を使います。ポリシー名とポリシーのJSON文字列をインラインで渡すかJSONファイルへのパスを渡せばOKです。
例: 西日本(japanwest)と東日本(japaneast)以外への作成を拒否する
{ "if" : { "not" : { "field" : "location", "in" : ["japaneast" , "japanwest"] } }, "then" : { "effect" : "deny" } }
こういう感じのJSONファイルを作ります。あとは指定するだけです。
> $policy = New-AzureRmPolicyDefinition -Name regionpolicy -Policy C:\temp\location.json > $policy Name : regionpolicy ResourceId : /subscriptions/xxxxxxxxxxxxxxxxxxxxxxx/providers/Microsoft.Authorization/policyDefinitions/regionpolicy ResourceName : regionpolicy ResourceType : Microsoft.Authorization/policyDefinitions SubscriptionId : xxxxxxxxxxxxxxxxxxxxx Properties : @{PolicyType=Custom; PolicyRule=} PolicyDefinitionId : /subscriptions/xxxxxx-xxxxxx-xxxx-xxxxxxxxx/providers/Microsoft.Authorization/policyDefinitions/regionpolicy
ポリシーの中身はPropertiesの中に入ってます。現状定義されているポリシーは Get-AzrueRmPolicyDefinition で見れます。インドへの作成拒否とかいろいろ垣間見えますね(割り当てられてませんけど)
さて作ったポリシーは割り当てて効力を発揮します。割り当てるには New-AzureRmPolicyAssignment を使いさっき定義したポリシーを渡します。Scope引数の指定がちょっと面倒くさいですけど。この例ではtestgroup というリソースグループに対して適用しています。
> New-AzureRmPolicyAssignment -Name regionpolicy -PolicyDefinition $policy -Scope /subscriptions/xxxxxxxxxxxxxxx/resourceGroups/testgroup Name : regionpolicy ResourceId : /subscriptions/xxxxxxxxxxxxxxx/resourceGroups/testgroup/providers/Microsoft.Authorization/policyAssignments/regionpolicy ResourceName : regionpolicy ResourceType : Microsoft.Authorization/policyAssignments ResourceGroupName : testgroup SubscriptionId : xxxxxxxxxxxxxxxxxxxxxx Properties : @{PolicyDefinitionId=/subscriptions/xxxxxxxxxxxxxxxxxxxx/providers/Microsoft.Authorization/policyDefinitions/regionpolicy; Scope=/subscriptions/xxxxxxxxxxxxxxxxxxx/resourceGroups/testgroup} PolicyAssignmentId : /subscriptions/xxxxxxxxxxxxxxx/resourceGroups/testgroup/providers/Microsoft.Authorization/policyAssignments/regionpolicy
これで適用できました。
では実際にAzure ADなアカウントでログインしてtestgroupに日本以外のリージョンを指定してリソースを作成してみましょう。
こんな感じで作ってみることにします。
はい、こんな感じで拒否されます。(状態がForbiddenのものが拒否されたものという感じです)
詳細見ると作ったポリシーによって拒否されたことが分かりますね。作成先リージョンを許可された西日本や東日本にすると成功します。
拒否されたログを見てみます。
> Get-AzureRmLog | where {$_.subStatus -eq "Forbidden"} Authorization : Scope : /subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/resourcegroups/testgroup/provider s/Microsoft.Network/publicIPAddresses/test2 Action : Microsoft.Network/publicIPAddresses/write Role : Subscription Admin Condition : Caller : xxxxxx@xxxxxxxxxxx.onmicrosoft.com CorrelationId : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Category : Administrative EventTimestamp : 2016/01/24 18:29:40 OperationName : Microsoft.Network/publicIPAddresses/write ResourceGroupName : testgroup ResourceId : Status : Failed SubscriptionId : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx SubStatus : Forbidden
こんな感じで誰が何に対して操作したのかわかりますね。詳細はポータル上で「監査ログ」を見てもいいかと思います。(コマンドでも見れますが)
ポリシーの削除は Remove-AzureRmPolicyAssignment で割り当て解除してから Remove-AzureRmPolicyDefinition しましょう。
まとめ
ポリシーをうまく活用して1つのサブスクリプション内で管理権限を渡したり、コスト管理をする際に役立てましょう。
See also:
- ポリシーを使用したリソース管理とアクセス制御 ※なお日本語はいろいろ怪しい模様
- リソース マネージャーの監査操作
ピンバック: Azure Update (2016.04.21) | ブチザッキ