Azure Recource Managerでのポリシー制御

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に日本以外のリージョンを指定してリソースを作成してみましょう。
image
こんな感じで作ってみることにします。
はい、こんな感じで拒否されます。(状態がForbiddenのものが拒否されたものという感じです)

image

詳細見ると作ったポリシーによって拒否されたことが分かりますね。作成先リージョンを許可された西日本や東日本にすると成功します。

拒否されたログを見てみます。

> 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

こんな感じで誰が何に対して操作したのかわかりますね。詳細はポータル上で「監査ログ」を見てもいいかと思います。(コマンドでも見れますが)
image

ポリシーの削除は Remove-AzureRmPolicyAssignment で割り当て解除してから Remove-AzureRmPolicyDefinition しましょう。

まとめ

ポリシーをうまく活用して1つのサブスクリプション内で管理権限を渡したり、コスト管理をする際に役立てましょう。

See also:

Azure Recource Managerでのポリシー制御」への1件のフィードバック

  1. ピンバック: Azure Update (2016.04.21) | ブチザッキ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中