【Azure】権限管理の仕組み

2022年から本格的にAzureを触るようになりました。AWSでもそうでしたが、クラウドサービスでいつも最初につまづくのは権限管理です。
この記事では、権限管理について簡単に説明します。また、具体的な設定方法例も載せます。

# 管理スコープ

Azure には、権限を管理するときの概念として **管理スコープ** があります。
管理スコープには4つのレベルがあります。

- 管理グループ
- サブスクリプション
- リソース グループ
- リソース

> 階層内のいずれかのレベルで任意のアクセスまたはポリシーを適用すると、下位レベルに伝達されます。 リソース所有者またはサブスクリプション所有者は、継承されたポリシーを変更できません。 この制限によりガバナンスを向上させることができます。

引用元 | [Azure 管理グループ](https://docs.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/azure-best-practices/organize-subscriptions#azure-management-groups)

言葉の補足をすると、**アクセスまたはポリシー** は権限のことです。**下位レベルに伝達 = 継承** です。

階層構造のイメージは以下です。
![Azureの権限-階層構造](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/b7f3a3ba-588a-c1f1-3966-313dc6f42ea4.png)
例として、上記の図のような構成の場合に、DB へのアクセスを許可するポリシーを適用したときにどうなるかを説明します。

### 管理グループ A でポリシーを適用した場合

適用したポリシーは、管理グループ A 配下の全てで有効となります。
管理グループ A -> サブスクリプション A -> リソースグループ A,B の関係性なので、DB X,Y のどちらにもアクセスできます。

![Azureの権限-管理グループAでポリシーを適用した場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/cfe602c4-da52-a8c9-e981-f3a14d84eacd.png)

### サブスクリプション A でポリシーを適用した場合

適用したポリシーは、サブスクリプション A 配下の全てで有効となります。
管理グループの例と同じく、サブスクリプション A -> リソースグループ A,B の関係性なので、DB X,Y のどちらにもアクセスできます。

![Azureの権限-サブスクリプションAでポリシーを適用した場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/53984043-b331-6ff0-dc21-1ae30e2356b0.png)

### リソースグループ A でポリシーを適用した場合

適用したポリシーは、リソースグループ A 配下の全てで有効となります。
管理グループの例と同じく、リソースグループ A -> DB X の関係性なので、DB X のみアクセスできます。

![azure-scope-levels-rg.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/1f469fd3-02aa-500d-198d-d61a91476072.png)

上記の例は許可でしたが、拒否も同様です。
また実際には、管理グループだけでも何層もの階層構造になっている場合があります。
その場合も、下位レベルに継承されます。
![Diagram of a sample management group hierarchy.](https://docs.microsoft.com/ja-jp/azure/governance/management-groups/media/tree.png)
引用元 | [管理グループとサブスクリプションの階層](https://docs.microsoft.com/ja-jp/azure/governance/management-groups/overview#hierarchy-of-management-groups-and-subscriptions)

# 設定方法

今回は、一開発者がよく使うリソースグループに対しての設定を例に説明します。
管理グループやサブスクリプションへの設定も、リソースグループを置き換えて考えて頂ければほぼ同じです。

## リソースグループとは

リソースグループは、管理スコープの上から 3 番目に位置します。
簡単にいうと、リソースをまとめる論理グループです。個々のリソースは必ず1つのリソースグループに所属しています。リソース作成時に必須で指定します。

## 手順

権限を設定する際に決めることは以下です。

- どのリソースグループに対して
- どのようなロール[^1](権限)を
- 誰に

[^1]: ※ロールはアクセス権限の管理単位です。Azureではこの **ロール** という単位で権限を設定します。
今回だとAppServiceの全権限を設定したいので、あらかじめAppServiceに関連する権限をロールとしてまとめておけば、それを選択するだけで設定できます。
ロールの詳細を確認したい場合は[こちら](https://docs.microsoft.com/ja-jp/azure/role-based-access-control/role-definitions-list)をご覧ください。

実際の設定手順を見てみましょう。
設定手順は、Azure Portalで説明します。


リソースグループの画面を開き、対象の **リソースグループ** を選択します。
※どのリソースグループに対して
![azure_gui_リソースグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/dc6b7751-8570-5be9-8f3f-cc78a584fec4.png)

左のナビゲーションの **アクセス制御 (IAM)** を開き、 **+追加** > **ロールの割り当ての追加** を選択します。
![azure_gui_リソースグループ_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/b7e8d30e-41cc-6169-8693-8960910e8041.png)

割り当てるロールを選択して、 **次へ** を押下します。
※どのようなロール(権限)を
![azure_gui_ロールの割り当て_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/65c44c2e-b186-1c5e-8aec-670b189b0035.png)

割り当て先のメンバーを追加して、 **次へ** を押下します。
※誰に
![azure_gui_ロールの割り当て_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/7a72f572-1e68-aa83-fa3b-add5c555e8ff.png)

割り当てるロールと割り当て先のメンバーを確認して **レビューと割り当て** を押下します。
![azure_gui_ロールの割り当て_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/07a57e8c-c7c9-d4c7-7b96-1a141b8e2ccf.png)

リソースグループの画面で、「このリソース」として割り当て出来ていればOKです。
![azure_gui_リソースグループ_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166959/33026ce9-6aa4-e796-a7b3-f24b89d86bf3.png)

# おわりに

必要最低限でAzureの権限管理を説明しました。
権限管理は面倒な作業ですが、大事なことなので適切に設定出来るように理解しておきたいですね。

# 参考

- https://docs.microsoft.com/ja-jp/azure/governance/management-groups/overview#hierarchy-of-management-groups-and-subscriptions