このエントリは2022/11/24現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。
先日、あるお問い合わせをもらった。
とある管理グループ配下のすべてのAzure Subscriptionに対し、新規でAzureリソースを作成できなくしたい。カスタムロールを作ってRBACすることでもできそうではあるが、すでに運用中のSubscriptionなので、ロールの付け替えはできるだけ避けたい。何かよい方法はないだろうか?
どうやら、Subscription ownerであっても新規でリソースを作成できなくしたい、とのことらしい。問い合わせ主の言うように、カスタムロールを作って制限をかけることもできるが、全くの新規ではなく、すでに利用しているSubscriptionが存在していると、既存のSubscription ownerロールを付け替えるなど、非常に面倒な操作が必要になるのは確か。
解決策
リソース作成を許可しないAzure Policyを作成する。具体的にはdenyポリシーを使う。ご存知の方にとっては簡単過ぎる内容かもしれない。
拒否 / Deny
https://learn.microsoft.com/azure/governance/policy/concepts/effects#deny
方法
ビルトインポリシーで「許可されていないリソースの種類(英語では、 Not allowed resource types)」があるので、これを複製し、すべてのリソース作成を許可しないようなポリシーを新規作成する。

「許可されていないリソースの種類(英語では、 Not allowed resource types)」でポリシーを検索すると、上記のように1件ビルトインポリシーが出てくるので、このポリシーの右にある・・・をクリックし、【定義を複製する / Duplicate definition】を選択する。
オリジナルのポリシーでは、パラメータとして渡されたリソースの作成を許可しない構成になっているが、今回は全リソースの作成を許可したくないので、実のところパラメータは必要ない。そのため、以下のように書き換えてもかまわない。

policyRule
parameters('listOfResourceTypesNotAllowed')
は、Microsoft.*
に変更- effectの
parameters('effect')
は、deny
に変更
parameters
parameters.listOfResourceTypesNotAllowed
を削除。parameters.effect
を削除。
もちろん、parametersを残して、その中に記載してもかまわない。以下はパラメータを削除した例。
{
"mode": "All",
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"in": "Microsoft.*"
},
{
"value": "[field('type')]",
"exists": true
}
]
},
"then": {
"effect": "deny"
}
}
}
新規で作成したポリシーに名前を付けて、ポリシーを割り当てたら、作業は終了。
管理グループのアクセス権の確認
ポリシー自体は上記の設定で問題ないが、管理グループの設定変更ができてしまうとポリシーの適用を除外されてしまう。そのため、管理グループ配下のSubscription ownerに割り当てられているユーザーの中で、管理グループの変更権限を有しているものがあれば、その権限を剥奪しておく。
対策後
問い合わせ主からは、希望通りの挙動をした、との連絡をもらった。