Azure ポータルでカスタムロールを作る

つい先日、ユーザー、グループ、サービス プリンシパルに対して、Azure サブスクリプションおよび Azure リソース グループのスコープで割り当てることができる「Azure カスタムロール」が [Azure ポータル](https://portal.azure.com/)で作成できるようになったとアナウンスがありました。

Azure カスタムロールについては、以下のドキュメントを読んでおさらいしましょう。

- [参考：Azure リソースのロールベースのアクセス制御 (RBAC) の概要](https://docs.microsoft.com/ja-jp/azure/role-based-access-control/overview?WT.mc_id=AZ-MVP-5003113)
- [参考：Azure 組み込みロール](https://docs.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles?WT.mc_id=AZ-MVP-5003113)
- [参考：Azure リソースのカスタム ロール](https://docs.microsoft.com/ja-jp/azure/role-based-access-control/custom-roles?WT.mc_id=AZ-MVP-5003113)


# アップデートを確認

- [参考：Creating custom roles in the Azure portal is now in public preview](https://techcommunity.microsoft.com/t5/azure-active-directory-identity/creating-custom-roles-in-the-azure-portal-is-now-in-public/ba-p/1144697?WT.mc_id=AZ-MVP-5003113)
- [参考：Azure portal での Azure カスタム ロール作成の一般提供を開始](https://azure.microsoft.com/ja-jp/updates/azure-custom-roles-portal/?WT.mc_id=AZ-MVP-5003113)

アップデート情報のアナウンスには以下のように書かれています。

> Azure portal での Azure カスタム ロール作成の一般提供が開始されました。以前は、カスタム ロールの作成または編集は、コマンドラインまたは Azure Resource Manager API を通じて行う必要がありました。この新しいエクスペリエンスを使用すると、ロールベースのアクセス制御 (RBAC) ワークフローが容易になります。

たしかに、以前までカスタムロールを作るのはとても苦労しました...:disappointed_relieved:
ホントにカンタンに作れるか試してみます。


# やってみよう

Azure ポータルでカスタムロールを作成する手順は、以下のドキュメントを参考にします。
[参考：Azure portal を使用して Azure カスタム ロールを作成または更新する (プレビュー)](https://docs.microsoft.com/ja-jp/azure/role-based-access-control/custom-roles-portal?WT.mc_id=AZ-MVP-5003113)


# どんなアクセス制御を行うか

そういえば、2 年ほど前に PowerShell でカスタムロールを作る記事を投稿していました。
[参考：ユーザーへ Azure VM の起動、停止と接続のみを許可したい](https://qiita.com/tetsuya-ooooo/items/a53240bd6bc4251e1654)

今回も先の記事で取り上げた「仮想マシンの起動、停止、接続のみ許可」するロールを作ります。

![jazug_p6.png](https://qiita-image-store.s3.amazonaws.com/0/230264/ea6187b5-5d3f-5bf8-b633-fc3506ab09c5.png)


# カスタムロール作る！

Azure ポータルでカスタムロールを作るには、以下の 3 つの方法があります。
すべての方法を試してみます。
※それぞれにリンクを貼っておきます。

- [ロールを複製する](#%E3%81%9D%E3%81%AE-1-%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E8%A4%87%E8%A3%BD%E3%81%99%E3%82%8B%E3%81%A7%E4%BD%9C%E3%82%8B)
    - 既存のロールを複製し、そしてアクセス許可を変更する
- [最初から始める](#%E3%81%9D%E3%81%AE-2-%E6%9C%80%E5%88%9D%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E3%81%A7%E4%BD%9C%E3%82%8B)
    - カスタムロールを一から作る
- [JSON ファイルから始める](#%E3%81%9D%E3%81%AE-3-json-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E3%81%A7%E4%BD%9C%E3%82%8B)
    - ロールの定義ファイル (JSON) を作成し、それをアップロードする


## その 1 ：「ロールを複製する」で作る！

[Azure ポータル](https://portal.azure.com/)でカスタムロールを割り当てるサブスクリプション、リソースグループの [アクセス制御 (IAM)] を開きます。そして、[役割] タブを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/455bac84-0694-b44a-a256-368fb7cc7088.png)

そして、複製するロールを探します。今回は「DevTest Labs ユーザー」を使います。
検索したロールの右端にある [...] をクリックして、メニューから [複製] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/f721f5b3-9579-e792-6cc5-7d8f2884c8ba.png)

すると、[カスタムロールを作成する] に遷移します。


### [基本] タブ

[基本] タブで、基本情報を入力します。[ベースラインのアクセス許可] と [複製するロール] は入力済みとなっていると思います。
入力後、[次へ] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/df837b8d-3c23-3d18-0d15-5f471331a068.png)


### [アクセス許可] タブ

[アクセス許可] タブで、「アクセス許可する操作」と「除外する操作」を編集します。
※「アクセス許可する操作」の中から「除外する操作」も編集できますが、今回は使いませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/c399fbf7-a734-6ac1-e6b0-e452ca08bcc4.png)

既存のロールに「アクセス許可する操作」が存在しなかったので、[アクセス許可の追加] をクリックして操作を追加します。
[アクセス許可の追加] をクリックすると、[Azure リソース プロバイダー](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/azure-services-resource-providers?WT.mc_id=AZ-MVP-5003113)がタイル表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/8227c48b-12ea-fc65-7351-3fc03d529248.png)

ここから Azure リソース プロバイダーを絞り込んで対象のものを選択します。
※「Microsoft.Resources/subscriptions/resourceGroups/resources/read」みたいに操作まで指定して絞り込むこともできます。なお、この検索条件はその後の操作を選択するところに引き継がれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/65736bd4-c0e2-0582-fb3e-b4f5b1ec8cb9.png)

そして、「アクセス許可する操作」を選択して、[追加] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/e3e473d0-4b0b-f7f7-5abc-6918a54155c6.png)

編集後、[次へ] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/08e62257-c5a9-2f9a-9784-b21dfad38e26.png)


### [割り当て可能なスコープ] タブ

[割り当て可能なスコープ] タブで、カスタムロールが割り当て可能なサブスクリプション、またはリソースグループを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/0bc42c37-a2a7-19f1-8d9e-c4048ce77379.png)

複数のリソースグループを一度に追加することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/32e2cf26-d408-560c-dd35-24639e3f3ad7.png)

[次へ] をクリックします。


### [JSON] タブ

[JSON] タブには、JSON 形式のカスタム ロールが表示されます。JSON を直接編集するも JSON ファイルをダウンロードすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/d6178cbe-8425-7183-0b94-03aa3cc22837.png)

[次へ] をクリックします。


### [確認と作成] タブ

内容に問題なければ [作成] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/a98879fb-9afa-e1be-f650-6efd5ccb70f3.png)

[OK] をクリックして、出来上がるまでしばらく待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/76003f17-05a5-d9ed-a0fb-e5a2a97e8349.png)


### 出来上がり

はい。出来ました。ラクちんです。:heart_eyes:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ff49c018-d13a-80c4-fa7a-290c20ceb41a.png)


## その 2 ：「最初から始める」で作る！

[Azure ポータル](https://portal.azure.com/)でカスタムロールを割り当てるサブスクリプション、リソースグループの [アクセス制御 (IAM)] を開きます。そして、[追加] をクリックし、[カスタムロールの追加] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/3e52ffb0-78da-8f9d-167b-0752c6835ab5.png)

すると、[カスタムロールを作成する] に遷移します。


### [基本] タブ

[基本] タブで、基本情報を入力します。[ベースラインのアクセス許可] は入力済みとなっていると思います。
入力後、[次へ] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/40a4498d-a1df-3bd4-0732-28b029ed59de.png)


### [アクセス許可] タブ

[アクセス許可] タブで、「アクセス許可する操作」と「除外する操作」を編集します。

[その 1 ：「ロールを複製する」で作る！の [アクセス許可] タブ](#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%B1%E5%8F%AF-%E3%82%BF%E3%83%96)とは違い、許可および除外する操作は何も指定されていません。
一から編集します。
※「アクセス許可する操作」の中から「除外する操作」も編集できますが、今回は使いませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/2e4afba1-501d-9599-3e38-31c6517a6f71.png)

追加した内容は以下のとおりです。
なお、「Microsoft.Network/networkInterfaces/*/read」のようなワイルドカードが含む操作は [アクセス許可] タブでは選択できず、[JSON] タブで表示される JSON 形式のカスタム ロールを直接編集します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/840e6e72-f9b6-977f-1d64-ba150f586229.png)

[次へ] をクリックします。


### [割り当て可能なスコープ] タブ

[その 1 ：「ロールを複製する」で作る！の [割り当て可能なスコープ] タブ](#%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97-%E3%82%BF%E3%83%96)と同じなので、省略します。


### [JSON] タブ

[[アクセス許可] タブ](#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%B1%E5%8F%AF-%E3%82%BF%E3%83%96-1)で、追加できなかった操作をここで追加します。[編集] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/f758dcb4-f87a-3711-910b-d0adb27488d5.png)

編集が終わったら、[保存] をクリックして編集内容を保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ddddee7d-a07b-3feb-19ff-490e2425ab6a.png)


[次へ] をクリックします。


### [確認と作成] タブ

内容に問題なければ [作成] をクリックします。
その後、[OK] をクリックして、出来上がるまでしばらく待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/d4887e1b-5149-b992-27d6-f88ba4ff8b98.png)


### 出来上がり

はい。出来ました。操作を探し出すのはちょっとシンドイですね...:sweat_smile:
しかし、Azure ポータル上で操作を検索できるのはとても便利です。:heart_eyes:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/04f3dbca-32e9-f982-6a5b-67d99e069580.png)


## その 3 ：「JSON ファイルから始める」で作る！

はじめに、カスタムロールの定義ファイル (JSON) を作成します。
前述で紹介した記事で作っていたので、その [JSON ファイル](https://qiita.com/tetsuya-ooooo/items/a53240bd6bc4251e1654#1%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AD%E3%83%BC%E3%83%AB%E5%AE%9A%E7%BE%A9-json-%E3%82%92%E4%BD%9C%E6%88%90)を参考に以下のように作成しました。

``` AzureVMStartStopConnect.json
{
    "properties": {
        "roleName": "(3) Azure VM Start/Stop/Connect",
        "description": "Azure 仮想マシンの起動、停止、接続のみを許可するロール",
        "assignableScopes": [
            "/subscriptions/<サブスクリプション ID>"
        ],
        "permissions": [
            {
                "actions": [
                    "Microsoft.Compute/virtualMachines/read"
                   ,"Microsoft.Compute/virtualMachines/deallocate/action"
                   ,"Microsoft.Compute/virtualMachines/restart/action"
                   ,"Microsoft.Compute/virtualMachines/start/action"
                   ,"Microsoft.Network/networkInterfaces/*/read"
                   ,"Microsoft.Network/networkInterfaces/read"
                   ,"Microsoft.Resources/subscriptions/resourceGroups/read"
                   ,"Microsoft.Resources/subscriptions/resourceGroups/resources/read"
                   ,"Microsoft.ClassicCompute/virtualMachines/read"
                   ,"Microsoft.ClassicCompute/VirtualMachines/start/action"
                   ,"Microsoft.ClassicCompute/virtualMachines/shutdown/action"
                   ,"Microsoft.ClassicCompute/virtualMachines/restart/action"
                   ,"Microsoft.ClassicCompute/virtualMachines/downloadRemoteDesktopConnectionFile/action"
                   ,"Microsoft.ClassicCompute/virtualMachines/operationStatuses/read"
                ],
                "notActions": [],
                "dataActions": [],
                "notDataActions": []
            }
        ]
    }
}
```

次に、[Azure ポータル](https://portal.azure.com/)でカスタムロールを割り当てるサブスクリプション、リソースグループの [アクセス制御 (IAM)] を開きます。そして、[追加] をクリックし、[カスタムロールの追加] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/3e52ffb0-78da-8f9d-167b-0752c6835ab5.png)

すると、[カスタムロールを作成する] に遷移します。


### [基本] タブ

[基本] タブで、基本情報を入力します。[ベースラインのアクセス許可] で「JSON から始める」を選択し、先ほど作成した JSON ファイルをアップロードします。アップロードした内容に問題なければ、その JSON ファイルに記述した [カスタムロール名] と [説明] が反映されます。
入力後、[次へ] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/803120f2-7a2a-f4c4-ee6d-325f6595d2f8.png)


### [アクセス許可] タブ

[アクセス許可] タブにも JSON ファイルの内容が反映されています。
[次へ] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/43a1975c-5552-aae6-6415-944749345c38.png)


### [割り当て可能なスコープ] タブ

[割り当て可能なスコープ] タブにも JSON ファイルの内容が反映されています。
[次へ] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/f2aa4aa4-7773-b0bf-a030-f7581db4ee1e.png)


### [JSON] タブ

問題ないので、[次へ] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/079ec557-9560-879a-bc78-a8898813953d.png)


### [確認と作成] タブ

内容に問題なければ [作成] をクリックします。
その後、[OK] をクリックして、出来上がるまでしばらく待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/86e2ec7a-0b8f-d477-8335-a9fa007f2c9d.png)


### 出来上がり

はい。出来ました。事前にカスタムロールの定義ファイルが用意できていれば、とてもラクちんですね。:heart_eyes:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/93bfbb3a-ea24-3163-b123-0223b2b32a86.png)


# まとめ

カスタムロールを作成して、それをユーザーに割り当てる...という一連のオペレーションが Azure ポータルで完結できることをとても素晴らしいです。以前より圧倒的にラクちんです。:heart::heart::heart:
カスタムロールを作るのがめんどくさくて、組み込みロールで妥協することはなくなるはず！(といいですね)